JFinal-layui v1.4.2 强势来袭,XSS、CSRF防御、代码器
JFinal-layui 极速开发企业应用管理系统,是以 JFinal+layui 为核心的企业应用项目架构,利用 JFinal 的特性与 layui 完美结合,达到快速启动项目的目的。让开发更简单高效,即使你不会前端layui,也能轻松掌握使用。
JFinal-layui v1.4.2 新增XSS、CSRF防御和代码生成器,加强web安全和提升开发效率!在工作中发现,一些公司在给客户开发系统的时候,都很容易忽略了web安全的内容,或者根本不考虑web安全漏洞,所以这样开发出来的系统本身就是存在很大的安全隐患,只要稍微有点技术的人员就能进行XSS攻击和CSRF跨站请求伪造!因为本人有过一段难忘的web安全漏洞修复的经历,所以把积累的一些经验应用到JFinal-layui中,让系统更加安全可靠!
v1.4.2更新内容详情:
一、XSS攻击防御
JFinal-layui主要是对XSS的存储型攻击进行防御,把用户输入的数据都进行XSS过滤,避免对系统造成不良影响。利用JFInal的Handler来实现,重写HttpServletRequestWrapper非常简单。
1、自定义XssHttpServletRequestWrapper类,重写getParameter:
/** * xss过滤处理 * @author QinHaiLin * @date 2020-02-13 */ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper{ public XssHttpServletRequestWrapper(HttpServletRequest request) { super(request); } /** * 重写并过滤getParameter方法 */ @Override public String getParameter(String name) { return getBasicHtmlandimage(super.getParameter(name)); } /** * 重写并过滤getParameterValues方法 */ @Override public String[] getParameterValues(String name) { String[] values = super.getParameterValues(name); if (null == values){ return null; } for (int i = 0; i < values.length; i++) { values[i] = getBasicHtmlandimage(values[i]); } return values; } /** * 重写并过滤getParameterMap方法 */ @Override public Map<String,String[]> getParameterMap() { Map<String,String[]> paraMap = super.getParameterMap(); // 对于paraMap为空的直接return if (null == paraMap || paraMap.isEmpty()) { return paraMap; } //super.getParameterMap()不允许任何修改,所以只能做深拷贝 Map<String, String[]> paraMapCopy = new HashMap<String, String[]>(); //实际上putAll只对基本类型深拷贝有效,如果是自定义类型,则要找其他办法 paraMapCopy.putAll(paraMap); for (Map.Entry<String, String[]> entry : paraMapCopy.entrySet()) { String[] values = entry.getValue(); if (null == values) { continue; } String[] newValues = new String[values.length]; for (int i = 0; i < values.length; i++) { newValues[i] = getBasicHtmlandimage(values[i]); } entry.setValue(newValues); } return paraMapCopy; } private static String getBasicHtmlandimage(String html) { if (html == null) return null; return Jsoup.clean(html, Whitelist.basicWithImages()); } }
2、新建XssHandler拦截器:
/** * xss拦截器 * @author QinHaiLin * */ public class XssHandler extends Handler { // 排除的url,使用的target.startsWith匹配的 private String excludePattern; /** * 忽略列表,使用正则排除url * @param exclude */ public XssHandler(String excludePattern) { this.excludePattern = excludePattern; } @Override public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) { java.util.regex.Pattern pattern = Pattern.compile(excludePattern); //带.表示非action请求,忽略(其实不太严谨,如果是伪静态,比如.html会被错误地排除);匹配excludePattern的,忽略 if (target.indexOf(".") == -1 && !(!StringUtil.isBlank(excludePattern) && pattern.matcher(target).find() ) ){ request = new XssHttpServletRequestWrapper(request); } next.handle(target, request, response, isHandled); } }
3、在MainConfig里面配置XssHandler拦截器,那么对XSS的存储型攻击就可以进行有效的防御了。
/** * 配置全局处理器 */ @Override public void configHandler(Handlers me) { /** 配置druid监控 **/ me.add(DruidKit.getDruidStatViewHandler()); // 路由处理 me.add(new CommonHandler()); // XSS过滤 me.add(new XssHandler("^\\/portal/form/view.*")); }
二、CSRF跨站请求伪造防御
针对CSRF跨站请求伪造,JFinal-layui主要是对添加、修改的业务表单加入token验证机制,这样就可以解决重要业务操作的安全性。我们的拦截是全局验证拦截,在开发功能过程中就是顺手做的事情,简单高效。
1、利用JFinal的token机制,创建自己的TokenService:
/** * token * @author QinHaiLin * @date 2020-02-14 */ public class TokenService { /** * 创建token * @param c */ public void createToken(Controller c){ TokenManager.createToken(c, Const.DEFAULT_TOKEN_NAME, Const.DEFAULT_SECONDS_OF_TOKEN_TIME_OUT); } /** * 验证token * @param c */ public boolean validateToken(Controller c){ return TokenManager.validateToken(c, Const.DEFAULT_TOKEN_NAME); } }
2、再创建TokenInterceptor的拦截器进行全局拦截验证:
/** * token拦截器 * @author QinHaiLin * @date 2020-02-13 */ public class TokenInterceptor implements Interceptor { @Inject TokenService tokenService; @Override public void intercept(Invocation inv) { Controller c=inv.getController(); String methName=inv.getMethod().getName(); //给默认的添加、修改方法添加token if(methName.equals("add")||methName.equals("edit")){ tokenService.createToken(c); } //验证token if(methName.equals("save")||methName.equals("update")){ boolean b=tokenService.validateToken(c); if(!b){ boolean isAjax="XMLHttpRequest".equalsIgnoreCase(c.getHeader("X-Requested-With")); if(isAjax){ c.renderJson(Ret.fail("msg", "token验证不通过,请刷新页面")); }else{ c.setAttr("msg", "token验证不通过"); c.renderError(403); } return; } //添加修改成功后,返回对的页面,此处是解决业务验证不通过的情况,如:添加用户时,如果存在用户编号,那么需要重新填写,此时就要重新赋值新的token tokenService.createToken(c); } inv.invoke(); } }
3、在MainConfig配置成全局拦截器即可:
/** * 配置全局拦截器 */ @Override public void configInterceptor(Interceptors me) { me.addGlobalActionInterceptor(new SessionInViewInterceptor()); me.addGlobalActionInterceptor(new SessionInterceptor()); me.addGlobalActionInterceptor(new ExceptionInterceptor()); //表单token验证拦截器 me.addGlobalActionInterceptor(new TokenInterceptor()); me.addGlobalActionInterceptor(new LoggerInterceptor()); }
4、在添加修改的操作表单输出token:#(token)
三、代码生成器
为满足广大用户要求,还是决定把代码生成器集成进来,那么有了这一神器,就可以把那些繁琐重复的开发工作交给代码器了,一键多表生成代码文件,页面操作简单,直接生成代码文件到项目当中,刷新重启项目即可。
1、代码生成器操作页面,选择需要的表,可多选,点击选择按钮即可:
2、点击生成代码,这是预览代码,还没有真正创建代码文件,点击下载代码才是最终在项目中创建:
3、点击下载代码,创建文件:
4、刷新项目,就能在预先设置的package里面创建对应的Java文件了,html目录也是按照相应规则创建对应的目录:
java文件: html文件:
5、此时代码文件已经创建好了,还需要最关键的一步,那就是把_MappingKit.java里面在数据库表映射关系配置到主配置文件中:
6、最后就是启动项目,配置菜单权限即可访问了。
友情链接:
社区交流:JFinal-layui社区
源码下载:JFinal-layui
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Websocket IM聊天教程-教你用GoEasy快速实现IM聊天
本文会持续在OSChina码云上更新,最新版本请访问https://gitee.com/goeasy-io/GoEasyDemo-IM-Chat 经常有朋友问起GoEasy如何实现IM,今天就手把手的带大家从头到尾用GoEasy实现一个完整IM聊天。 今日的前端技术发展可谓百家争鸣,为了确保本文能帮助到使用任何技术栈的前端工程师,Demo的源码实现上选择了最简单的HTML+JQuery的方式,所以,不论您是准备用Uniapp开发移动APP,还是准备写个小程序,不论你喜欢用React还是VUE,还是React-native或ionic, 或者您直接用原生Javascript和Typescript,都是可以轻松理解,全套代码开源在OSCHINA码云(https://gitee.com/goeasy-io/GoEasyDemo-IM-Chat)上了,下载后不需要搭建任何环境,直接用浏览器打开,就可以用来聊天了。 作为一名程序员,在编码之前,首先要做的当然是架构设计!什么?确认不是装逼?当然,别忘了星爷的那句话:我是一名程序员!没有思想的程序员,跟咸鱼有什么区别呢? 咳咳咳,正文开始: 首先我...
- 下一篇
TeaWeb v0.1.10 发布,支持正向代理,改进 Websocket、WAF
TeaWeb是一个可视化的Web代理服务,目标是将代理服务、日志、统计、监控等集成在同一个服务中,让开发者简单地启动就可以使用。 v0.1.10主要支持正向代理,改进Websocket、WAF。 系统 实现守护进程,防止意外退出进程 操作日志中记录失败的登录 反向代理 添加域名是否严格匹配选项 代理网络地址支持端口范围,比如"0.0.0.0:[8100-8200]" 后端服务器地址中支持变量 增加${host.first}、${host.last}、${host.0}、${host.1}。。。等请求变量 路径规则增加禁用条件以及是否禁止所有访问选项 自定义请求Header保留原有大小写 WebSocket连接失败时返回状态码改成500 WAF 增加拦截日志 增加拦截类型统计项目 CC统计增加用户识别读取来源、用户识别字段、字段读取位置等,以便于更灵活地区分用户 规则集动作支持跳转到下一个规则分组或者下一个规则集 正向代理 实现基本的正向代理(暂无认证机制) 可以记录请求和响应Body 实现MITM模式,并能记录HTTPS通讯日志 最近的一些更新: v0.1.9: 支持MySQL、Pos...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Red5直播服务器,属于Java语言的直播服务器
- CentOS6,CentOS7官方镜像安装Oracle11G
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装