web-dev-qa-db-ja.com

JSP / Servlet WebアプリケーションでのXSS防止

JSP/Servlet WebアプリケーションでXSS攻撃を防ぐにはどうすればよいですか?

66
newbie

How-to-prevent-xssが何度も尋ねられています。 StackOverflowには多くの情報があります。また、 OWASP WebサイトにはXSS防止チートシートがあります 確認する必要があります。

使用するライブラリでは、 OWASPのESAPIライブラリ にはJavaの味があります。試してみてください。さらに、使用するすべてのフレームワークにはXSSに対する保護があります。繰り返しになりますが、OWASP Webサイトには最も人気のあるフレームワークに関する情報がありますので、それらのサイトをご覧になることをお勧めします。

12

私はOWASP Anti-Samyと、XSSの侵入をブロックするすべてのSpringコントローラーのAspectJアドバイザーに非常に恵まれました。

public class UserInputSanitizer {

    private static Policy policy;
    private static AntiSamy antiSamy;

    private static AntiSamy getAntiSamy() throws PolicyException  {
        if (antiSamy == null) {
            policy = getPolicy("evocatus-default");
            antiSamy = new AntiSamy();
        }
        return antiSamy;

    }

    public static String sanitize(String input) {
        CleanResults cr;
        try {
            cr = getAntiSamy().scan(input, policy);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return cr.getCleanHTML();
    }

    private static Policy getPolicy(String name) throws PolicyException {
        Policy policy = 
            Policy.getInstance(Policy.class.getResourceAsStream("/META-INF/antisamy/" + name + ".xml"));
        return policy;
    }

}

AspectJアドバイザーは this stackoverflow post から入手できます。

これは、多くのjavascriptを実行する場合は特にc:outよりも良い方法だと思います。

12
Adam Gent

XSSを管理するには、クライアント側からのデータ、複数の検証が必要です。

  1. サーバー側の入力検証(フォーム検証)。それについては複数の方法があります。 JSR 303 bean validation( hibernate validator )、または ESAPI Input Validation framework を試すことができます。私はまだ試していませんが(まだ)、安全なhtml(@ SafeHtml)をチェックする注釈があります。実際には、Bean検証にSpring MVCでHibernateバリデーターを使用できます-> Ref
  2. URLリクエストのエスケープ-すべてのHTTPリクエストに対して、何らかのXSSフィルターを使用します。私たちのウェブアプリには次のものを使用し、HTTP URLリクエストのクリーンアップを処理します- http://www.servletsuite.com/servlets/xssflt.htm
  3. エスケープデータ/ htmlがクライアントに返されます(@BalusCの説明をご覧ください)。
7
MasterV

XSSに対する簡単ですぐに使用できるソリューションはありません。 OWASP ESAPI APIは、非常に便利なエスケープをサポートしており、タグライブラリを備えています。

私のアプローチは、基本的に次の方法でstuts 2タグを拡張することでした。

  1. S:propertyタグを変更して、どのような種類のエスケープが必要かを示す追加の属性を取得できるようにします(escapeHtmlAttribute = "true"など)。これには、新しいPropertyクラスとPropertyTagクラスの作成が含まれます。 Propertyクラスは、エスケープにOWASP ESAPI APIを使用します。
  2. S:propertyの新しいバージョンを使用するようにfreemarkerテンプレートを変更し、エスケープを設定します。

手順1でクラスを変更したくない場合は、ESAPIタグをfreemarkerテンプレートにインポートし、必要に応じてエスケープすることもできます。次に、JSPでs:propertyタグを使用する必要がある場合は、ESAPIタグでラップします。

ここでより詳細な説明を書きました。

http://www.nutshellsoftware.org/software/securing-struts-2-using-esapi-part-1-securing-outputs/

入力のエスケープは理想的ではないことに同意します。

3
brett.carr

自動ツールを使用して脆弱性を定期的にテストし、見つかったものを修正することをお勧めします。一般的なすべてのXSS攻撃よりも、特定の脆弱性に役立つライブラリを提案する方がはるかに簡単です。

Skipfish は、私が調査してきたGoogleのオープンソースツールです。非常に多くのものが見つかり、使用する価値があるようです。

3
Sean Reilly

私個人の意見では、JSP/ASP/PHP/etcページの使用は避けるべきです。代わりに、SAXに類似したAPIへの出力(処理ではなく呼び出し専用に設計されています)。そうすれば、適切な形式の出力を作成する必要がある単一のレイヤーがあります。

各変数を明示的にラップすることなくJSP変数を自動的にエスケープするallする場合は、詳細としてELリゾルバー を使用できますここに完全なソースと例(JSP 2.0以降) があり、さらに詳しく説明します here

たとえば、上記のELリゾルバーを使用すると、JSPコードはそのまま残りますが、各変数はリゾルバーによって自動的にエスケープされます

...
<c:forEach items="${orders}" var="item">
  <p>${item.name}</p>
  <p>${item.price}</p>
  <p>${item.description}</p>
</c:forEach>
...

Springでデフォルトでエスケープを強制したい場合は、これも考慮することができますが、EL式をエスケープせず、出力にタグ付けするだけです:

http://forum.springsource.org/showthread.php?61418-Spring-cross-site-scripting&p=205646#post205646

注:XSL変換を使用してJSPファイルを前処理するELエスケープの別のアプローチは、次の場所にあります。

http://therning.org/niklas/2007/09/preprocessing-jsp-files-to-automatically-escape-el-expressions/

2
Brad Parks