【问题标题】:html markup in messages properties with placeholders - XSS potential带有占位符的消息属性中的 html 标记 - XSS 潜力
【发布时间】:2015-09-22 08:31:46
【问题描述】:

给定消息属性文件中的消息:

message = Change relation <strong>{0}</strong> -> <strong>{1}</strong> to <strong>{2}</strong> -> <strong>{3}</strong>?

如果任何占位符的内容是受用户影响的字符串,我需要对消息进行 html 转义以防止潜在的 XSS(我猜我是通过在我的 JSP 模板中使用 c:out 标记来做到这一点的我也可以使用spring:message 标签的htmlEscape-attribute,但我认为没有区别)。

但是这样做,我破坏了消息中的标记,<strong> 等导致输出:

Change relation <strong>Peter</strong> -> <strong>Car</strong> to <strong>Carl</strong> -> <strong>Bus</strong>?

我已经阅读了这里的帖子on stackoverflow,但它没有解决 XSS。

我正在考虑这些选项:

1) 只需将消息属性文件中的所有<strong> 标记替换为单引号即可。那么 html 转义整个消息就没有问题了,缺点是对消息的特定部分的突出显示较少。

2) 将消息拆分为允许在 (JSP) 模板中单独标记的部分。这感觉就像是为了让标记正确而做很多工作。

我在这里遗漏了什么吗?哪个是更好的选择,还是有其他选择?

编辑:如果没有 html 转义,消息就像我想要的那样:

将关系 Peter -> Car 更改为 Carl -> Bus

因此,messages.properties 文件中的 html 标记在模板中显示时会被渲染。

转义时,消息如上所示,显示<strong>标签而不是渲染它们。

【问题讨论】:

  • 你是说它导致输出:<strong>Peter</strong>?因为据我所知,您的“损坏”示例与原始消息完全相同。
  • 嗨,对不起,我已经编辑了我的问题,试图进一步澄清我的情况。
  • 感谢您的澄清。如果您查看 HTML(查看源代码),您会发现您实际上是在向客户端发送 < 而不是 <。所以,我相信我的回答仍然有效 - 如果不清楚或者我误解了您的问题,请告诉我。

标签: html spring localization xss html-escape


【解决方案1】:

假设您得到以下输出:

Change relation <strong>Peter</strong> -> <strong>Car</strong> to <strong>Carl</strong> -> <strong>Bus</strong>

看起来您正在转义整个 HTML 字符串,而不仅仅是需要转义的部分。

您应该单独转义每个 {#} 值,然后将其放入 HTML。您需要转义的一般值是:<>'"&,但如果可以,请使用反 xss 库和模板系统。

一旦您避开了所有潜在的危险部分,您就可以使用<c:out value="${msg}" escapeXml="false"/> 之类的东西。这不是我知道的语言/框架,但您需要一些方法来输出实际的 HTML 与转义版本。只要您正确避开不受信任的部分,无论您喜欢哪种方式都应该没问题。

【讨论】:

  • 我同意这一点,我应该只逃避消息中不受信任的部分。这将使我可以选择转义参数之前它们被传递给消息,然后,正如你所说,在呈现它时不要转义消息。
  • 仅供参考,我通过用单引号替换属性文件中的标记解决了我的问题。但我很确定,要走的路是简单地转义消息参数,同时将它们传递到消息中,然后渲染消息而不 html转义。谢谢@Gray!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
  • 2016-04-18
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
  • 2014-12-20
相关资源
最近更新 更多