【问题标题】:HTML Encoding of request parameters请求参数的 HTML 编码
【发布时间】:2016-07-29 15:24:00
【问题描述】:

我的应用程序是一个 Spring MVC 应用程序,不使用注释(虽然它使用的是 spring 3.1.1,但它是一个相当老的应用程序)。

我有一个 JSP 页面,可以通过 curl 等工具或直接从 Web 浏览器 URL 调用。该 URL 接受一个名为 location 的请求参数

http://localhost:8080/testdomain/registeruser.do?mylocation=fr

在调用上述 url 时,我调用了读取请求参数“mylocation”的 SimpleFormController 的实现

如何对请求参数“mylocation”进行 html 编码。在从我的控制器中的请求 [request.getParameter("mylocation")] 读取参数之前,如果我调用 HtmlUtils.htmlEscape(request.getParameter("mylocation")) 就足够了

请注意,没有表单支持 mylocation 的输入参数,如前所述,我可以从命令行工具或浏览器 URL 调用它。

【问题讨论】:

  • 你为什么要编码任何东西?您是否获得了 mylocation 参数的正确值?如果这只是字母数字值,您通常不需要转义/取消转义任何内容。
  • 可能存在 XSS 威胁,可以通过恶意意图的脚本。我知道 HTML 编码会将脚本特殊字符转换为其编码形式。
  • 你在用那个参数做什么?如果您在 js 变量中输出数据,则 HTML 转义是不够的。但是,如果您只有一个不受信任的参数,则可以以更简单的方式对其进行验证。例如,在生成输出之前检查 myLocation 的值是否存在于 Enum 类型中:MyAllowedLocations.valueOf(myLocation);

标签: java spring jsp spring-mvc urlencode


【解决方案1】:

有两种不同的东西:

1) URL 编码/解码 - 仅允许将 GET 参数传递给服务器。需要编码,因为服务器需要转义一些特殊字符“?” , "&" 在查询字符串中。 它通常由 Tomcat 等 Web 服务器处理。

2) 为了防止 XSS,您可以使用Jsoup。仅当您将在网页上显示参数值时才需要它。

一些框架,比如 JSF 可以自动阻止 XSS。当 HTML 显示在网页上时,它们可以转义 HTML。

【讨论】:

  • URL 编码和 HTML 编码一样吗?其次,我不同意只有当参数的值要显示在网页上时才需要 XSS。在某些情况下,例如使用 iframe 或 innerHTML 可能会与请求参数绑定并导致 XSS 攻击。感谢您对 JSoup 的引用,我会进一步研究。
  • 不,要防止 XSS,您只需要 HTML 编码。脚本不会在浏览器地址栏中执行,因此您无需对 URL 进行编码/解码以防止 XSS。
  • 为什么我不能将脚本标签(java 脚本标签)作为请求参数从浏览器 url 传递或说出 curl 命令?如果这个脚本没有被编码,并且能够在代码内部执行它自己会怎样。它不必呈现在要执行的页面上。也请参考这个链接,它有一些有趣的例子,developer.salesforce.com/page/…
  • 需要在浏览器中渲染才能执行。您可以转义/取消转义脚本,您无需对其进行编码/解码以防止 XSS。您可以对 URL 进行编码/解码,这与 XSS 无关。如果将脚本(Bash、SQL)发送到服务器以造成伤害,则属于不同类型的攻击。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多