クロスサイトスクリプティング(XSS)は、最も一般的なwayshackers攻撃webサイト XSSの脆弱性により、悪意のあるユーザーは、他のユーザーがあなたのサイトを訪問したときにJavaScriptの任意のチャンクを実行することができます。
XSSは、一般に報告されている最も一般的なセキュリティ脆弱性であり、すべてのハッカーのツールキットの一部です。









DOMベースのXSS攻撃には、他のタイプのXSS攻撃に関連するすべてのリスクがあり、サーバー側から検出することが不可能な追加のボーナスがあります。URIフラグメントを使用するページは、XSS攻撃の危険にさらされる可能性があります。
Protection
DOMベースのXSS攻撃から保護することは、yourJavaScriptがURIフラグメントを安全でない方法で解釈しないことを確認することです。 これを確実にするにはいくつかの方法があります。
Javascriptフレームワークを使用する
AngularJSやReactのようなフレームワークは、アドホックHTMLの構築を明示的な(そしてまれな)アクションにするテンプレートを使用します。 これにより、開発チームはベストプラクティスに向けられ、安全でない操作を検出しやすくなります。
AngularJS
angularでは、中括弧で書かれた動的コンテンツは自動的にエスケープされるため、次のように安全です:
<div>{{dynamicContent}}</div>
動的コンテンツをinnerHTML
属性にバインドするコードには、自動的にエスケープされないように注意してください:
<div ="dynamicContent"></div> <div innerHTML="{{dynamicContent}}"></div>
react
reactでは、中括弧で書かれた動的コンテンツは自動的にエスケープされるため、以下は安全です:
render() { return <div>{dynamicContent}</div>}
Reactでは、コンテンツをdangerouslySetInnerHTML
プロパティにバインドすることで、生のHTMLを書き出すことができます。 次のようなコードに注意してください:
render() { return <div dangerouslySetInnerHTML={ __html: dynamicContent } />}
コードを慎重に監査する
完全なJavaScriptフレームワークがあなたのために重すぎることがありますsite.In その場合は、参照window.location.hash
をスポットするために定期的にコードレビューを行う必要があります。 URIフラグメントをどのように記述して解釈するかについて合意されたコーディング標準を考え出すことを検討し、このロジックをコアライJQueryを使用する場合は、html(...)
関数を使用するコードを慎重に確認してください。 信頼されていない入力の裏にクライアント側で生のHTMLを構築している場合、入力がURIフラグメントから来ているかどうかにかかわらず、問題があ 可能な限りtext(...)
関数を使用してください。
ネイティブDOM Apiを直接使用している場合は、次のプロパティと関数を使用しないでください:
innerHTML
outerHTML
document.write
代わりに、可能な限りタグ内にテキストコンテンツを設定します:
textContent
Jsonを慎重に解析する
JSONを評価してネイティブのJavaScriptオブジェクトに変換しないでください(たとえば、eval(...)
関数を使用します)。 代わりにJSON.parse(...)
を使用します。
開発ツールを使用して安全でないコードを検出
セキュリティ会社PortSwiggerによって生成されたBurpスイートは、DOMベースの脆弱性を検出するために使用できます。
URIフラグメントをまったく使用しないでください!
最も安全なコードはそこにないコードです。 URIフラグメントを使用する必要がない場合は、使用しないでください。 JavaScriptをスキャンしてwindow.location.hash
の言及を探し、パターンが見つかった場合に失敗させるための単体テストを作成します。 URIフラグメントを使用する必要がある場合は、それらの安全な使用を確実にする方法について議論できます。
コンテントセキュリティポリシーの実装
最新のブラウザはコンテントセキュリティポリシーをサポートしていますWebページの作成者がJavaScript(および他のリソー XSS攻撃は、ページの<html>
タグ内のどこかにインライン<script>
タグを挿入するか、ブラウザをだまして悪意のあるサードパーティのドメインからJavaScriptをロードすることに
応答ヘッダーにコンテンツセキュリティポリシーを設定することで、インラインJavaScriptを実行しないようにブラウザに指示し、ページのJavaScriptをホストできるドメ:
スクリプトをロードできるUriをホワイトリストに登録することで、インラインJavaScriptは許可されていないことを暗黙的に示しています。コンテンツセキュリティポリシーは、ページの<head>
要素の<meta>
タグで設定することもできます:
<meta http-equiv="Content-Security-Policy" content="script-src 'self' https://apis.google.com">
このアプローチは、ユーザーを非常に効果的に保護します! しかし、それはかかるかもしれませんあなたのサイトをそのようなヘッダーの準備ができているようにするためのかなりの量の規律。インラインスクリプトタグは、現代のweb開発では悪い習慣と考えられています。
インラインスクリプトから移行するには、インラインスクリプトの使用を検討してください。Reports.By ポリシーヘッダにreport-uri
ディレクティブを追加すると、ブラウザはインラインJavaScriptfromの実行を防ぐのではなく、ポリシー違反を通知します:
これは、あなたが完全にそれらを禁止する前に、長引くインラインスクリプトがないことを安心させます。
さらに読む
- クロスサイトスクリプティングの仕組み
- コンテンツセキュリティポリシーの概要
- MOZILLA Developer Network上のCSP(Content Security Policy)
- DOMベースのクロスサイトスクリプティングの脆弱性
- コンテンツセキュリティポリシーの説明