また、なぜhtmlをエスケープする関数に違う関数の$_SESSION['token']を使っているのですか?htmlをエスケープする奴もcsrf対策と一緒なのですか?
この点について回答します。
CSRF対策用のトークンをHTMLエスケープする理由として考えられるのは、トークンを正しくvalue
属性値に指定するためです。
HTMLの属性値は"
や'
で囲うのですが、そこにPHPで文字列を挿入しようとした場合、その文字列に"
や'
などが含まれていたらHTMLエスケープする必要があります。
HTML内に文字列を挿入する場合は、XSS対策以外にもそのような問題を考えて、
文字列をHTMLとして挿入したい場合以外は原則HTMLエスケープするのが基本です。
なお、今回の場合、トークンの生成にはsha1
関数によるSHA-1ハッシュの文字列を利用しています。
sha1
関数が返すハッシュ文字列は16進数文字列なので、HTMLエスケープが必要な文字は含まれておらず、はっきり言えば無意味です。
ただ、前述したように、文字列を挿入する場合にはHTMLエスケープするのが基本です。
トークンはHTMLとして埋め込むことが目的ではないので、一応のためにHTMLエスケープを行っているものと考えられます。
本題とは無関係ですが、setToken
関数が行っているセッショントークン生成機構は危険です。
トークンの生成は、暗号論的擬似乱数生成器によるもののほうが安全であるという意見があります。
トークンの生成には、openssl_random_pseudo_bytes
やmcrypt_create_iv
、Secure-random-bytes-in-PHPを利用した方が良いです。
個人的には、Secure-random-bytes-in-PHPをオススメします。
これは、内部的にopenssl_random_pseudo_bytes
やmcrypt_create_iv
などが利用できるか自動で判定し、乱数を生成してくれます。
openssl_random_pseudo_bytes
の場合:
lang
1function setToken(){
2 if(!isset($_SESSION['token'])){
3 $_SESSION['token'] = rtrim(base64_encode(openssl_random_pseudo_bytes(32)),'=');
4 }
5}
mcrypt_create_iv
の場合:
lang
1function setToken(){
2 if(!isset($_SESSION['token'])){
3 $_SESSION['token'] = rtrim(base64_encode(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM)),'=');
4 }
5}
Secure-random-bytes-in-PHPの場合:
lang
1require 'srand.php';
2
3function setToken(){
4 if(!isset($_SESSION['token'])){
5 $_SESSION['token'] = rtrim(base64_encode(secure_random_bytes(32)),'=');
6 }
7}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2015/07/26 22:02 編集