各位在jfinal项目中怎么应对XSS漏洞?

当jFinal遇到XSS该怎么处理呢?


评论区

JFinal

2016-11-24 14:27

用 jsoup 这个工具类过滤一下用户提交的数据即可,一行代码的事:
Jsoup.clean(html, Whitelist.basicWithImages());
如果要对过滤放宽松点用这行:
Jsoup.clean(html, Whitelist.relaxed());

在具体实践中,可以扩展一下 BaseModelGenerator,再多生成 save() 与 update() 方法,这两个方法是用户提交数据的大部分入口,在这两个方法中添加过滤即可

jfinal 2.3 在 model 中提供了一个 filter() 方法,可以让开发者在自己的 model 中覆盖此方法,添加上过滤功能,也是一行代码的事,2.3 上线之前可以选通过前面介绍的主法,或者直接在最终的 model 中手动创建 save()、update() 进行过滤

JFinal

2016-11-24 14:32

此外,还可以通过使用拦截器,或者在handler 中通过替换 HttpServletRequest 对象的方式来做,这里有一个 handler 实现参考:
http://blog.dreamlu.net/blog/57

rocker18

2017-01-22 19:47

@JFinal 非常感谢!

JFinal

2017-01-22 19:49

@rocker18 如果你加入了俱乐部,看一下 jfinal-club 项目中的 XSS 过滤的代码,直接可用

sdfsf

2017-01-23 09:56

@JFinal 3.0二维码生成不了

JFinal

2017-01-23 19:22

@sdfsf 本站的微信捐助二维码就是用的 3.0 的 renderQrCode(...) 非常好使,你注意看一下异常是什么,很容易解决

why

2017-04-24 18:39

@JFinal 在model的filter做html编码,会污染入库的原始数据,在web上显示数据没有问题,但当数据返回到移动客户端,就会出问题了,显示出来的都是编码后的数据。目前想到的第一种方法是用自定义Directive,但是在html里面很多地方都会用上,重复写了很多#encodeHtml()。第二种方法是在model上面增加一个encodeHtml()方法,对提供给后台使用的每一个controller接口做model.encodeHtml()操作,缺点也是每一个后台接口都需要做这部分重复操作。有没有更好的方法在出口上面做安全编码?

JFinal

2017-04-24 20:29

@why jfinal template engine 已经提供了 #escape(...) 这个指令来处理,可以用一用

此外,在 model 中使用 filter 可以利用 jsoup 很精准地指定要过滤的标签类型,属性,例如过滤 script 标签,对于原始数据并不存在多少污染,因为类似于 script 这样的标签是一定要过滤掉的

why

2017-04-25 10:24

@JFinal 非常感谢!我在 model 中使用 filter 可以利用 jsoup过滤标签会存在两个问题。1.如果过滤的字段可以为null,要做特殊处理否则会抛出异常。2.如果用户插入的内容只有一个script标签,而使用jsoup过滤掉,最后就会剩下一个空字符串直接放入数据库,空字符串入库感觉不太合适。#escape标签比较好用,想出另一种折中的方案,把escape的逻辑提取到工具类,对于需要做编码的model,增加一个encodeHtml方法,在模板上使用的时候通过#(x.encodeHtml() ??)把内容编码一次,在ajax接口上使用的时候则单独在java代码里面调用一次,返回移动端的接口则不做处理,虽然有点麻烦,但几种类型的接口都能兼顾到。

JFinal

2017-04-25 10:42

@why jfinal 只提供最简单最直白的解决方案,具体到应用中大家如何组合搭配,就看大家的喜好,以及应用场景了, just do it

a铖

2017-05-18 15:28

参考 http://blog.dreamlu.net/blog/57 发现有些问题,改了一下, http://www.jfinal.com/share/281

热门反馈

扫码入社