PHP Ver5  セキュリティ


最近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ですよね。

実際、私はセッションにユーザーデータを付与し、そこからユーザー権限を判断し表示を切り替えているのですが、もし以上の方法がセキュリティ的に不完全であれば一度ログインすれば、一部ユーザーしか見れないデータでも見れてしまうことになってしまいます。
これを防ぐにはどうしたらよいのでしょうか?

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2009/09/05 10:59:41
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:y-kawaz No.1

回答回数1422ベストアンサー獲得回数226

ポイント70pt

良く話題になるのは空文字や0周りの仕様に関することで、不等号でかつ30より大きいという条件の場合は変な解釈は起こらないと思います。

なので上記はそれで大丈夫だと思いますよ。$_SESSIONの値はプログラム側でしか入力できないので変なデータが入ることも無いですから。


気をつけるのは真になる条件に 0 や 1 が含まれるときですね。

$age > 30 と書いている場合は特に変なパターンはないと思いますが、

例えば $age < 30 という条件の場合は $age = false や $age = null や $age = "abc" でも真になってしまいます。おそらくこれは本意ではないでしょう。

他にも $age > 0 という条件では、$age = true で真になってしまいます。

もし真になる条件に0や1が含まれる場合は、事前に入力値の型チェックや正規表現チェックなどを行っておくべきだと思います。

id:wate_wate No.2

回答回数45ベストアンサー獲得回数3

1の方の補足として、

$ageの件については、1の方のいうとおりだと思います。

セッションの書き換えは無理だとしても、

ただ、セキュリティ的な面の話もありましたので、

セッションハイジャックの対策なども考慮するのであれば、

session_name("hogehoge")

session_regenerate_id(true)

などを用いて、セッションハイジャック対策も

並行でされたほうがいい様に思われます。

また、php.iniのuse_only_cookies確認されているほうがいいと思います。

id:esecua

補足はコメントでしてください。

2009/09/04 19:22:10
  • id:y-kawaz
    >$ageの値が30以下であれば、セッション内にtrueが付与され、それ以外であればfalseが付与される
    この説明は逆じゃないでしょうか?
    コードが正しいとすれば$ageが30より大きければtrueでそれ以外ならfalseですよね。
  • id:esecua
    あ、すいません。typoです。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません