JSP/Servlet Web 应用程序中的 XSS 预防

2022-08-31 12:29:09

如何防止 JSP/Servlet Web 应用程序中的 XSS 攻击?


答案 1

在 JSP 中,当(重新)显示用户控制的输入时,可以使用 JSTL <c:out> 标记或 fn:escapeXml() EL 函数来防止 XSS。这包括请求参数、标头、Cookie、URL、正文等。从请求对象中提取的任何内容。此外,在重新播放期间,需要对存储在数据库中的先前请求中的用户控制输入进行转义。

例如:

<p><c:out value="${bean.userControlledValue}"></p>
<p><input name="foo" value="${fn:escapeXml(param.foo)}"></p>

这将转义可能使呈现的 HTML 格式错误的字符(如 、、)和 HTML/XML 实体(如 、、、和 )。<>"'&&lt;&gt;&quot;&apos;&amp;

请注意,您不需要在Java(Servlet)代码中转义它们,因为它们在那里是无害的。有些人可能会选择在请求处理期间转义它们(就像您在Servlet或Filter中所做的那样),而不是响应处理(就像在JSP中所做的那样),但这样您可能会面临数据不必要地被双重转义的风险(例如 而不是最终最终用户会看到被呈现),或者数据库存储的数据变得不可移植(例如,当将数据导出到JSON,CSV,XLS,PDF等时,根本不需要HTML转义)。您还将失去社交控制,因为您不再知道用户实际填写了什么。作为站点管理员,您真的很想知道哪些用户/IP 正在尝试执行 XSS,以便您可以轻松跟踪他们并采取相应的操作。在请求处理期间转义应该只并且仅在您确实需要在尽可能短的时间内修复开发不良的旧Web应用程序的火车残骸时才用作最新的方法。不过,你最终应该重写你的JSP文件,使之成为XSS安全。&&amp;amp;&amp;&amp;

如果您想将用户控制的输入重新显示为HTML,其中您只想允许HTML标签的特定子集,如,,等,那么您需要通过白名单清理输入。您可以使用像Jsoup这样的HTML解析器。但是,更好的是引入一种人类友好的标记语言,例如Markdown(也用于Stack Overflow)。然后,您可以使用像CommonMark这样的Markdown解析器来实现此目的。它还具有内置的HTML清理功能。另请参阅 Markdown 或 HTML<b><i><u>

服务器端关于数据库的唯一问题是SQL注入预防。您需要确保永远不会在 SQL 或 JPQL 查询中直接使用字符串连接用户控制的输入,并且始终使用参数化查询。在 JDBC 术语中,这意味着您应该使用 PreparedStatement 而不是 。在 JPA 术语中,使用“查询”。Statement


另一种方法是从JSP / Servlet迁移到Java EE的MVC框架JSF。它在所有地方都内置了XSS(和CSRF!)预防。另请参阅 JSF 中的 CSRF、XSS 和 SQL 注入攻击防护


答案 2

如何预防 xss 已经被问过好几次了。您将在StackOverflow中找到很多信息。此外,OWASP网站有一个XSS预防备忘单,你应该通过。

在要使用的库上,OWASP的ESAPI库具有java风格。你应该试试。除此之外,您使用的每个框架都有一些针对XSS的保护。同样,OWASP网站有关于大多数流行框架的信息,所以我建议浏览他们的网站。