SSL で暗号化しても Cookie で secure 属性を指定しないと盗聴される可能性があるかもしれない

堅牢なお問い合わせフォームを作ることになり、規定書に Cookie には secure 属性を指定してねとありました。secure 属性なんて初めて聞いたので、ちょっと調べてみたところ、secure 属性以外にも expires 属性とかいろいろありますけど、知ってるやと思ったらこれも危険に繋がるみたい。

secure 属性って何

これを指定すると HTTPS の通信時のみクッキーを送信します。逆に指定しなければ HTTPS の時に作った Cookie が HTTP の時に見ることができてしまい、盗聴されることに繋がりますね。

expires 属性って何

クッキーの有効期限を指定するものなんですが、指定しなければブラウザを閉じたときは Cookie は破棄になるんですが、有効期限を指定した場合に危険があるみたいです。

この属性が指定されていなければ,ブラウザを起動していないユーザーが被害に遭うことはない。しかし,この属性が指定されていると,ブラウザ起動時にクッキーが自動的に読み込まれ送信されるため,ブラウザを起動していないユーザーも被害に遭う対象となる。この属性は,オートログイン機能を実現するために設定されることが多いが,このようなリスクが発生することは認識しておかなければならない。

第1回 まずは「クッキー」を理解すべし – 「Webからの脅威」を攻略せよ――セッション管理編:ITpro

ちょっと意味わからないんですけど、そのままのことですよね。

Cookie に secure 属性を設定する

Cookie に secure 属性を設定するには以下のサイトが一番参考になります。
PHP と Web アプリケーションのセキュリティについてのメモ

php.ini で一括設定

ただのコーポレートサイトでお問い合わせフォームだけが SSL だよなんていう場合は php.ini などでサーバーまるごと設定してしまっても良いかもしれません。

1
session.cookie_secure = 1

PHP で部分的に設定する

php.ini を編集できない場合などにこちらが有効です。session_start() を実行する前にこれを実行しなければいけません。

1
2
ini_set('session.cookie_secure', 1);
session_start();

ただサーバーによっては php.ini が効かない場合があるみたいなので、そのような場合は以下の関数を使って設定するみたいですね。

1
2
session_set_cookie_params(1000, '/ssl_path/', NULL, TRUE);
session_start();

あとセッションを使う場合じゃなくて純粋に Cookie を発行するだけの場合は setcookie() で secure 属性を設定することができますのでこれを使うと良いみたいですね。こちらの場合なら session_start() を実行する前とか関係なしに使えそうです。

1
setcookie('Cookie_Name', 'Cookie_Value', time() + 3600, '/ssl_path/', 'example.com', 1);

どちらにせよ SSL にしたからお問い合わせフォーム無敵とかじゃなくて、Cookie とか使っているのなら、secure 属性も使わないともったいないよ、危険性が十分にあるよという記事でした。知らなかった人はぜひ試してみましょう。

コメント

コメントは受け付けていません。