最近PHPの == が正確ではないとBlogなどで取り上げられていますが、以下の場合どうでしょうか?
$_SESSION['hatena'] = ($age > 30) ? true : false ;
if($_SESSION['hatena'])//又は$_SESSION['hatena'] == TRUE
{
echo '20代であればokですよ。';
}else{
echo 'ん〜';
}
この場合、$ageの値が30以下であれば、セッション内にtrueが付与され、それ以外であればfalseが付与されると思うのですが、この場合、$ageが30以上にもかかわらずこの振り分けをすり抜けて$ageが30以下でみれないコンテンツを見る事ができるのでしょうか?
例えば $_SESSION['str'] = true; if($_SESSION['str'] == 1){ はTRUEですよね。
又、if("" == 0){ もTRUEですよね。
実際、私はセッションにユーザーデータを付与し、そこからユーザー権限を判断し表示を切り替えているのですが、もし以上の方法がセキュリティ的に不完全であれば一度ログインすれば、一部ユーザーしか見れないデータでも見れてしまうことになってしまいます。
これを防ぐにはどうしたらよいのでしょうか?
良く話題になるのは空文字や0周りの仕様に関することで、不等号でかつ30より大きいという条件の場合は変な解釈は起こらないと思います。
なので上記はそれで大丈夫だと思いますよ。$_SESSIONの値はプログラム側でしか入力できないので変なデータが入ることも無いですから。
気をつけるのは真になる条件に 0 や 1 が含まれるときですね。
$age > 30 と書いている場合は特に変なパターンはないと思いますが、
例えば $age < 30 という条件の場合は $age = false や $age = null や $age = "abc" でも真になってしまいます。おそらくこれは本意ではないでしょう。
他にも $age > 0 という条件では、$age = true で真になってしまいます。
もし真になる条件に0や1が含まれる場合は、事前に入力値の型チェックや正規表現チェックなどを行っておくべきだと思います。
1の方の補足として、
$ageの件については、1の方のいうとおりだと思います。
セッションの書き換えは無理だとしても、
ただ、セキュリティ的な面の話もありましたので、
セッションハイジャックの対策なども考慮するのであれば、
session_name("hogehoge")
や
session_regenerate_id(true)
などを用いて、セッションハイジャック対策も
並行でされたほうがいい様に思われます。
また、php.iniのuse_only_cookies確認されているほうがいいと思います。
補足はコメントでしてください。