SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

‘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 など)が含まれていると、「混合コンテンツですよ」とブラウザに黄色い三角の警告が出る。

upgrade-insecure-reuqests-1
(図は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がブロックされる。

関連するメモ

コメント