sql >> Databasteknik >  >> RDS >> Mysql

Hur man förhindrar automatiserade AJAX-attacker

Det låter som att din invändning mot att låta sessionen vara öppen så länge webbläsaren är öppen är frågan om automatiserade attacker. Tyvärr avskräcker uppdatering av token vid varje sidladdning bara de mest amatörangripare.

För det första antar jag att vi pratar om attacker specifikt riktade mot din webbplats. (Om vi ​​pratar om bots som bara strövar runt och skickar in olika formulär, inte bara skulle detta inte stoppa dem, utan det finns mycket bättre och enklare sätt att göra det.) Om så är fallet, och jag riktar in mig på min webbplats, här är vad min bot skulle göra:

  1. Ladda in formulärsidan.
  2. Läs token på formulärsidan.
  3. Skicka en automatisk begäran med den token.
  4. Gå till steg 1.

(Eller, om jag undersökte ditt system tillräckligt, skulle jag inse att om jag inkluderade rubriken "detta är AJAX" på varje begäran, skulle jag kunna behålla en token för alltid. Eller så skulle jag inse att token är mitt sessions-ID, och skicka mitt eget PHPSESSID cookie.)

Den här metoden att ändra token vid varje sidladdning skulle göra absolut ingenting för att stoppa någon som faktiskt ville att attackera dig så illa. Därför, eftersom token inte har någon effekt på automatisering, fokusera på dess effekter på CSRF.

Ur perspektivet att blockera CSRF verkar skapa en token och underhålla den tills användaren stänger webbläsaren att uppnå alla mål. Enkla CSRF-attacker besegras, och användaren kan öppna flera flikar.

TL;DR:Att uppdatera token en gång på varje begäran ökar inte säkerheten. Gå efter användbarhet och gör en token per session.

I alla fall! Om du är extremt orolig för dubbletter av formulärinlämningar, av misstag eller på annat sätt, kan det här problemet fortfarande enkelt lösas. Svaret är enkelt:använd två tokens för två olika jobb.

Den första token kommer att förbli densamma tills webbläsarsessionen avslutas. Denna token finns för att förhindra CSRF-attacker. Alla inlämningar från denna användare med denna token kommer att accepteras.

Den andra token kommer att genereras unikt för varje formulär som laddas och kommer att lagras i en lista i användarens sessionsdata för öppna formulärtokens. Denna token är unik och ogiltig när den används. Bidrag från denna användare med denna token kommer att accepteras en gång och endast en gång.

På det här sättet, om jag öppnar en flik till formulär A och en flik till formulär B, har var och en min personliga anti-CSRF-token (CSRF tas om hand) och min engångsformulärtoken (blankettåterinlämning tas om hand). Båda problemen är lösta utan någon negativ effekt på användarupplevelsen.

Naturligtvis kan du bestämma dig för att det är för mycket att implementera för en så enkel funktion. Jag tror att det är det i alla fall. Oavsett så finns det en solid lösning om du vill ha den.



  1. MySQL fulltextsökning efter ord med tre eller färre bokstäver

  2. Mysql fyra byte kinesiska tecken stöder

  3. alla radvärden i en kolumn

  4. Hur använder man uuid med postgresql gist index typ?