62

Spring MVC で XSS を防ぐにはどうすればよいですか? 現在、ユーザー テキストを出力するすべての場所を JSTL<c:out>タグまたはfn:escapeXml()関数に入れていますが、場所を見逃す可能性があるため、エラーが発生しやすいようです。

これを防ぐための簡単で体系的な方法はありますか? フィルターか何かのようなものでしょうか?@RequestParamコントローラー メソッドでパラメーターを指定して入力を収集しています。

4

8 に答える 8

63

<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" /> 
于 2010-01-27T15:28:54.943 に答える
13

@Validすべての入力オブジェクト (バインディングと@RequestBodyjson、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.validatorNoHtmlValidator

于 2016-11-16T23:38:38.207 に答える
8

XSSFilterを試してください。

于 2010-01-27T15:12:29.300 に答える
6

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 でデータを出力するときは特に注意してください。

于 2010-01-31T11:07:04.417 に答える
0

そもそもユーザー入力をどのように収集していますか? この質問/回答は、次のものを使用している場合に役立ちますFormController

Spring: コマンドへのバインド時に入力をエスケープする

于 2010-01-27T15:15:24.207 に答える
0

だけに依存するのではなく<c:out />、antixss ライブラリも使用する必要があります。これは、入力内の悪意のあるスクリプトをエンコードするだけでなく、サニタイズも行います。利用可能な最高のライブラリの 1 つは OWASP Antisamy です。これは柔軟性が高く、要件に応じて (xml ポリシー ファイルを使用して) 構成できます。

たとえば、アプリケーションがテキスト入力のみをサポートしている場合、OWASP が提供する最も一般的なポリシー ファイルを使用して、ほとんどの html タグをサニタイズして削除できます。同様に、アプリケーションがすべての種類の html タグを必要とする html エディター (tinymce など) をサポートしている場合、eBay ポリシー ファイルなどのより柔軟なポリシーを使用できます。

于 2015-06-11T09:50:15.627 に答える
0

使用するメソッドとタグを常に手動で確認し、最後に必ず (1 回) エスケープするようにしてください。フレームワークには、この点で多くのバグと相違点があります。

概要: http://www.gablog.eu/online/node/91

于 2010-01-27T16:01:36.723 に答える