広告を管理するWordPressプラグインを開発しているのですが、広告のタグを入力すると、次のようなメッセージが表示されるようになってしまいました。
このページは動作していません
このページで通常と異なるコードを検出したため、個人情報(例: パスワード、電話番号、クレジット カード番号)を保護するために、ページをブロックしました。
サイトのホームページにアクセスしてみてください。
ERR_BLOCKED_BY_XSS_AUDITOR
調べてみると、Chromeでフォームで特定のHTMLタグを送信したとき発生することが分かりました。他のサイトの情報によれば、昨年にはこのようになっていたようです。今更ながら、この問題にいろいろと対処したことについてまとめます。
ERR_BLOCKED_BY_XSS_AUDITORは、フォームから <iframe> や <script> などのタグをPOSTで送信し、それをそのまま出力しようとしたときに発生します。
これに対処する方法は、次の3とおりが考えられます。
1. ヘッダーに X-XSS-Protection: 0 を出力する
たとえば、以下のように記述します。
header('X-XSS-Protection: 0');
しかし、WordPressのプラグインでは全く効果がありませんでした。
2. .htaccess を編集する
.htaccessに以下の記述を追加すれば、ChromeのXSSチェックを回避できます。
<ifModule mod_headers.c> Header always set X-XSS-Protection "0" </ifModule>
ただし、今回はWordPressプラグインであるため、配布することを考えると、サイトの.htaccessを直接編集するのは無理です。なお、この方法はWordPressでも確かに効果がありました。
3. POSTされるデータを修正する
WordPressのプラグインでも確実にXSSチェックを回避でき、配布も容易であると考えられる方法がこれです。フォームがPOSTされるとき、JavaScriptでデータを処理し、XSSチェックにかからないようにします。
具体的には、フォームからのデータに<iframe>が含まれるとき、<esc_iframe>などの無効なタグに変換するのです。変換されたタグをPHPで受け取り、再び<iframe>に戻してやれば問題ありません。
そのように書いたコードが以下です。
HTML
<form method="POST" action="">
<textarea id="tag-content" name="tag"></textarea>
<button type="submit" onclick="post_click()">
</form>
JavaScript
function post_click() {
var tag_area = document.getElementById("tag-content");
var tagtxt = tag_area.value;
var new_tag = tagtxt.replace(/<iframe/g, "<esc_iframe").replace(/src=/gi, "src_esc=");
tag_area.value = new_tag;
}
PHP
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (isset($_POST['tag'])) {
$encode_tag = filter_input(INPUT_POST, 'tag');
$decode_tag = str_replace('<esc_iframe', '<iframe', $encode_tag);
$decode_tag = str_replace('<src_esc=', 'src=', $decode_tag);
echo $decode_tag;
}
}
$decode_tag = str_replace(‘
$decode_tag = str_replace(‘src_esc=’, ‘src=’, $decode_tag);
じゃないですか?