SESSION_COOKIE_SECUREについて
最近、なんだかコード内に設置したCSRF対策の動きがおかしい。。。
何度やってもエラーが出ちゃう。
これがテストコードです。
error_reporting(E_ALL);
header("Content-Type:text/html;charset=utf-8");
function setToken(){
$token = sha1(uniqid(mt_rand(),true));
$_SESSION['token'] = $token;
}
function checkToken(){
if (empty($_SESSION['token']) || ($_POST['token'] !== $_SESSION['token']))
{
echo "不正なPOSTが行われました!";
exit;
}
}
function h($s){
return htmlspecialchars($s,ENT_QUOTES,"UTF-8");
}
$err = array();
//フォームからPOSTでリクエストが来ているかどうか判定
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
//POSTからのリクエストではなかった場合の処理
//CSRF対策
setToken();
}else{
//POSTからのリクエストだった場合の処理
checkToken();
if (isset($_POST['submit'])) {
$name = filter_input(INPUT_POST, 'name');
$company = filter_input(INPUT_POST, 'company');
if ($name == '' ||$name == null) {
$err['name'] = "名前を入力して!";
}elseif ($name != "のりこ") {
$err['name'] = "のりこって入力して!";
}
if ($company == '' ||$company == null) {
$err['company'] = "会社名を入力して!";
}elseif ($company != "トヨタ自動車") {
$err['company'] = "トヨタ自動車って入力して!";
}
if (empty($err)) {
echo $company."の".$name."さん、こんにちは!";
exit;
}
}
}
<html>
<form action="" method="POST"><br />
<p>名前:<input name="name" type="text" value="<?php if(isset($name)){echo h($name);}?>" /> <!--?php if(isset($err['name'])){echo h($err['name']);}?--></p>
<p>会社名:<input name="company" type="text" value="<?php if(isset($company)){echo h($company);}?>" /> <!--?php if(isset($err['company'])){echo h($err['company']);}?--></p>
<input name="token" type="hidden" value="<?php echo h($_SESSION['token']); ?>" />
<p><input name="submit" type="submit" value="登録" /></p>
</form>
</html>
このコードを実行すると、CSRF対策にひっかかる。
"不正なPOSTが行われました!"が画面に表示されてしまう。
何故だかわからず、試しに、
var_dump($_SESSION['token']);
var_dump($_POST['token']);
を行うと、$_SESSION['token']だけがNULLと出た。
$_POST['token']には、ちゃんと乱数が入ってる模様。
なんでだろう〜♪なんでだろう〜♪
と、テツ&トムばりに考えた。そして、あることを思い出した。
SESSION_COOKIE_SECURE
セキュリティについてどうすればいいのかいろんなサイトを眺めてて、
php.iniのSESSION_COOKIE_SECUREっていうのをTRUEにするのがよい。
という情報を鵜呑みにして、そういえば、最近、php.iniを書き換えた。
SESSION_COOKIE_SECUREがなんなのかもよく分からずに。。。
試しに、これをFALSEにしてみたら、
string(40) "783ed496779c57e3650b02ddbb57163ea4c1f8a4"
string(40) "80683dac88d8163cbdc162e4135bfd3c508ddb99"
上がセッション変数、下がポスト変数の中身。
値が違うのが気になるが、とにかく、ちゃんとセッション変数にも
乱数値が入った模様。
そもそも、SESSION_COOKIE_SECUREってなんぞや?
調べたのでメモ。
デフォルト値: False
セッションクッキーにセキュアなクッキーを使うかどうかを決めます。
この値を Trueに設定すると、クッキーは “セキュア” にマークされます。
クッキーがセ キュアにマークされると、ブラウザによっては HTTPS 接続でのみ
クッキーを転送す るようになります。
な〜る〜ほ〜ど〜
やっぱ、意味わからず使うのは危険やね。
今、再度実行したら、
$_SESSION['token']と$_POST['token']の値が同じになってた。。。
なんでだろう〜♪なんでだろう〜♪................