web-dev-qa-db-ja.com

PHPでのCSRF防止

2つの質問。

  1. PHP OWASPのCSRF Guardのバージョンをどこからダウンロードしますか?次のURLはGitをチェックするように言っています:

    https://www.owasp.org/index.php/PHP_CSRF_Guard

    ただし、Gitで見るのは* .Javaファイルと* .jsファイルだけです。 PHPファイルがある場合、ディレクトリ構造のどこにありますか?

  2. phpBBは、すべてのフォームに2つの非表示パラメーターを追加することにより、CSRFを防止します。時間と時間のSHA1ハッシュ、ユーザーごとの「フォームソルト」、セッション識別子、フォーム名。ソース:

    https://github.com/phpbb/phpbb3/blob/c3aa466523e9b074bc4479eccc7b0514972f4b28/phpBB/includes/functions.php#L2544

    私の質問は...なぜ塩以外のものが必要なのですか? CSRFを防止するために必要なのは、攻撃者がHTTPリクエストをブラインド送信できないように攻撃者が予測できないランダムな文字列であり、フォームソルトが私に思われるトリックを実行します。それを他のすべてと一緒にハッシュすることは不必要に思えます。

    多分彼らの動機は、誰かがページのHTMLコンテンツをコピー/貼り付けた場合、フォームソルトが危険にさらされる可能性があるということですか?多分それはそれを将来的に証明することを意図していますか? XSSの脆弱性は、フォームソルトが直接使用された場合にCSRF保護を永続的に侵害しますが、時間のハッシュとフォームソルトはそのシナリオから保護します。

    また、saltが2文字程度の場合、sha1()ハッシュを実行しても理解できますが、2文字の長いsaltは安全ではありません。別のトークン。しかし、それも2文字の長さではありません。

6
compcert
  1. 奇妙ですが、あなたは それについて最初に質問する人 ではなく、CSRF保護の推奨実装もそこに+ githubでホストされているコード です。私はこのメカニズムを実際に保証することはできませんが、あまり厳密に調べていません。

  2. 興味深い質問です。 phpbbは実装で少しオーバーザトップになったように見えますが、その背後にいくつかのロジックがあります。 phpbbの場合、user_form_salt値は静的なユーザーごとの値であり、その特定のユーザーに対して変更されないため、ソルトだけでは十分ではありません。つまり、この値が判明/公開されると(そして、この値が漏洩または取得される可能性のある方法が多分ある場合)、すべてのユーザーフォームが危険にさらされる可能性があります。永遠に(より正確には、このソルトの期間中、ただし通常は変化しません)。そこで実装された方法には、値が常に変化するという利点がありますが、サーバーにチェックするために、値をどこにも保存する必要なく「再現可能」です。既存の保存データといくつかのランダム要素を使用して、CSRFトークンを生成します。私はあまり確かではありませんが、それを使用していると推測しています。いくつかの内部(公開されていない)ランダムセッション変数をキーとする時間のハッシュ/ HMACでも、同じ結果が得られます。

最後に、XSSとCSRFに関するコメントについての短いメモです。あなたが言った

XSSの脆弱性は、フォームソルトが直接使用された場合にCSRF保護を永続的に侵害しますが、時間のハッシュとフォームソルトはそのシナリオから保護します。

基本的に、XSSの脆弱性はCSRF保護を危険にさらす可能性があります。攻撃者がユーザーセッションでコードを実行できる場合、攻撃者はすべてのフォームデータにアクセスできますが、十分に保護されている場合があります。

2
Yoav Aner

最初の部分の答え:

OWASP CSRFガードのphpバージョンは OWASP CSRF Protector として実装されています(設計ロジックの相違によりプロジェクト名が変更されました)。 github からダウンロードできます!

0
mebjas