打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
shiro安全框架扩展教程--基本行级数据安全控制

         大家都知道shiro方法级,请求级保障是不错的,但是对于对于具体的行级数据安全控制是比较无力的,但是我们总是需要用一些手段来保证数据级的安全,举个比较简单的说明,

有合法登录A和B用户,A用户通过方法findById=A可以加载出自己的信息并修改密码,这个时候用户B可以通过findById=A也可以加载出A的信息,这样简单的入侵方式比较简单,

只要使用编辑器改动下表单的提交值即可,如果严谨是没事的,但是总有那么一些人不会那么严谨,所以经常都是通过id直出直入查询到数据,导致用户资料泄漏被修改,

那么问题来了,我们该如何防止这样的低级攻击呢?


下面我提供一个比较简单的方案,希望抛砖引玉,如果有更好的方案请分享出来,互相学习


一般来说,我们更新,删除或者查询单个记录都是需要一个唯一键,例如id?别人可以编辑这个id的值获取其他记录的信息,这个时候我们可以加一个认证值给请求路径,防止只修改了id

即可认为是合法请求


下面上些代码


  1. <a href="#" onclick="removeById('/cms/user/removeById.do?id=${v.id}&rsv_=<@key id="${v.id}" />');return false;" style="cursor: pointer;">删除</a>  

看到后面删除的参数有一个rsv_,这个是认证值,如果单独修改id的值,但是没有修改出相应的rsv_值那是认为是非法请求,因为id和rsv_是配套,通过一定算法出来的关联


而这里我的<@key id="${v.id}" /> 这个是我自定义的freemarker标签,相信看过前面的文章也知道该如何配置使用,下面我展示下生成的rsv_标签类


  1. package com.silvery.core.freemarker;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.Map;  
  5.   
  6. import com.silvery.utils.ShortLinkUtils;  
  7.   
  8. import freemarker.core.Environment;  
  9. import freemarker.template.TemplateDirectiveBody;  
  10. import freemarker.template.TemplateDirectiveModel;  
  11. import freemarker.template.TemplateException;  
  12. import freemarker.template.TemplateModel;  
  13.   
  14. /**  
  15.  *   
  16.  * FreeMarker自定义标签,生成编号认证  
  17.  *   
  18.  * @author shadow  
  19.  *   
  20.  */  
  21. public class KeyTag implements TemplateDirectiveModel {  
  22.   
  23.     @SuppressWarnings("unchecked")  
  24.     public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody directiveBody)  
  25.             throws TemplateException, IOException {  
  26.   
  27.         Object id = params.get("id");  
  28.         validate(id, null);  
  29.   
  30.         env.getOut().write(ShortLinkUtils.getSingleLink(id.toString()));  
  31.   
  32.     }  
  33.   
  34.     private void validate(Object id, Object body) throws TemplateException {  
  35.         if (id == null || id.toString().trim().equals("")) {  
  36.             throw new TemplateException("参数[id]不能为空", null);  
  37.         }  
  38.     }  
  39.   
  40. }  

然后看我们的请求拦截器,如何判断是否合法请求


  1. package com.silvery.core.spring.handler;  
  2.   
  3. import java.text.SimpleDateFormat;  
  4. import java.util.Date;  
  5.   
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpServletResponse;  
  8.   
  9. import org.slf4j.Logger;  
  10. import org.slf4j.LoggerFactory;  
  11. import org.springframework.web.servlet.HandlerInterceptor;  
  12. import org.springframework.web.servlet.ModelAndView;  
  13.   
  14. import com.silvery.utils.ShortLinkUtils;  
  15.   
  16. public class SystemHandler implements HandlerInterceptor {  
  17.   
  18.     private final static Logger log = LoggerFactory.getLogger(SystemHandler.class);  
  19.   
  20.     @Override  
  21.     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object obj, Exception e)  
  22.             throws Exception {  
  23.     }  
  24.   
  25.     @Override  
  26.     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object obj, ModelAndView view)  
  27.             throws Exception {  
  28.     }  
  29.   
  30.     @Override  
  31.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {  
  32.         return validateSafeRequest(request, response, obj);  
  33.     }  
  34.   
  35.     /** 防止擅改数据提交 */  
  36.     private boolean validateSafeRequest(HttpServletRequest request, HttpServletResponse response, Object obj) {  
  37.         String newObj = request.getParameter("id");  
  38.         if (!isNull(newObj)) {  
  39.             String newToken = request.getParameter("rsv_");  
  40.             if (!isNull(newToken)) {  
  41.                 if (ShortLinkUtils.getSingleLink(newObj).equals(newToken)) {  
  42.                     return true;  
  43.                 }  
  44.             }  
  45.             log.error(new StringBuffer().append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())).append(  
  46.                     " [").append(obj).append("] ").append(" appear insecure request ").toString());  
  47.             return false;  
  48.         }  
  49.         return true;  
  50.     }  
  51.   
  52.     private boolean isNull(String s) {  
  53.         if (s == null || s.length() <= 0) {  
  54.             return true;  
  55.         }  
  56.         return false;  
  57.     }  
  58.   
  59. }  

这是spring-mvc的拦截器,当然你也可以用普通的filter,原理是一样


大概流程就是这样,相信大家都能理解,比较简单,比较实用,请随意喷,最多我去蓝翔再深造下回来咯...

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
freemarker(1)老紫竹的第一个freemaker程序 - freemarker ...
java如何生成word文档_使用Java生成word文档(附源码)
JEECMS自定义标签开发步骤
freemarker入门例子
spring boot2整合shiro安全框架实现前后端分离的JWT token登录验证
WEB安全实战(七)会话标识未更新
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服