För att vara ärlig tror jag att författaren till dessa funktioner antingen inte har någon aning om vad XSS- och SQL-injektioner är eller vad exakt den använda funktionen gör.
Bara för att nämna två konstigheter:
- Använda
stripslashes
eftermysql_real_escape_string
tar bort snedstreck som lades till avmysql_real_escape_string
. htmlentities
ersätter chatakterna<
och> som används i
strip_tags
för att identifiera taggar.
Dessutom:Generellt sett är funktioner som skyddar mot XSS inte lämpliga att skydda mot SQL-injektioner och vice versa. Eftersom varje språk och sammanhang har sina egna specialtecken som måste tas om hand.
Mitt råd är att lära dig varför och hur kodinjektion är möjlig och hur du skyddar dig mot det. Lär dig språken du arbetar med, särskilt specialtecken och hur du undkommer dessa.
Redigera Här är några (förmodligen konstiga) exempel:Föreställ dig att du tillåter dina användare att mata in något värde som ska användas som ett sökvägssegment i en URI som du använder i någon JavaScript-kod i en onclick
attributvärde. Så språkkontexten ser ut så här:
- HTML-attributvärde
- JavaScript-sträng
- URI-sökvägssegment
- JavaScript-sträng
Och för att göra det roligare:Du lagrar detta indatavärde i en databas.
För att nu lagra detta indatavärde korrekt i din databas behöver du bara använda en korrekt kodning för sammanhanget du ska infoga det värdet i ditt databasspråk (dvs SQL); resten spelar ingen roll (ännu). Eftersom du vill infoga den i en SQL-strängdeklaration, är de kontextuella specialtecknen de tecken som låter dig ändra det sammanhanget. När det gäller strängdeklarationer är dessa tecken (särskilt) "
, '
och \
karaktärer som måste undkomma. Men som redan nämnts, förberedda uttalanden gör allt som fungerar för dig, så använd dem.
Nu när du har värdet i din databas vill vi mata ut dem ordentligt. Här går vi från det innersta till det yttersta sammanhanget och tillämpar rätt kodning i varje sammanhang:
- För URI-sökvägssegmentet sammanhang måste vi fly (åtminstone) alla de karaktärer som låter oss ändra det sammanhanget; i det här fallet
/
(lämna aktuellt sökvägssegment),?
och#
(båda lämnar URI-sökvägssammanhang). Vi kan användarawurlencode
för detta. - För JavaScript-strängen sammanhang måste vi ta hand om
"
,'
och\
. Vi kan användajson_encode
för detta (om tillgängligt). - För HTML-attributvärdet vi måste ta hand om
&
,"
,'
och<
. Vi kan användahtmlspecialchars
för detta.
Nu är allt tillsammans:
'… onclick="'.htmlspecialchars('window.open("http://example.com/'.json_encode(rawurlencode($row['user-input'])).'")').'" …'
Nu om $row['användarinmatning']
är "bar/baz"
utgången är:
… onclick="window.open("http://example.com/"%22bar%2Fbaz%22"")" …
Men att använda alla dessa funktioner i dessa sammanhang är ingen överdrift. För även om sammanhangen kan ha liknande specialtecken så har de olika escape-sekvenser. URI har den så kallade procentkodningen, JavaScript har escape-sekvenser som \"
och HTML har teckenreferenser som "
. Och att inte använda bara en av dessa funktioner gör det möjligt att bryta sammanhanget.