web-dev-qa-db-ja.com

XSS攻撃を防ぐためにJavaでHTMLコードをサニタイズする方法は?

HTMLコードをサニタイズするためにクラス/ユーティリティなどを探しています。つまり、XSSや類似の攻撃を回避するために危険なタグ、属性、値を削除します。

リッチテキストエディター(TinyMCEなど)からHTMLコードを取得しましたが、TinyMCE検証(「オフサイトからのデータ送信フォーム」)を省略して悪意のある方法で送信する可能性があります。

PHPでInputFilterと同じくらい簡単に使用できるものはありますか?私が想像できる完璧なソリューションはそのように機能します(サニタイザーがHtmlSanitizerクラスにカプセル化されていると仮定します):

String unsanitized = "...<...>...";           // some potentially 
                                              // dangerous html here on input

HtmlSanitizer sat = new HtmlSanitizer();      // sanitizer util class created

String sanitized = sat.sanitize(unsanitized); // voila - sanitized is safe...

更新-シンプルなソリューションほど良いです!他のライブラリ/フレームワークへの外部依存関係をできるだけ少なくした小さなutilクラス-私にとっては最善でしょう。


どのようにそのことについて?

25
WildWezyr

OWASP Java HTML Sanitizer を試すことができます。使用方法は非常に簡単です。

PolicyFactory policy = new HtmlPolicyBuilder()
    .allowElements("a")
    .allowUrlProtocols("https")
    .allowAttributes("href").onElements("a")
    .requireRelNofollowOnLinks()
    .build();

String safeHTML = policy.sanitize(untrustedHTML);
27
Saljack

このような操作を行うために構築されたセキュリティライブラリである OWASP ESAPI for Java を使用できます。

HTMLのエンコーダだけでなく、JavaScript、CSS、URLエンコーディングを実行するエンコーダも備えています。 ESAPIの使用例 は、OWASPが発行するXSS防止チートシートにあります。

OWASP AntiSamy プロジェクトを使用して、ユーザーが送信したコンテンツで許可される内容を示すサイトポリシーを定義できます。後で表示される「クリーン」なHTMLを取得するために、サイトポリシーを後で使用できます。 サンプルTinyMCEポリシーファイルAntiSamyダウンロードページ にあります。

13
Vineet Reynolds

@Saljackの answer に感謝します。 OWASP Java HTML Sanitizer についてさらに詳しく説明します。私にとっては非常にうまくいきました(クイック)。Mavenのpom.xmlに以下を追加しただけです。事業:

    <dependency>
        <groupId>com.googlecode.owasp-Java-html-sanitizer</groupId>
        <artifactId>owasp-Java-html-sanitizer</artifactId>
        <version>20150501.1</version>
    </dependency>

最新リリースについては こちら を確認してください。

次に、この関数をサニタイズのために追加しました:

    private String sanitizeHTML(String untrustedHTML){
        PolicyFactory policy = new HtmlPolicyBuilder()
            .allowAttributes("src").onElements("img")
            .allowAttributes("href").onElements("a")
            .allowStandardUrlProtocols()
            .allowElements(
            "a", "img"
            ).toFactory();

        return policy.sanitize(untrustedHTML); 
    }

AllowElementsメソッドのコンマ区切りパラメーターを拡張することで、さらにタグを追加できます。

Beanを渡す前にこの行を追加して、データを保存します。

    bean.setHtml(sanitizeHTML(bean.getHtml()));

それでおしまい!

より複雑なロジックの場合、このライブラリは非常に柔軟で、より洗練されたサニタイジング実装を処理できます。

6
P. Lee

HTMLエスケープ入力は非常にうまく機能します。ただし、場合によっては、ビジネスルールでHTMLをエスケープしないように要求することがあります。 REGEXの使用はこのタスクに適しておらず、それを使用した優れたソリューションを思いつくのは困難です。

私が見つけた最良の解決策は次を使用することでした: http://jsoup.org/cookbook/cleaning-html/whitelist-sanitizer

提供された入力を使用してDOMツリーを構築し、ホワイトリストで許可されていなかった要素をフィルタリングします。 APIには、htmlをクリーンアップするための他の関数もあります。

また、javax.validation @SafeHtml(whitelistType =、additionalTags =)でも使用できます。

6
eduardohl

Antisamyに関しては、依存関係についてこれを確認したい場合があります。

http://code.google.com/p/owaspantisamy/issues/detail?id=95&can=1&q=redyetidave

0
RedYeti