Cum de a preveni atacurile de tip Forgery (CSRF) de la Cross Site în PHP
Un atac de cerere fals cross-site (CSRF) este un tip de vulnerabilități de aplicații web în cazul în care victima se execută din greșeală un script în browser-ul care utilizează sesiunea de conectare la un anumit site. Atacurile CSRF pot fi efectuate pe cereri GET sau POST. Acest articol vă va arăta cum să prevină atacurile CSRF pe aplicația Web.
paşi
Metoda 1
Descrierea metodelorVom folosi două metode pentru a evita atacurile CSRF pe cererile dvs. GET și POST.
Primul este să includă un jeton aleator cu fiecare cerere, care este un șir unic generat pentru fiecare sesiune. Generăm tokenul și apoi îl includem în fiecare modul ca o intrare ascunsă. Sistemul verifică dacă modulul este valid prin compararea tokenului cu cel stocat în variabila de sesiune a utilizatorilor. Aceasta înseamnă că un atacator, pentru a genera o solicitare, trebuie să cunoască valoarea simbolului.
A doua metodă este să utilizați numele aleatoriu pentru fiecare câmp din formular. Valoarea numelui aleatoriu pentru fiecare câmp este stocată într-o variabilă de sesiune și, după ce forma a fost prezentată, sistemul generează o nouă valoare aleatorie. Aceasta înseamnă că pentru ca un atac să funcționeze, atacatorul ar trebui să ghicească aceste nume aleatoare ale modulelor.
De exemplu, o solicitare care a apărut o dată astfel:
acum va arata astfel:
Metoda 2
Creați fișierul csrf.class.phpAcesta este fișierul principal care conține toate funcțiile care vor fi utilizate pentru a preveni atacurile CSRF.
phpclass csrf {
Această funcție ia ID-ul token din sesiunea de utilizator, dacă nu a fost deja creată, după care generează un jeton aleator.
funcția publică get_token_id () {if (isset ($ _ SESSION [ `TOKEN_ID`])) {return $ _ SESSION [ `TOKEN_ID`] -} else {$ TOKEN_ID = $ this->aleatoare (10) - $ _ SESSION [`token_id`] = $ token_id-return $ token_id-}}
Această funcție primește valoarea tokenului, dacă nu a fost deja creată, după care generează una.
funcția publică obține jeton () {if (isset ($ _ SESSION [ `Token_value`])) {return $ _ SESSION [ `Token_value`] -} else {jeton = hash ( `SHA256` $, $ this->aleatoriu (500)) - $ _ SESSION [`token_value`] = $ token-return $ token-}}
Această funcție este utilizată pentru a verifica dacă id-ul token și valoarea token sunt valide. Aceasta face acest lucru verificând valorile solicitării GET sau POST cu valorile stocate în variabila de sesiune a utilizatorului.
funcția publică check_valid (metoda $) {if ($ method == `post` || $ method == `get`) {$ post = $ _POST- $ get = $ _GET-if $ this->get_token_id ()]) && ($ {} $ Metoda [$ this->get_token_id ()] == $ this->get_token ())) {return true-} altceva {return false-}} altceva {return false-}}
Aceasta este a doua apărare menționată în acest articol împotriva atacului CSRF. Această funcție generează nume aleatoare pentru câmpurile de formular.
form_names funcției publice ($ nume, $ regenerate) {valori $ = array () - foreach ($ nume ca $ n) {if ($ regenera == true) {unset ($ _ SESSION [$ n]) -} $ s = isset ($ _ SESIUNE [$ n])? $ _SESSION [$ n]: $ acest->aleatoriu (10) - $ _ SESIUNE [$ n] = $ s- $ valori [$ n] = $ s-} retur $ valori-}
Această funcție generează un șir aleator folosind fișierul Linux Random pentru a crește entropia.
private function aleatoare ($ len) {if (function_exists ( `openssl_random_pseudo_bytes`)) {$ byteLen = intval (($ len / 2) + 1) - $ returna = substr (BIN2HEX (openssl_random_pseudo_bytes ($ byteLen)), 0, $ len) -} elseif (@is_readable ( `/ dev / urandom`)) {$ f = fopen ( `/ dev / urandom`, `r`) - $ urandom = fread ($ f, $ len) -fclose ($ f) - întoarcerea = `` $ -} if (gol (întoarcere $)) {for (i = $ $ s 0-<$ Len - $ i ++) {if) {if ($ i% 2 == 0) {mt_srand (timp ()% 2147 + 1,000,000 * (dublu) microtime () * 1,000,000) (isset ($ urandom!) - } $ rand = 48 + mt_rand ()% 64-} else {$ rand = 48 + ord ($ urandom [$ i])% 64-} if ($ rand57) $ rand + = 7-if ($ rand90) $ rand + ($ Rand == 123) $ rand = 52-if ($ rand == 124) $ rand = 53- $ retur. = Chr ($ rand) -}} retur $ return-}
Aceasta va închide clasa csrf.
}
Metoda 3
Protejați paginile cu csrf.class.phpAcești pași vă vor arăta cum să utilizați clasa CSRF pentru a preveni atacurile CSRF.
Următorul cod demonstrează modul de implementare a clasei csrf pe un formular.
Phpsession_start () - include `csrf.class.php` - $ csrf csrf = new () - // Generarea Indicativul Id-ul de validare $ TOKEN_ID = $ csrf->get_token_id () - $ token_value = $ csrf->get_token ($ token_id) - // Generarea de nume aleatoare pentru module $ form_names = $ csrf-> form_names (array ( `utilizator`, `parola`), fals) -Dacă (isset ($ _ POST [$ form_names [] `utilizator`], $ _POST [$ form_names [ `parola`]])) {// Verificați dacă Indicativul ID-ul Indicativul și valoarea sunt validi.if (csrf- $>. Check_valid ( `post`)) {// Ia modulul Variabile $ = $ _POST utilizator [$ form_names [ `utilizator`]] - $ parola = $ _POST [$ form_names [ `parola`]] - // Modul de funcții merge aici} // Regenerare o nouă valoare aleatoare pentru modulul. form_names $ = $ csrf->form_names (array (`utilizator`, `parola`), true) -}?>
- Cum să bată Slade în Batman Arkham Origins
- Cum de a bloca site-uri pe un iPad
- Cum se anulează istoricul pe iPad
- Cum să înțelegeți structura rețelei între computere
- Cum să verificați statutul de cerere de imigrare în Statele Unite
- Cum se creează un script de conectare securizată Utilizând PHP și MySQL
- Cum se creează un script de bază de conectare cu PHP
- Cum să trimiteți o cerere HTTP pe Android
- Cum să desenezi o cruce
- Cum să gestionați solicitările de la Hospitality de la Couchmanagerul Couchsurfing
- Cum sa scapi de atacurile de panica
- Cum de a îmbunătăți reflexele de luptă
- Cum să montați atacuri pe snowboard
- Cum de a posta o cerere de Couch Open pe Couchsurfing.org
- Cum să reglezi atacurile de schi
- Cum să redeschideți o filă Browser
- Cum să învinge Elizabeth în Persona 3
- Cum să învinge Zexion (data bătăliei) în Hearts din Regatul Unit II
- Cum de a învinge alduina
- Cum să supraviețuiești atacurilor animalelor
- Cum să utilizați auto-hipnoza pentru a bloca atacurile de anxietate