gpt4 book ai didi

security - 使用 c :out to prevent XSS 的替代方法

转载 作者:行者123 更新时间:2023-12-02 10:02:34 24 4
gpt4 key购买 nike

我正在致力于防止基于 Java、Spring 的 Web 应用程序中的跨站脚本 (XSS)。我已经实现了类似于此示例 http://greatwebguy.com/programming/java/simple-cross-site-scripting-xss-servlet-filter/ 的 servlet 过滤器它会清理应用程序中的所有输入。作为额外的安全措施,我还想清理所有 JSP 中应用程序的所有输出。我做了一些研究,看看如何做到这一点,并找到了两个互补的选择。

其中之一是使用 Spring 的 defaultHtmlEscape属性。这非常容易实现(web.xml 中的几行),并且当您的输出通过 spring 的标签之一(即:消息或表单标签)时,它非常有效。我发现的另一个选择是不直接使用 EL 表达式,例如 ${...}而是使用 <c:out value="${...}" />

第二种方法效果很好,但是由于我正在处理的应用程序的大小(200 多个 JSP 文件)。必须将 EL 表达式的所有不当使用替换为 c:out 是一项非常繁琐的任务。标签。此外,确保所有开发人员都遵守使用 c:out 的约定,将来将成为一项繁琐的任务。标签(更不用说,代码会更加难以阅读)。

是否有其他方法可以转义 EL 表达式的输出,并且需要较少的代码修改?

最佳答案

从 Servlet 2.5/JSP 2.1 开始,您可以创建自定义 ELResolver 这样做的。您可以在 ServletContextListener#contextInitialized() 注册.

@Override
public void contextInitialized(ServletContextEvent event) {
JspFactory.getDefaultFactory()
.getJspApplicationContext(event.getServletContext())
.addELResolver(new YourCustomELResolver());
}

ELResolver#getValue() 你可以完成转义工作。

你唯一的问题是你将无法在允许的地方显示 HTML(即已经通过白名单清除了恶意标签/属性,这样你最终会得到像 Jsoup can 这样的无辜标签)。

<小时/>

也就是说,我不同意 Filter输入期间转义 XSS 的必要性。正如您在问题第一段中提到的。你有双重逃逸的风险。您只需要在它可能造成损害的地方进行转义,即直接在 View 侧将其内联到 HTML(输出)中。我建议摆脱所谓的 XSS 过滤器,并通过使用 JSTL <c:out> 集中精力在 View 端修复它。或fn:escapeXml() (或自定义 EL 解析器,但这绝对不是正常方法)。 future 的代码维护者将非常感激。

关于security - 使用 c :out to prevent XSS 的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4465583/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com