sql >> Database teknologi >  >> RDS >> Mysql

Er disse to funktioner overkill til desinficering?

For at være ærlig tror jeg, at forfatteren af ​​disse funktioner enten ikke har nogen idé om, hvad XSS- og SQL-injektioner er, eller hvad præcis den brugte funktion gør.

Bare for at nævne to særheder:

Desuden:Generelt er funktioner, der beskytter mod XSS, ikke egnede til at beskytte mod SQL-injektioner og omvendt. Fordi hvert sprog og kontekst har sine egne specielle karakterer, der skal tages hånd om.

Mit råd er at lære hvorfor og hvordan kodeinjektion er mulig, og hvordan man beskytter sig mod det. Lær de sprog, du arbejder med, især specialtegnene, og hvordan du undslipper disse.

Rediger Her er nogle (sandsynligvis mærkelige) eksempler:Forestil dig, at du tillader dine brugere at indtaste en værdi, der skal bruges som et stisegment i en URI, som du bruger i en eller anden JavaScript-kode i et onclick attributværdi. Så sprogkonteksten ser således ud:

  • HTML-attributværdi
    • JavaScript-streng
      • URI-stisegment

Og for at gøre det sjovere:Du gemmer denne inputværdi i en database.

For nu at gemme denne inputværdi korrekt i din database, skal du blot bruge en korrekt kodning til den kontekst, du er ved at indsætte værdien i dit databasesprog (dvs. SQL); resten er ligegyldigt (endnu). Da du vil indsætte det i en SQL-strengerklæring, er de kontekstuelle specialtegn de tegn, der giver dig mulighed for at ændre den kontekst. Hvad angår strengerklæringer, er disse tegn (især) " , ' , og \ karakterer, der skal undslippes. Men som allerede nævnt gør forberedte udsagn alt det arbejde for dig, så brug dem.

Nu hvor du har værdien i din database, vil vi gerne udlæse dem korrekt. Her går vi fra den inderste til den yderste kontekst og anvender den korrekte kodning i hver sammenhæng:

  • For URI-stisegmentet kontekst, vi skal undslippe (i det mindste) alle de karakterer, der lader os ændre den kontekst; i dette tilfælde / (forlad det aktuelle stisegment), ? og # (begge forlader URI-stikontekst). Vi kan bruge rawurlencode for dette.
  • For JavaScript-strengen kontekst skal vi tage os af " , ' , og \ . Vi kan bruge json_encode til dette (hvis tilgængeligt).
  • For HTML-attributværdien vi skal tage os af & , " , ' , og < . Vi kan bruge htmlspecialchars for dette.

Nu er alt samlet:

'… onclick="'.htmlspecialchars('window.open("http://example.com/'.json_encode(rawurlencode($row['user-input'])).'")').'" …'

Nu hvis $row['bruger-input'] er "bar/baz" outputtet er:

… onclick="window.open(&quot;http://example.com/&quot;%22bar%2Fbaz%22&quot;&quot;)" …

Men at bruge alle disse funktioner i disse sammenhænge er ikke overdrevent. For selvom konteksterne kan have lignende specialtegn, har de forskellige escape-sekvenser. URI har den såkaldte procentkodning, JavaScript har escape-sekvenser som \" og HTML har tegnreferencer som " . Og ikke at bruge kun én af disse funktioner vil tillade at bryde konteksten.



  1. I en join, hvordan man præfikser alle kolonnenavne med den tabel, den kom fra

  2. Sådan nærmer du dig en Got minus en fra en læseopkaldsfejl, når du opretter forbindelse til en Amazon RDS Oracle-instans

  3. Ønsker at begrænse værdien af ​​et MySQL-felt til et specifikt område (decimalværdier)

  4. Kan ikke kompilere GI 12.1.0.2 og segmenteringsfejl