我有一个使用Struts 2构建的应用程序。它存在跨站点脚本(XSS)攻击的一些问题。我想以与JSP <c:out value="${somevalue}"/>
类似的方式对一些操作输入参数进行编码。在Struts 2中有没有简单的方法来执行此操作? Java API方法可以。
有任何经验吗?
答案 0 :(得分:10)
您可以使用
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
${fn:escapeXml(someValue)}
还有一个好的API JSoup
Sanitize untrusted HTML
问题
您希望允许不受信任的用户为您网站上的输出提供HTML(例如,作为评论提交)。您需要清除此HTML以避免cross-site scripting(XSS)攻击。
解决方案
将jsoup HTML
Cleaner
与Whitelist
指定的配置一起使用。String unsafe = "<p><a href='http://example.com/' onclick='stealCookies()'>Link</a></p>"; String safe = Jsoup.clean(unsafe, Whitelist.basic()); // now: <p><a href="http://example.com/" rel="nofollow">Link</a></p>
因此,在处理提交的文本时,您基本上需要做的就是以下内容:
String text = request.getParameter("text");
String safe = Jsoup.clean(text, Whitelist.basic());
// Persist 'safe' in DB instead.
此项目包含其他配置,拦截器和其他用于提高struts 2应用程序安全性的代码。
另见
答案 1 :(得分:6)
作为XSS预防手段转义输入参数有几个不利因素,尤其是:
因此,最好应用一致的输出转义。
另见:
答案 2 :(得分:1)
对于带有struts 2标签的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/
我同意逃避投入并不理想。