環境によりセキュリティを実現する ~php.ini編~ [セキュリティ研究室]

 こんにちは!
 ナビゲータのEVEです。

 昨日は、「環境によりセキュリティを実現する ~apache2.conf編~」の❼以降について解説をしました。それでは、本日は、開発言語として、PHPを使用してる人限定になりますが、php.iniへセキュリティを施していきたいと思います。

[HTTPレスポンスヘッダーを追加する]

 以降が、php.iniへのセキュリティ設定になります。
【php.iniの設定】

# ❶ブラウザを閉じるまでセッションIDが有効(永続しない)
session.cookie_lifetime = 0

# ❷クッキーがサイト全体(/ 以下の全てのパス)に対して有効。
session.cookie_path = /

# ❸このドメイン(とそのサブパス)だけでクッキーを有効にする。
session.cookie_domain = www.pro2grammer.com

# ❹HTTPS通信時にのみセッションクッキーを送信する。
session.cookie_secure = 1

# ❺JavaScript からクッキーへのアクセスを禁止。
session.cookie_httponly = 1

# ❻同一サイトからのリクエストにのみクッキーを送信。
session.cookie_samesite = "Strict"

 なんだか、昨日聞いたセキュリティが出てきています。だから、今日の以上の設定は、php.iniにしなくて問題ないかというとそうではありません。それは、apache2.confへの設定は、Webアプリケーションへの設定であり、php.iniへの設定は、アプリケーションへの設定になります。ようは目的が違うのです。整理すると、以下のようになります。
セキュリティ機能 PHP (php.ini) Apache(Header 指定)
Cookie に Secure, HttpOnly, SameSite を付ける PHPが発行するセッションCookieにのみ作用 HTML/JS/その他のCookieにも適用可能(例:アプリ独自のSet-Cookie)
Content-Security-Policy (CSP) ×(設定不可) OK
HSTS, X-Frame-Options × OK
Cookie が JS から読み取れないようにする OK OK(Set-Cookieを書き換えるなら)
XSSやCSRF対策の層を追加 部分的に対応 より網羅的に対応可能

[php.iniセキュリティ詳述]

 ❶ですが、これは、ブラウザを閉じた時に、セッションクッキーを削除する設定になります。なお、この設定では永続的クッキーは削除されません。もし、永続的クッキーをセッションクッキー同様に削除したいなら、永続的クッキーの利用はやめ、セッションクッキーを御利用下さい。また、今まで触れてきませんでしたが、phpセッションというのもあります。そちらは、機能的には、セッションクッキーとは異にしますが、操作的には全く同じですので、ここでは、気にする必要はないと思われます。
 ❷は、www.pro2grammer.comなら当該URL以外にはクッキーは送信しないという設定になります。なお、ドメインルート配下のパスを指定をした場合、そのパス以下のページにのみクッキーが送信され、他のパスには送信されません。
 ❸は、❷と似たような記述になっていますが、その違いについて、解説をすると、❷はURLのパスに対して行われ、❸はドメインに関する有効範囲を決定するものになります。
 ❹は、アプリケーションへのSecure属性の設定になります。
 ❺は、アプリケーションへのhttpOnly属性の設定になります。
 ❻は、当サイトの例で言うと、www.pro2grammer.comからのリクエストのみにクッキーを送信するという設定になります。

[あとがき]

 教科書記載の内容で、環境で実現するものは以上で全てです。以前、SQLインジェクション対策を怠ったエンジニアが個人として訴えられた判例がありましたが、もしかしたら以上のセキュリティをせずに、リリースした場合、同様なことが発生するかもしれません。気を付けてください。今後運用後気づいたことがございましたら、当サイトでご報告します。今後のWeb開発にいかしていただければ、うれしいです。

 では、また!

コメント