CSRF のトークンは、以前はセッション ID を利用することが多かったですが、より安全に対応するために乱数でトークンを作成するようになりました。
これは、Cookie に保存されているセッション ID だと、クロスサイト・スクリプティングの脆弱性やブラウザの不具合などによりセッション ID が漏洩する可能性があるためです。また、会社のポリシーで独自トークンの利用が義務付けられていたり、ワンタイム・トークンを利用する場合にも自分でトークンを作成する必要があります。
CSRF の安全なトークンの作成条件は以下の通りです。
- 暗号論的擬似乱数生成器による乱数でトークンを作成する
- トークンの長さは32桁
■暗号論的擬似乱数生成器による乱数でトークンを作成する
CSRF のトークンを作成するためには、暗号論的擬似乱数生成器を使用して乱数を生成する必要があります。これを利用しないとセキュリティ上安全な乱数を生成できないからです。
Java, .NET, PHP では以下のものを使用することができます。
- Java: java.security.SecureRandom
- .NET: System. Security. Cryptography. RNGCryptoServiceProvider
- PHP: openssl_random_pseudo_bytes (>=PHP5.3.0)
暗号論的擬似乱数生成器がない言語では、セッション ID をトークンに利用することが無難です。
■トークンの長さは32桁
CSRF のトークンの強度は、セッション ID と同程度でよいので、20桁以上あればよいと思いますが、いくつかの実装のセッション ID の桁数を見てみましょう。
- Tomcat: 32桁
- ASP.NET: 24桁
- PHP: 26桁
この状況から、トークンが32桁あれば十分な強度であると言えます。
参考
Webアプリケーションセキュリティに関する記事は、以下のページにまとまっています。ぜひご確認ください。
コメント