人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

●質問者: esecua
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:20代 blog echo Hatena PHP
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● y-kawaz
●70ポイント

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

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


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

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

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

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

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


2 ● ワテ
●0ポイント

1の方の補足として、

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

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

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

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

session_name("hogehoge")

session_regenerate_id(true)

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

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

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

◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ