国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
shiro安全框架擴展教程--基本行級數(shù)據(jù)安全控制

         大家都知道shiro方法級,請求級保障是不錯的,但是對于對于具體的行級數(shù)據(jù)安全控制是比較無力的,但是我們總是需要用一些手段來保證數(shù)據(jù)級的安全,舉個比較簡單的說明,

有合法登錄A和B用戶,A用戶通過方法findById=A可以加載出自己的信息并修改密碼,這個時候用戶B可以通過findById=A也可以加載出A的信息,這樣簡單的入侵方式比較簡單,

只要使用編輯器改動下表單的提交值即可,如果嚴謹是沒事的,但是總有那么一些人不會那么嚴謹,所以經(jīng)常都是通過id直出直入查詢到數(shù)據(jù),導致用戶資料泄漏被修改,

那么問題來了,我們該如何防止這樣的低級攻擊呢?


下面我提供一個比較簡單的方案,希望拋磚引玉,如果有更好的方案請分享出來,互相學習


一般來說,我們更新,刪除或者查詢單個記錄都是需要一個唯一鍵,例如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>  

看到后面刪除的參數(shù)有一個rsv_,這個是認證值,如果單獨修改id的值,但是沒有修改出相應的rsv_值那是認為是非法請求,因為id和rsv_是配套,通過一定算法出來的關聯(lián)


而這里我的<@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("參數(shù)[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.     /** 防止擅改數(shù)據(jù)提交 */  
  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,原理是一樣


大概流程就是這樣,相信大家都能理解,比較簡單,比較實用,請隨意噴,最多我去藍翔再深造下回來咯...

本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
freemarker(1)老紫竹的第一個freemaker程序 - freemarker ...
java如何生成word文檔_使用Java生成word文檔(附源碼)
JEECMS自定義標簽開發(fā)步驟
freemarker入門例子
spring boot2整合shiro安全框架實現(xiàn)前后端分離的JWT token登錄驗證
WEB安全實戰(zhàn)(七)會話標識未更新
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服