WebKitでは、JavaScriptで次のエラーが表示されます。
JavaScriptスクリプトの実行を拒否しました。リクエスト内で見つかったスクリプトのソースコード。
コードはJavaScriptスピナー用です。 ASCII Art を参照してください。
以前は正常に動作するコードでしたが、CaminoおよびFirefoxで引き続き正常に動作しています。エラーは、ページをPOSTで保存し、GETで取得した場合にのみスローされるようです。Chrome/ MacとSafari/Macの両方で発生します。
誰もがこれが何を意味するのか、これを修正する方法を知っていますか?
XSS(クロスサイトスクリプティング) 攻撃を防ぐためのセキュリティ対策です。
これは、JavaScriptコードがHTTP POSTリクエストを介してサーバーに送信され、HTTPレスポンスを介して同じコードが返される場合に発生します。Chrome状況では、スクリプトの実行が拒否され、エラーメッセージRefused to execute a JavaScript script. Source code of script found within request
。
セキュリティの詳細:新しいセキュリティ機能 に関するこのブログ投稿も参照してください。
この「機能」は、非標準のHTTPヘッダーを送信することで無効にできます X-XSS-Protection
影響を受けるページ。
X-XSS-Protection: 0
短い答え:JavaScriptの最初の送信を行った後にページを更新するか、編集中のページを表示するURLをヒットします。
長答:フォームに入力したテキストにjavascriptが含まれており、ブラウザが必ずしもあなたがjavascriptのソースであることを認識していないため、ブラウザがこのJSのソースであり、実行されません。
例:メールまたはFacebookにJavaScriptを含むリンクを提供したとします。そして、javascriptがすべての友達に私のクールなリンクを伝えると想像してください。そのため、そのリンクを呼び出すゲームは単純になり、ページに含まれるようにjavascriptを送信する場所を見つけます。
Chromeやその他のWebKitブラウザーは、リクエストにJavaScriptが含まれていた場合、レスポンスに含まれるJavaScriptを実行しないことで、このリスクを軽減しようとします。ブラウザがそのJSを実行することは決してないので、私の邪悪な攻撃は阻止されます。
あなたの場合は、フォームフィールドに送信しています。フォームフィールドの投稿は、JavaScriptを表示するページのレンダリングを引き起こし、ブラウザを心配させます。ただし、javascriptが本当に保存されている場合は、フォームを送信せずに同じページにアクセスすると、フォームを実行できます。
他の人が言ったように、これは、HTTP応答に、リクエストにも含まれていたJavaScriptやHTML文字列が含まれている場合に発生します。これは通常、フォームフィールドにJSまたはHTMLを入力することで発生しますが、URLのパラメーターを手動で調整するなど、他の方法でもトリガーできます。
これに伴う問題は、悪意を持った人が値として希望のJSを入力し、悪意のあるJS値でそのURLにリンクし、ユーザーにトラブルを引き起こす可能性があることです。
almostあらゆる場合において、例外を除き、これは HTML応答 をエンコードすることで修正できます。たとえば、これは<script>
タグ内のコンテンツに対して安全ではありません。他の特定のケースは異なる方法で処理できます。たとえば、URLへの入力の注入は、URLエンコーディングの方が適切です。
Kendall Hopkinsが述べたように、実際にフォーム入力からJavaScriptを実行するwantなどのアプリケーションを作成する場合など、いくつかのケースがあるかもしれません JSFiddle 。このような場合、盲目的に書き戻す前に、少なくともバックエンドコードの入力をスクラブすることをお勧めします。その後、彼が言及した方法を使用してXSSの妨害を防ぐことができます(少なくともChromeで)が、攻撃者にさらされていることに注意してください。
データベースにコミットした直後、ただし_GET
リクエストからスクリプトがレンダリングされる前に、このハックPHPトリックを使用しました。
if(!empty($_POST['contains_script'])) {
echo "<script>document.location='template.php';</script>";
}
これは私にとって最も安価なソリューションでした。