WordPress での ERR_BLOCKED_BY_XSS_AUDITOR 対策

投稿者: | 2018年1月27日

広告を管理する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;
	}
}
ADs
 

WordPress での ERR_BLOCKED_BY_XSS_AUDITOR 対策」への1件のフィードバック

  1. n

    $decode_tag = str_replace(‘
    $decode_tag = str_replace(‘src_esc=’, ‘src=’, $decode_tag);

    じゃないですか?

    返信

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)