2011-01-25 2 views
3

Есть ли библиотеки для защиты от CSRF (PHP5.1/5.2) или мне нужно создавать на себе? Я использую этот фрагмент от Chris, но без библиотеки я получаю много дубликатов на каждой странице.php csrf protection library

Я нашел это library для PHP5.3, но мне интересно, есть ли на PHP5.1/5.2, потому что я пока не верю, что все хостинг-поддержка PHP5.3.

+1

Его легко написать. – zerkms

+0

@zerkms Я уже начал это делать, но вам следует использовать программное обеспечение, если это возможно. – Alfred

+1

@Alfred: это: 1) одна небольшая функция для генерации случайного токена и сохранения его в сеансе 2) один маленький помощник для вставки скрытого поля 3) одна небольшая функция для проверки. Не стоит искать что-то готовое и тратить время, чтобы адаптировать его к вашей инфраструктуре. – zerkms

ответ

2

Поскольку я использую Kohana - я только что расширил пару своих основных классов. Его можно использовать в любом коде с небольшими изменениями:

class Form extends Kohana_Form 
{ 
    public static function open($action = NULL, array $attributes = null) 
    { 
     if (is_null($action)) 
     { 
      $action = Request::current()->uri . ($_SERVER['QUERY_STRING'] ? '?' . $_SERVER['QUERY_STRING'] : ''); 
     } 

    $open = parent::open($action, $attributes); 
    $open .= parent::hidden(self::csrf_token_field(), self::csrf_token()); 
    return $open; 
    } 

    public static function csrf_token_field() 
    { 
    return 'csrf_token'; 
    } 

    public static function csrf_token() 
    { 
    $session = Session::instance(); 
    $token = $session->get(self::csrf_token_field()); 

    if (!$token) 
    { 
     $session->set(self::csrf_token_field(), $token = md5(uniqid())); 
    } 

    return $token; 
    } 
} 

class Validate extends Kohana_Validate 
{ 
    public function __construct(array $array, $csrf = true) 
    { 
     parent::__construct($array); 
     if ($csrf) 
      $this->add_csrf(); 
    } 

    public static function factory(array $array, $csrf = true) 
    { 
     return new Validate($array, $csrf); 
    } 

    private function add_csrf() 
    { 
     $this->rules(form::csrf_token_field(), array(
      'not_empty' => array(), 
      'csrf' => array() 
     )); 
    } 

    protected function csrf($token) 
    { 
     return $token == form::csrf_token(); 
    } 

}