2015-09-22 63 views
0

由于消息中的消息属性文件:HTML标记占位符 - XSS潜在

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转义的消息是,就像我希望它是这样的:

变化关系彼得 - >汽车卡尔 - >总线

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

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

+0

你是说它会导致输出:'<强>彼得< /强>'?就我所知,因为你的“损坏的”例子与原始信息完全一样。 – Gray

+0

嗨,对不起,我编辑了我的问题,试图澄清我的情况一些。 – SebastianRiemer

+0

谢谢澄清。如果您查看HTML(查看源代码),您会发现实际上,您将“<”发送给客户端而不是“<”。所以,我相信我的答案仍然存在 - 让我知道如果它不清楚或者我误解了你的问题。 – Gray

回答

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与转义的版本。无论你喜欢什么方式,只要你能够正确逃避不可信任的部分,就应该没问题。

+1

我同意这一部分,我只应该逃避消息中不可信的部分。 这会让我选择在传递给消息之前将参数*转义出来,然后如您所说,在渲染时不会转义消息。 – SebastianRiemer

+1

只是FYI,我已经通过用单引号替换属性文件中的标记来解决我的问题。 但我很确定,要走的路就是在将消息传递给消息的同时简单地转义消息参数,然后在不带* html转义的情况下呈现消息*。 谢谢@格雷! – SebastianRiemer