Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zabezpieczenie przed CSRF, implementacja własna
wNogachSpisz
post
Post #1





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


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. }
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 10.10.2025 - 10:38