Spring MVC で XSS を防ぐにはどうすればよいですか? 現在、ユーザー テキストを出力するすべての場所を JSTL<c:out>
タグまたはfn:escapeXml()
関数に入れていますが、場所を見逃す可能性があるため、エラーが発生しやすいようです。
これを防ぐための簡単で体系的な方法はありますか? フィルターか何かのようなものでしょうか?@RequestParam
コントローラー メソッドでパラメーターを指定して入力を収集しています。
Spring MVC で XSS を防ぐにはどうすればよいですか? 現在、ユーザー テキストを出力するすべての場所を JSTL<c:out>
タグまたはfn:escapeXml()
関数に入れていますが、場所を見逃す可能性があるため、エラーが発生しやすいようです。
これを防ぐための簡単で体系的な方法はありますか? フィルターか何かのようなものでしょうか?@RequestParam
コントローラー メソッドでパラメーターを指定して入力を収集しています。
<form>
Spring では、タグによって生成された JSP ページから html をエスケープできます。これにより、XSS 攻撃の多くの道が閉ざされ、次の 3 つの方法で自動的に実行できます。
web.xml
ファイル内のアプリケーション全体:
<context-param>
<param-name>defaultHtmlEscape</param-name>
<param-value>true</param-value>
</context-param>
ファイル自体の特定のページにあるすべてのフォームについて:
<spring:htmlEscape defaultHtmlEscape="true" />
各フォームについて:
<form:input path="someFormField" htmlEscape="true" />
@Valid
すべての入力オブジェクト (バインディングと@RequestBody
json、https://dzone.com/articles/spring-31-valid-requestbodyを参照) に対してHibernate Validator を使用します。だから@org.hibernate.validator.constraints.SafeHtml
私にとって良い解決策です。
HibernateSafeHtmlValidator
は に依存してorg.jsoup
いるため、プロジェクトの依存関係をもう 1 つ追加する必要があります。
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.10.1</version>
</dependency>
User
フィールドを持つBean の場合
@NotEmpty
@SafeHtml
protected String name;
<script>alert(123)</script>
コントローラーの値を使用した更新試行
@PutMapping(value = "/{id}", consumes = MediaType.APPLICATION_JSON_VALUE)
public void update(@Valid @RequestBody User user, @PathVariable("id") int id)
また
@PostMapping
public void createOrUpdate(@Valid User user) {
BindException
バインディングおよびデフォルト メッセージ付きでMethodArgumentNotValidException
スローされます。@RequestBody
name may have unsafe html content
バリデーターは、永続化する前と同様に、バインドにも機能します。アプリはhttp://topjava.herokuapp.com/でテストできます
更新: @GuyT からのコメントも参照してください
CVE-2019-10219 と @SafeHtml のステータス
@SafeHtml 制約に関連する CVE-2019-10219 が確認されており、6.0.18.Final と 6.1.0.Final の両方で修正されています。
しかし、@SafeHtml 制約は壊れやすく、セキュリティが非常に重要であり、この目的のために設計されていない外部ライブラリに依存しているという結論に達しました。それをコア Hibernate Validator に含めることはあまり良い考えではありませんでした。そのため、これを非推奨にし、削除対象としてマークしました。ここには特別な計画はないため、ユーザーはこの制約を自分で維持する必要があります。
自分自身のレジュメ: 安全であり、解決策が見つかるまで使用できます。
更新: use own@SafeHtml/SafeHtmlValidator
から削除するため、 https://stackoverflow.com/a/68888601/548473を参照してくださいhibernate.validator
NoHtmlValidator
XSSFilterを試してください。
XSS を防止しようとするときは、コンテキストを考えることが重要です。例として、HTML タグまたは HTML 属性でデータを出力するのではなく、javascript スニペットで変数内のデータを出力する場合、どのように、また何をエスケープするかが大きく異なります。
ここに例があります: http://erlend.oftedal.no/blog/?blogid=91
OWASP XSS 防止チート シートもチェックしてください: http://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet
したがって、簡単な答えは、Tendayi Mawushe が提案するように出力をエスケープすることを確認しますが、HTML 属性または JavaScript でデータを出力するときは特に注意してください。
そもそもユーザー入力をどのように収集していますか? この質問/回答は、次のものを使用している場合に役立ちますFormController
。
だけに依存するのではなく<c:out />
、antixss ライブラリも使用する必要があります。これは、入力内の悪意のあるスクリプトをエンコードするだけでなく、サニタイズも行います。利用可能な最高のライブラリの 1 つは OWASP Antisamy です。これは柔軟性が高く、要件に応じて (xml ポリシー ファイルを使用して) 構成できます。
たとえば、アプリケーションがテキスト入力のみをサポートしている場合、OWASP が提供する最も一般的なポリシー ファイルを使用して、ほとんどの html タグをサニタイズして削除できます。同様に、アプリケーションがすべての種類の html タグを必要とする html エディター (tinymce など) をサポートしている場合、eBay ポリシー ファイルなどのより柔軟なポリシーを使用できます。
使用するメソッドとタグを常に手動で確認し、最後に必ず (1 回) エスケープするようにしてください。フレームワークには、この点で多くのバグと相違点があります。