‘HTTP_UPGRADE_INSECURE_REQUESTS’って何?(Upgrade-Insecure-Requests: 1)
問題
どうも最近 $_SERVER に $_SERVER[‘HTTP_UPGRADE_INSECURE_REQUESTS’] => 1 というのを見るようになったのですが、なんですかこれ。
答え
httpsなページに移行していきたいときなどに役立つ仕組みとして、
httpリクエストヘッダに Upgrade-Insecure-Requests: 1
が入る仕組みがある。
→ http://www.w3.org/TR/upgrade-insecure-requests/
→ https://googlechrome.github.io/samples/csp-upgrade-insecure-requests/
httpsなページにアクセスしたときに、httpなコンテンツ(画像、JavaScript、CSS など)が含まれていると、「混合コンテンツですよ」とブラウザに黄色い三角の警告が出る。
(図はfirefoxの場合)
警告を避けたいなら、HTMLを直すべきだが、そうもいかなかったり、すべて修正しきれなかったりすることもある。
そんなとき、サーバー側、クライアント側ともに対応していれば、httpのリソースへのアクセスをhttpsにリダイレクトすることで、警告なしに正常にコンテンツが表示されるようになる。
サーバー側が対応しているかどうかを示すためには、以下のヘッダをサーバーから送るようにする
Content-Security-Policy: upgrade-insecure-requests
HTMLで対応するなら以下のmetaタグを入れる
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
.htaccess で対応するなら以下など
Header add Content-Security-Policy "upgrade-insecure-requests"
phpなら
header('Content-Security-Policy: upgrade-insecure-requests');
対応しているクライアントからのリクエストかどうかの判定は、以下のリクエストヘッダがあるかどうかで判定する。
Upgrade-Insecure-Requests: 1
対応していないクライアントの場合は、そのままレスポンスするのがよさそうで、対応しているクライアントからのリクエストのときのみhttpsのURLにリダイレクトするのがよさそう。
以下テスト。
実験用のJavaScriptを返すphp
<?php //sample.php - JavaScriptを返すphp if ($_SERVER['HTTP_UPGRADE_INSECURE_REQUESTS'] == '1' && $_SERVER["HTTPS"] != 'on') { header('Location: https://example.com/sample.php', true, 307); exit(); } header('Content-type: application/javascript'); echo 'alert("sample.php loaded!");';
httpsなURLのHTMLで、上記JavaScriptをhttpなURLで読み込む
<html> <head> <title>Upgrade-Insecure-Requests test</title> <script src="http://example.com/sample.php"></script> </head> <body> 外部JSが無事読み込まれたら、alertが実行されます </body> </html>
サーバーからのヘッダを追加する .htaccess
Header add Content-Security-Policy "upgrade-insecure-requests"
Webサーバー、Webブラウザともに対応しているとalertが実行される。対応していないと、混合コンテンツの警告が発生し、外部JavaScriptがブロックされる。
.htaccess を削除すると、対応しているブラウザでも、外部JavaScriptがブロックされる。
コメント