sql >> Databasteknik >  >> RDS >> Mysql

Är dessa två funktioner överdrivna för sanering?

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:

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

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ända rawurlencode för detta.
  • För JavaScript-strängen sammanhang måste vi ta hand om " , ' och \ . Vi kan använda json_encode för detta (om tillgängligt).
  • För HTML-attributvärdet vi måste ta hand om & , " , ' och < . Vi kan använda htmlspecialchars 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(&quot;http://example.com/&quot;%22bar%2Fbaz%22&quot;&quot;)" …

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.



  1. Hur visar jag ett MySQL-fel i PHP för en lång fråga som beror på användarens input?

  2. Skapa PostgreSQL-databas i farten med Hibernate även om DB inte finns

  3. Hur POSITION() fungerar i PostgreSQL

  4. DB design:medlemmar tabell separat eller alla i en tabell?