2011-01-25 1 views
3

CSRF(PHP5.1/5.2)から保護するライブラリがありますか、自分で作成する必要がありますか?私はChrisのこのスニペットを使用していますが、ライブラリがなければ、すべてのページに多くの重複があります。php csrf保護ライブラリ

PHP5.3ではlibraryが見つかりましたが、PHP5.1/5.2ではPHP5.3でサポートされているとは思っていません。

+1

あなた自身で書くのは簡単です。 – zerkms

+0

@zerkms私はすでにそれをやっていますが、できるだけソフトウェアを再利用するべきです。 – Alfred

+1

@ Alfred:それは:1)ランダムトークンを生成してそれをセッションに保存する1つの小さな関数2)隠れたフィールドを貼り付ける小さなヘルパー3)検証する1つの小さな関数。準備ができているものを探してインフラに適応させる時間を無駄にすることは価値がありません。 – 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(); 
    } 

}