Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zabezpieczenie przed CSRF
Forum PHP.pl > Forum > PHP
wNogachSpisz
Witam.
Jak w temacie.
Jest to zarazem zabezpieczenie przed wielokrotnym wysłaniem tego samego formularza.
Proszę o uwagi.

Generowanie:
  1. function csrf_generate() {
  2. $time = time();
  3. $output = pack('L', $time);
  4. $crypt_key = 'ciąg znaków znany tylko serwerowi';
  5. $output .= hash('crc32b', $output . sprintf('%u', ip2long(long2ip(ip2long($_SERVER['REMOTE_ADDR'])))) . $crypt_key, true);
  6. return rtrim(base64_encode($output), '=');
  7. }


Walidowanie:
  1. function csrf_decode( $string ) {
  2. $string = base64_decode($string);
  3. $time = substr($string, 0, 4);
  4. $crypt_key = 'ciąg znaków znany tylko serwerowi';
  5. if ( hash('crc32b', $time . sprintf('%u', ip2long(long2ip(ip2long($_SERVER['REMOTE_ADDR'])))) . $crypt_key, true) !== substr($string, 4)) {
  6. return false;
  7. }
  8. return current(unpack('L', $time));
  9. }
  10.  
  11. function csrf_validate() {
  12. if ( ! isset($_POST['csrf']) OR ! is_string($_POST['csrf']) OR '' === $csrf = $_POST['csrf'] ) {
  13. return false;
  14. }
  15. if ( false === $time = csrf_decode($csrf)) {
  16. return false;
  17. }
  18. global $session;
  19. if ( $time > $session->last_form_time ) {
  20. // aktualizujemy czas wysłania ostatniego formularza,
  21. // przez co wszystkie wygenerowane do tej pory tookeny tracą ważność,
  22. // to zabezpiecza przed wieloktornym wysłaniem tego samego formularza.
  23. $session->last_form_time = time();
  24. $session->update();
  25. return true;
  26. }
  27. return false;
  28. }
CuteOne
"Lekki" przerost formy nad treścią? smile.gif eh gdzie się podziały czasy gdy md5() było najlepszym rozwiązaniem na wszelkie bolączki programistów tongue.gif
wNogachSpisz
Przerost? Po mojemu minimalizm.
Kilka prostych operacji, bez ładowania spaszonych biblitek, prawie wszystkie funkcje z jądra php.
CuteOne
  1. $token = md5(time().'aaa'.$_SERVER['REMOTE_ADDR']);


... to jest minimalizm bez zbędnych udziwnień - po co ci sprintf, ip2long czy base64_decode?? Bez urazy ale to jakaś paranoja.... smile.gif
wNogachSpisz
Cytat(CuteOne @ 13.12.2011, 03:49:17 ) *
po co ci sprintf, ip2long

W sumie racja.
Ten trik z ip2long służy temu aby zawsze otrzymać prawidłowe IP w unsigned int,
http://www.php.net/manual/en/function.ip2long.php#104783
Troche na bemózgim wyciągnąłem to z innej biblteki.
Tutaj jest bez sensu bo i tam robimy skrót więc forma zapisu IP nie ma większego znaczenia.
Dzięki, do poprawki..

Cytat(CuteOne @ 13.12.2011, 03:49:17 ) *
czy base64_decode?? Bez urazy ale to jakaś paranoja.... smile.gif

Bez kodowania base64 nie umieścisz danych binarnych w HTMLu wewnątrz inputa hidden.... DOH!
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.