JSP/Servlet WebアプリケーションでXSS攻撃を防ぐにはどうすればよいですか?
How-to-prevent-xssが何度も尋ねられています。 StackOverflowには多くの情報があります。また、 OWASP WebサイトにはXSS防止チートシートがあります 確認する必要があります。
使用するライブラリでは、 OWASPのESAPIライブラリ にはJavaの味があります。試してみてください。さらに、使用するすべてのフレームワークにはXSSに対する保護があります。繰り返しになりますが、OWASP Webサイトには最も人気のあるフレームワークに関する情報がありますので、それらのサイトをご覧になることをお勧めします。
私は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よりも良い方法だと思います。
XSSを管理するには、クライアント側からのデータ、複数の検証が必要です。
XSSに対する簡単ですぐに使用できるソリューションはありません。 OWASP ESAPI APIは、非常に便利なエスケープをサポートしており、タグライブラリを備えています。
私のアプローチは、基本的に次の方法でstuts 2タグを拡張することでした。
手順1でクラスを変更したくない場合は、ESAPIタグをfreemarkerテンプレートにインポートし、必要に応じてエスケープすることもできます。次に、JSPでs:propertyタグを使用する必要がある場合は、ESAPIタグでラップします。
ここでより詳細な説明を書きました。
http://www.nutshellsoftware.org/software/securing-struts-2-using-esapi-part-1-securing-outputs/
入力のエスケープは理想的ではないことに同意します。
自動ツールを使用して脆弱性を定期的にテストし、見つかったものを修正することをお勧めします。一般的なすべてのXSS攻撃よりも、特定の脆弱性に役立つライブラリを提案する方がはるかに簡単です。
Skipfish は、私が調査してきたGoogleのオープンソースツールです。非常に多くのものが見つかり、使用する価値があるようです。
私個人の意見では、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/