web-dev-qa-db-ja.com

JavaScriptスクリプトの実行を拒否しました。リクエスト内で見つかったスクリプトのソースコード

WebKitでは、JavaScriptで次のエラーが表示されます。

JavaScriptスクリプトの実行を拒否しました。リクエスト内で見つかったスクリプトのソースコード。

コードはJavaScriptスピナー用です。 ASCII Art を参照してください。

以前は正常に動作するコードでしたが、CaminoおよびFirefoxで引き続き正常に動作しています。エラーは、ページをPOSTで保存し、GETで取得した場合にのみスローされるようです。Chrome/ MacとSafari/Macの両方で発生します。

誰もがこれが何を意味するのか、これを修正する方法を知っていますか?

81
doekman

XSS(クロスサイトスクリプティング) 攻撃を防ぐためのセキュリティ対策です。

これは、JavaScriptコードがHTTP POSTリクエストを介してサーバーに送信され、HTTPレスポンスを介して同じコードが返される場合に発生します。Chrome状況では、スクリプトの実行が拒否され、エラーメッセージRefused to execute a JavaScript script. Source code of script found within request

セキュリティの詳細:新しいセキュリティ機能 に関するこのブログ投稿も参照してください。

67
Greg

この「機能」は、非標準のHTTPヘッダーを送信することで無効にできます X-XSS-Protection 影響を受けるページ。

X-XSS-Protection: 0
131
Kendall Hopkins

短い答え:JavaScriptの最初の送信を行った後にページを更新するか、編集中のページを表示するURLをヒットします。

長答:フォームに入力したテキストにjavascriptが含まれており、ブラウザが必ずしもあなたがjavascriptのソースであることを認識していないため、ブラウザがこのJSのソースであり、実行されません。

:メールまたはFacebookにJavaScriptを含むリンクを提供したとします。そして、javascriptがすべての友達に私のクールなリンクを伝えると想像してください。そのため、そのリンクを呼び出すゲームは単純になり、ページに含まれるようにjavascriptを送信する場所を見つけます。

Chromeやその他のWebKitブラウザーは、リクエストにJavaScriptが含まれていた場合、レスポンスに含まれるJavaScriptを実行しないことで、このリスクを軽減しようとします。ブラウザがそのJSを実行することは決してないので、私の邪悪な攻撃は阻止されます。

あなたの場合は、フォームフィールドに送信しています。フォームフィールドの投稿は、JavaScriptを表示するページのレンダリングを引き起こし、ブラウザを心配させます。ただし、javascriptが本当に保存されている場合は、フォームを送信せずに同じページにアクセスすると、フォームを実行できます。

15
Koos Kleven

他の人が言ったように、これは、HTTP応答に、リクエストにも含まれていたJavaScriptやHTML文字列が含まれている場合に発生します。これは通常、フォームフィールドにJSまたはHTMLを入力することで発生しますが、URLのパラメーターを手動で調整するなど、他の方法でもトリガーできます。

これに伴う問題は、悪意を持った人が値として希望のJSを入力し、悪意のあるJS値でそのURLにリンクし、ユーザーにトラブルを引き起こす可能性があることです。

almostあらゆる場合において、例外を除き、これは HTML応答 をエンコードすることで修正できます。たとえば、これは<script>タグ内のコンテンツに対して安全ではありません。他の特定のケースは異なる方法で処理できます。たとえば、URLへの入力の注入は、URLエンコーディングの方が適切です。

Kendall Hopkinsが述べたように、実際にフォーム入力からJavaScriptを実行するwantなどのアプリケーションを作成する場合など、いくつかのケースがあるかもしれません JSFiddle 。このような場合、盲目的に書き戻す前に、少なくともバックエンドコードの入力をスクラブすることをお勧めします。その後、彼が言及した方法を使用してXSSの妨害を防ぐことができます(少なくともChromeで)が、攻撃者にさらされていることに注意してください。

1
sfarbota

データベースにコミットした直後、ただし_GETリクエストからスクリプトがレンダリングされる前に、このハックPHPトリックを使用しました。

if(!empty($_POST['contains_script'])) { 
    echo "<script>document.location='template.php';</script>";
}

これは私にとって最も安価なソリューションでした。

0
gabrielcrowe