Ja, MySQL kan lagra alla typer av text tekniskt säkert. Vilket innebär att MySQL sparar texten som den är och returnerar den igen utan att förlora någon data.
Mysql skiljer sig inte mellan innehållet i texten, så det gör ingen skillnad om det är HTML, CSS, JS-kod eller dina vänners senaste e-postmeddelande.
Men om du matar ut texten senare bör du se till att det inte finns någon oönskad kodinjektion efter att du har hämtat data från mysql. Men det är faktiskt inte relaterat till MySQL.
För att göra dig sql säkrare, skicka databashandtaget till code>mysql_real_escape_string eller ännu bättre använd MySQLi och/eller PDO och förberedda uttalanden.
Din kod
Din kod ser ut som att du försöker mycket för att förhindra något, men i slutändan visar den sig ganska värdelös:
function filter($data) {
$data = trim(htmlentities(strip_tags($data)));
if (get_magic_quotes_gpc())
$data = stripslashes($data);
$data= strip_tags($data);
$data = mysql_real_escape_string($data);
return $data;}
Normalisera data innan du bearbetar den
Först och främst bör du ändra positionen för checken för get_magic_quotes_gpc
för att normalisera data som funktionen arbetar med. Det skulle vara ännu bättre om din applikation inte skulle förlita sig på den utan bara nekar att fungera om det alternativet är aktiverat - se den här viktiga informationen om det här
om du bryr dig om säkerhet.
Men för att din kod ska vara säker, låt oss först normalisera ingångsvärdet till funktionen innan vi bearbetar den vidare. Detta görs genom att flytta bocken till toppen av funktionen.
function filter($data)
{
// normalize $data because of get_magic_quotes_gpc
$dataNeedsStripSlashes = get_magic_quotes_gpc();
if ($dataNeedsStripSlashes)
{
$data = stripslashes($data);
}
// normalize $data because of whitespace on beginning and end
$data = trim($data);
// strip tags
$data = strip_tags($data);
// replace characters with their HTML entitites
$data = htmlentities($data);
// mysql escape string
$data = mysql_real_escape_string($data);
return $data;
}
I denna modifierade funktion har de magiska citaten (som du inte bör använda) flyttats till toppen av den. Detta säkerställer att oavsett om alternativet är på eller av, kommer data alltid att behandlas på samma sätt. Din funktion gjorde inte det, den skulle ha skapat olika resultat för samma data som skickades. Så detta har åtgärdats.
Fler problem med din funktion
Även funktionen ser bättre ut nu, den har fortfarande många problem. Det är till exempel oklart vad funktionen faktiskt gör. Den gör många saker samtidigt och några av dem är motsägelsefulla:
- Den tar bort HTML-taggar vilket är ett tecken på att
$data
bör inte innehålla HTML - Men sedan konverterar du texten i
$data
att faktiskt innehålla HTML-enheter.
Så vad ska uppgifterna vara? HTML eller inte? Det introducerar inte mer säkerhet om saker och ting blir otydliga eftersom det kommer att gynna att fel kommer in i ditt program och i slutändan till och med passerar dina säkerhetsåtgärder.
Så du bör bara slänga koden och överväga följande:
- Om indata till din applikation är ogiltig, filtrera inte den. Förhindra istället ytterligare användning av ogiltig inmatning. Så du behöver en funktion för att validera indata innan du använder den.
- Ändra inte data bara för att du tror detta kan göra något säkrare. Ändra och koda istället data där det behövs och är lämpligt.
- Få din ansökan att fungera endast med magiska citattecken av. Att förlita sig på den här funktionen är mycket avskräckt. Och då finns det ingen anledning att kolla efter det i din kod.
- För att lagra något säkert i databasen, undvik data innan du använder den endast i frågan. Inte på någon annan plats i din ansökan. Använd förberedda uttalanden för det.
- Du behöver inte bråka om data innan du lägger in den i databasen om den är giltig. Men du måste koda den korrekt när den matas ut till webbsidan . Och bara där vet en applikation i vilken kodning detta måste vara. Det vet du inte när du lägger in data i databasen.
Så om du vill göra din kod säkrare handlar det inte om att kasta en massa funktioner på vissa data eftersom du tror att de är säkerhetsrelaterade. Genom att göra det gör du inte din programvara säkrare utan mindre säker.
- Lita aldrig på användardata.
- Se till att data är i det format du behöver före bearbetning .
- Använd rätt verktyg för jobbet på rätt plats.
- Använd aldrig verktyg för att gissa. Skaffa kunskap istället, som inte bara lönar sig säkerhetsmässigt.