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

Rengør effektivt brugerindtastet tekst

Sikkerhed er et interessant koncept og tiltrækker mange mennesker til det. Desværre er det et komplekst emne, og selv de professionelle tager fejl. Jeg har fundet sikkerhedshuller i Google (CSRF), Facebook (mere CSRF), adskillige store onlineforhandlere (hovedsageligt SQL-injection / XSS) samt tusindvis af mindre websteder, både virksomheder og personlige.

Disse er mine anbefalinger:

1) Brug parametriserede forespørgsler
Parameteriserede forespørgsler tvinger de værdier, der sendes til forespørgslen, til at blive behandlet som separate data, så inputværdierne ikke kan parses som SQL-kode af DBMS. Mange mennesker vil anbefale, at du undslipper dine strenge ved hjælp af mysql_real_escape_string() , men i modsætning til populær tro er det ikke en samlet løsning til SQL-injektion. Tag denne forespørgsel for eksempel:

SELECT * FROM users WHERE userID = $_GET['userid']

Hvis $_GET['userid'] er indstillet til 1 OR 1=1 , der er ingen specialtegn, og det vil ikke blive filtreret. Dette resulterer i, at alle rækker returneres. Eller endnu værre, hvad nu hvis den er sat til 1 OR is_admin = 1 ?

Parametriserede forespørgsler forhindrer denne form for injektion i at forekomme.

2) Valider dine input
Parameteriserede forespørgsler er gode, men nogle gange kan uventede værdier forårsage problemer med din kode. Sørg for, at du validerer, at de er inden for rækkevidde, og at de ikke vil tillade den nuværende bruger at ændre noget, de ikke burde være i stand til.

For eksempel kan du have en formular til ændring af adgangskode, der sender en POST-anmodning til et script, der ændrer deres adgangskode. Hvis du placerer deres bruger-id som en skjult variabel i formularen, kan de ændre det. Sender id=123 i stedet for id=321 kan betyde, at de ændrer en andens adgangskode. Sørg for, at ALT er valideret korrekt, hvad angår type, rækkevidde og adgang.

3) Brug htmlspecialchars for at undgå vist brugerinput
Lad os sige, at din bruger indtaster deres "om mig" som sådan:
</div><script>document.alert('hello!');</script><div>
Problemet med dette er, at dit output vil indeholde markeringer, som brugeren har indtastet. At prøve at filtrere dette selv med sortlister er bare en dårlig idé. Brug htmlspecialchars at filtrere strengene fra, så HTML-tags konverteres til HTML-enheder.

4) Brug ikke $_REQUEST
Cross-site request forgery (CSRF)-angreb virker ved at få brugeren til at klikke på et link eller besøge en URL, der repræsenterer et script, der udfører en handling på et websted, som de er logget ind på. $_REQUEST variabel er en kombination af $_GET , $_POST og $_COOKIE , hvilket betyder, at du ikke kan kende forskel på en variabel, der blev sendt i en POST-anmodning (dvs. gennem en input tag i din formular) eller en variabel, der blev angivet i din URL som en del af en GET (f.eks. page.php?id=1 ).

Lad os sige, at brugeren vil sende en privat besked til nogen. De sender muligvis en POST-anmodning til sendmessage.php , med to , subject og message som parametre. Lad os nu forestille os, at nogen sender en GET-anmodning i stedet for:

sendmessage.php?to=someone&subject=SPAM&message=VIAGRA!

Hvis du bruger $_POST , vil du ikke se nogen af ​​disse parametre, da de er indstillet i $_GET i stedet. Din kode vil ikke se $_POST['to'] eller nogen af ​​de andre variabler, så den sender ikke beskeden. Men hvis du bruger $_REQUEST , $_GET og $_POST hænge sammen, så en angriber kan indstille disse parametre som en del af URL'en. Når brugeren besøger denne URL, sender de utilsigtet beskeden. Den virkelig bekymrende del er, at brugeren ikke behøver at gøre noget. Hvis angriberen opretter en ondsindet side, kan den indeholde en iframe der peger på URL'en. Eksempel:

<iframe src="http://yoursite.com/sendmessage.php?to=someone&subject=SPAM&message=VIAGRA!">
</iframe>

Dette resulterer i, at brugeren sender beskeder til folk uden nogensinde at opdage, at de gjorde noget. Af denne grund bør du undgå $_REQUEST og brug $_POST og $_GET i stedet.

5) Behandl alt, hvad du får, som mistænkeligt (eller endda ondsindet)
Du aner ikke, hvad brugeren sender dig. Det kunne være legitimt. Det kan være et angreb. Stol aldrig på noget, en bruger har sendt dig. Konverter til korrekte typer, valider input, brug hvidlister til at filtrere, hvor det er nødvendigt (undgå sortlister). Dette inkluderer alt, der sendes via $_GET , $_POST , $_COOKIE og $_FILES .



Hvis du følger disse retningslinjer, har du en rimelig position med hensyn til sikkerhed.



  1. SQLite ÆNDRINGSTABEL

  2. hvad er materialiserede synspunkter i oracle?

  3. MySQL Slow ved tilmelding. Enhver måde at fremskynde

  4. PHP - henter forberedt stmt ind i klassen:Fatal Error-klassen blev ikke fundet