带有占位符的消息属性中的html标记 - XSS potential

时间:2015-09-22 08:31:46

标签: html spring localization xss html-escape

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

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

如果任何占位符的内容是受用户影响的字符串,我需要html转义消息以防止潜在的XSS(我在JSP模板中使用c:out标记这样做,我想我也可以使用spring:message标签的htmlEscape属性,但我认为没有区别。)

但是,通过这样做,我破坏了消息中的标记,<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-escaping消息,就像我想要的那样,就像这样:

更改关系彼得 - &gt; 汽车卡尔 - &gt;的总线

因此,当在模板中显示时,正在呈现messages.properties文件中的html标记。

转义时,消息如上所示,向我显示<strong>标记,而不是呈现它们。

1 个答案:

答案 0 :(得分:1)

假设您获得以下输出:

  

Change relation &lt;strong&gt;Peter&lt;/strong&gt; -&gt; &lt;strong&gt;Car&lt;/strong&gt; to &lt;strong&gt;Carl&lt;/strong&gt; -&gt; &lt;strong&gt;Bus&lt;/strong&gt;

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

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

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