答えは、ユーザー入力がブラウザのページDOMにどのように正確に反映されるかによって異なります。
MVCアプリケーションが(Razorを使用して)cshtmlページを生成する場合は、そこでの出力エンコードをcshtmlファイルに実装する必要があります。別のライブラリとしてのAntiXSSは廃止されました。デフォルトではSystem.Web.Security.AntiXss
名前空間になっています。すべての出力を書き込むコンテキストに従ってエンコードする必要があります(最も重要なのは、JavaScriptのコンテキストで記述された入力をエンコードする必要があります。script
タグ、onclick
のようなイベント属性、href
の最初の文字a
タグの場合など)。プレーンhtml出力(タグ間のテキスト)の場合、RazorはデフォルトでHTMLエンコーディングを提供していますので、<div>@myVar</div>
を実行しても問題ありません。
フロントエンドがJSON APIのようなものを消費する場合は、おそらく何らかの種類のクライアントサイドテンプレートエンジン(Knockoutなど)があります。その場合、ユーザーから受け取ったデータをapplication/jsonのコンテンツタイプでクライアントに送り返すことはかなり安全です(これは実際には非常に重要です)。次に、バインドメソッドを慎重に選択して、ユーザー入力を常にHTMLとしてではなくテキストとしてバインドする必要があります。これは事実上
はXSS防止に関する完全なチュートリアルでは、道長くここに答えよりなることに注意してくださいなど、ノックアウトのtext
を使用してhtml
のではなく、結合または.html()
の代わりにjQueryの.text()
メソッドを使用してのようなものを意味するので、この答えは唯一のハイライトいくつかの高水準のものと、これがXSSを防ぐために行われるべき一般的な方法です。
API側で何もする必要はありませんか? – NoviceCoder
XSS防止のためではありません。 APIはデータをどのように表示するか(選択するエンコーディング)とは関係がないため、データを保存する前にエンコードする必要はありません。 [この質問](http://stackoverflow.com/questions/39778598/sql-preventation-of-xss/39780376)への私の答えを見てください。あなたはあなたのAPI上で入力バリデーションを実装することができます。あなたはそれをより良くすることができます。しかし、XSSは出力の問題であり、入力側では停止できません。まだ入力の妥当性確認は良い習慣であり、XSSだけでなく、あらゆる種類の注射に役立ちます。 –