什么是XSS漏洞
试想一下,如果我们开发一个订单系统,订单名称如果没有做限制,允许用户输入任意字符,那么就有产生XSS的危险。攻击者可以很容易编写一个恶意JS脚本,然后将当前登录用户的cookie或者其他敏感信息抓取到,发送给攻击者自己,这就是XSS(跨站脚本)攻击。如何解决这个问题,首先我们想到的是在用户输入订单的时候,我们对订单名称做限制,不允许输入特殊字符。这样是可以避免的,不过对于一个大的系统来说,用户可以输入的字段太多了,如果能够全部校验,是最好的。如果不能做的话,还可以让前端在做展示的时候进行html转义处理一下,这样原本scirpt标签以及当中的内容就被当做一个字符串展示出来,而不是当做代码执行了。一般现在的reactjs等前端框架已经默认支持防xss了。今天我遇到的问题是,有一部分freemarker写的页面存在XSS的问题。
FreeMarker中解决XSS
可以通过对用户输入的字段进行html转义,来有效的避免XSS问题。freemarker模板中的变量通过 v a l u e 这 样 的 形 式 引 入 , 但 是 挨 个 修 改 成 {value}这样的形式引入,但是挨个修改成 value这样的形式引入,但是挨个修改成{value?html}的形式未免工作量太大;查阅官方文档,通过escape标签可以对整个模板中$号引入的变量全部进行一次html转义。比如:
<#assign x = "<test>">
<#macro m1>
m1: ${x}
</#macro>
<#escape x as x?html>
<#macro m2>m2: ${x}</#macro>
${x}
<@m1/>
</#escape>
${x}
<@m2/>
会输出:
<test>
m1: <test>
<test>
m2: <test>
这种方式完全满足现在的改造需求。在这个项目中,freemarker模板是存储在数据库中