библиотека защиты php csrf - PullRequest
       5

библиотека защиты php csrf

3 голосов
/ 25 января 2011

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

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

1 Ответ

2 голосов
/ 25 января 2011

Так как я использую 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();
    }

}
...