0

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

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

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

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

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

我已经在 stackoverflow 上阅读了这里的线程,但它没有解决 XSS。

我正在考虑这些选项:

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

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

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

编辑:如果没有 html 转义消息,就像我希望的那样,就像这样:

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

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

转义时,消息就像上面一样,向我显示<strong>标签而不是渲染它们。

4

1 回答 1

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 与转义版本。只要您正确避开不受信任的部分,无论您喜欢哪种方式都应该没问题。

于 2015-09-22T14:28:48.657 回答