sql >> Database >  >> RDS >> Mysql

Hoe geautomatiseerde AJAX-aanvallen te voorkomen

Het klinkt alsof uw bezwaar om de sessie open te laten blijven zolang de browser open is, het probleem is van geautomatiseerde aanvallen. Helaas schrikt het vernieuwen van de token op elke pagina die wordt geladen alleen de meeste amateur-aanvallers af.

Ten eerste neem ik aan dat we het hebben over aanvallen die specifiek op uw site zijn gericht. (Als we het hebben over de bots die gewoon rondzwerven en verschillende formulieren indienen, zou dit hen niet alleen tegenhouden, maar er zijn veel betere en gemakkelijkere manieren om dit te doen.) Als dat het geval is, en ik richt me op mijn site, dit is wat mijn bot zou doen:

  1. Laad formulierpagina.
  2. Lees token op formulierpagina.
  3. Dien automatisch een verzoek in met dat token.
  4. Ga naar stap 1.

(Of, als ik je systeem voldoende zou onderzoeken, zou ik beseffen dat als ik de "this is AJAX"-header op elk verzoek zou opnemen, ik één token voor altijd zou kunnen behouden. Of ik zou beseffen dat het token mijn sessie-ID is, en stuur mijn eigen PHPSESSID cookie.)

Deze methode om het token te veranderen bij elke pagina die wordt geladen, zou absoluut niets doen om iemand te stoppen die eigenlijk wilde om je zo hard aan te vallen. Daarom, aangezien het token geen effect heeft op automatisering, focus je op de effecten ervan op CSRF.

Vanuit het perspectief van het blokkeren van CSRF, het creëren van één token en het onderhouden ervan totdat de gebruiker de browser sluit, lijkt alle doelen te bereiken. Eenvoudige CSRF-aanvallen worden verslagen en de gebruiker kan meerdere tabbladen openen.

TL;DR:het één keer vernieuwen van het token bij elk verzoek verhoogt de beveiliging niet. Ga voor bruikbaarheid en doe één token per sessie.

Echter! Als u zich grote zorgen maakt over dubbele formulierinzendingen, per ongeluk of anderszins, kan dit probleem nog steeds eenvoudig worden opgelost. Het antwoord is simpel:gebruik twee tokens voor twee verschillende taken.

Het eerste token blijft hetzelfde totdat de browsersessie eindigt. Dit token bestaat om CSRF-aanvallen te voorkomen. Elke inzending van deze gebruiker met deze token wordt geaccepteerd.

Het tweede token wordt uniek gegenereerd voor elk geladen formulier en wordt opgeslagen in een lijst in de gebruikerssessiegegevens van open formuliertokens. Dit token is uniek en wordt ongeldig zodra het wordt gebruikt. Inzendingen van deze gebruiker met deze token worden eenmalig geaccepteerd.

Op deze manier, als ik een tabblad open voor Formulier A en een tabblad voor Formulier B, heeft elk mijn persoonlijke anti-CSRF-token (waarvoor CSRF wordt gezorgd) en mijn eenmalige formuliertoken (herindiening van formulieren geregeld). Beide problemen zijn opgelost zonder enig nadelig effect op de gebruikerservaring.

Natuurlijk kun je besluiten dat dat te veel is om te implementeren voor zo'n eenvoudige functie. Ik denk van wel, in ieder geval. Hoe dan ook, er bestaat een solide oplossing als je die wilt.



  1. Proberen een zoeklijst te maken met een tabelwaarde en getallen eronder

  2. Versleutelde gegevens opslaan in Postgres

  3. Een MySQL-database maken in cPanel

  4. Recursieve mysql selecteren?