文档章节

freemarker默认escape html 防范xss

greki
 greki
发布于 2012/10/15 19:00
字数 407
阅读 11530
收藏 6

freemarker 有html escape 方法,但是框架没有地方可以配置默认escape

1.<#escape>指令

2.<xxx?html>内建函数

方法一、

网上比较多的是通过TemplateLoader,给加载的template文件2头套<#escape>

<#escape x as x?html>
your template code
</#escape>

参考: http://techdiary.peterbecker.de/2009/02/defending-against-xss-attacks-in.html

但是现在我们应用的对freemarker做了扩展,一个页面分3个部分,一个layout、一个view、多个control。

多次render才到最终结果。要控制比较麻烦配置,也不友好。

方法二

改源码的$变量、默认全部转义、对固定的扩展的layout、一个view、多个control,配置正则原义输出。

变量是string类型的时候,用了xxx?string作为原义输出的内建函数。

缺点:比较暴力,修改了DollarViable源码,后续freemarker有升级要跟随修改

/**
         * The original code
         * env.getOut().write(escapedExpression.getStringValue(env));
         */
        String expr = escapedExpression.getCanonicalForm();
        TemplateModel referentModel =  escapedExpression.getAsTemplateModel(env);
        String output = Expression.getStringValue(referentModel, escapedExpression, env);
        
        if (referentModel instanceof TemplateScalarModel) {
            // layout placeholder and widget no escape and ?string
            if (expr.indexOf("!noescape") > -1 || expr.indexOf("?html") > -1 || expr.indexOf("parameters.") > -1
                    || expr.endsWith("?string") || doNoEscape(expr, env)) {
                env.getOut().write(output);
            } else {
                env.getOut().write(freemarker.template.utility.StringUtil.HTMLEnc(output));
            }
        }else{
            env.getOut().write(output);
        }

 

<!-- 设置 ViewResolver -->
       <bean id="freemarkerConfiguration"
              class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
              <property name="templateLoaderPath"
                     value="file://${xxxxxx.template.templatePath}" />
              <property name="freemarkerSettings">
                     <props>
                            <prop key="default_encoding">UTF-8</prop>
                            <prop key="number_format">#</prop>
                            <!-- 配置缓存时间 -->
                            <prop key="template_update_delay">${xxxxxxx.template.update.delay}</prop>
                            <prop key="classic_compatible">true</prop>
                            <prop key="auto_import">/macro/macros.ftl as spring</prop>
                            <prop key="url_escaping_charset">UTF-8</prop>
                            <prop key="defaultEncoding">UTF-8</prop>
                            <prop key="boolean_format">true,false</prop>
                            <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
                            <prop key="date_format">yyyy-MM-dd</prop>
                            <prop key="locale">zh_CN</prop>
                     </props>
              </property>
              <property name="freemarkerVariables">
            <map>
                <entry key="noescape_patterns" value-ref="noescape_patterns"/>
            </map>
        </property>
       </bean>
       <!-- 不进行转义正则 -->
       <util:list id="noescape_patterns" list-class="java.util.ArrayList">
              <bean class="java.util.regex.Pattern">
                     <constructor-arg value="(^placeholder$)|(^widget)|(^token\(\)$)" />         
          <constructor-arg value="0"/> 
              </bean>
       </util:list>

 

© 著作权归作者所有

共有 人打赏支持
greki
粉丝 98
博文 109
码字总数 45236
作品 0
杭州
技术主管
私信 提问
Spring Boot 最佳实践(三)模板引擎FreeMarker集成

一、FreeMaker介绍 FreeMarker是一款免费的Java模板引擎,是一种基于模板和数据生成文本(HMLT、电子邮件、配置文件、源代码等)的工具,它不是面向最终用户的,而是一款程序员使用的组件。 ...

王磊
08/31
0
0
Eclipse安装Freemarker Editor插件

Eclipse安装Freemarker Editor插件 在下面网址里下载freemarker-ide: http://sourceforge.net/projects/freemarker-ide/files/ http://sourceforge.net/projects/freemarker-ide/files/ 下载......

风中帆
2015/02/10
0
1
FreeMarker 语法教程

FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 1,文本:直接输出的部分 2,注释:<#-- ... -->格式部分,不会输出 3,插值:即${...}或#{...}格式的部分,...

翊骷
2014/08/11
0
1
freemaker开发学习《一》

 FreeMarker是一个非常优秀的模板引擎,这个模板引擎可用于任何场景,FreeMarker负责将数据模型中的数据合并到模板中,从而生成标准输出.FreeMarker可以提供昜好的团队协作,对于界面开发人...

xiaml
2014/04/25
0
0
freemarker语法介绍及其入门

FreeMarker标签使用 一、FreeMarker模板文件主要有4个部分组成 1、文本,直接输出的部分 2、注释,即<#--...-->格式不会输出 3、插值(Interpolation):即${..}或者#{..}格式的部分,将使用数...

wersdffg
2014/09/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

node.js学习笔记之koa框架和简单爬虫练习

Koa -- 基于 Node.js 平台的下一代 web 开发框架 koa是由 Express 原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。 使用 koa 编写 web 应用,可以免除重复繁琐的回调...

前端小攻略
18分钟前
3
0
JavaScript中的继承及实现代码

JS虽然不像是JAVA那种强类型的语言,但也有着与JAVA类型的继承属性,那么JS中的继承是如何实现的呢? 一、构造函数继承 在构造函数中,同样属于两个新创建的函数,也是不相等的 function Fn...

peakedness丶
40分钟前
3
0
记一次面试最常见的10个Redis"刁难"问题

导读:在程序员面试过程中Redis相关的知识是常被问到的话题。作为一名在互联网技术行业打击过成百上千名的资深技术面试官,本文作者总结了面试过程中经常问到的问题。十分值得一读。 Redis在...

小刀爱编程
53分钟前
16
0
TiDB Lab 诞生记 | TiDB Hackathon 优秀项目分享

本文由红凤凰粉凤凰粉红凤凰队的成员主笔,他们的项目 TiDB Lab 在本届 TiDB Hackathon 2018 中获得了二等奖。TiDB Lab 为 TiDB 培训体系增加了一个可以动态观测 TiDB / TiKV / PD 细节的动画...

TiDB
今天
4
0
当区块链遇到零知识证明

本文由云+社区发表 当区块链遇到零知识证明 什么是零知识证明 零知识证明的官方定义是能够在不向验证者任何有用的信息的情况下,使验证者相信某个论断是正确的。这个定义有点抽象,下面笔者举...

腾讯云加社区
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部