给出消息属性文件中的消息:
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>
标记,而不是呈现它们。
答案 0 :(得分: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与转义版本。无论你喜欢什么样的方式都应该没问题,只要你正确地逃脱不信任的部分。