@spring.url 宏没有转义 HTML

Posted

技术标签:

【中文标题】@spring.url 宏没有转义 HTML【英文标题】:@spring.url macro is not getting HTML escaped 【发布时间】:2021-10-18 11:29:42 【问题描述】:

我正在使用 spring-boot + freemarker(标准初始化项目)。

我的 .ftlh 文件中有一行

<a href="<@spring.url '/$customer.email' />"
           class="zenith-link"
           id="use-qr-link">$customer.email
        </a>

但是当我将"&gt;&lt;script&gt;alert("Boo!")&lt;/script&gt; 作为客户电子邮件注入时,它不会被转义(因此我的应用存在 XSS 漏洞)

有什么方法可以将 htmlEscape 设置为 true

【问题讨论】:

【参考方案1】:

我检查了源代码(https://github.com/spring-projects/spring-framework/blob/main/spring-webmvc/src/main/resources/org/springframework/web/servlet/view/freemarker/spring.ftl),不仅没有启用转义的选项,而且他们故意在那里禁用了转义(?no_esc):

<#macro url relativeUrl extra...>
  <#if extra?? && extra?size!=0>
     $springMacroRequestContext.getContextUrl(relativeUrl,extra)?no_esc
  <#else>
     $springMacroRequestContext.getContextUrl(relativeUrl)?no_esc
  </#if>
</#macro>

我不知道为什么。此外,这个东西(连同那里的许多其他宏)应该是#function,而不是#macro。然后用户可以完全控制转义,或者他们想要使用结果。 (无论如何,查看源代码很明显,无论是谁做的,都没有投资了解模板语言。)

【讨论】:

以上是关于@spring.url 宏没有转义 HTML的主要内容,如果未能解决你的问题,请参考以下文章

nmake - 关于转义的简单问题

魔兽世界技能宏如何制作```

c语言中的宏定义的学习体会

利用宏方便地书写raw string literals

spring cloud 详解

基本概念