shiro安全框架擴充套件教程–設計資料物件校驗器,如何防止xss以及csrf攻擊
很多時候我們都知道,xss,csrf都需要通過我們前臺傳入的資料,然後再輸出到頁面,渲染成可執行指令碼,導致載入頁面即可執行或者被動型的讓使用者點選各種常用的按鈕來觸發
指令碼效果,所以我們需要嚴格篩選以及控制過濾資料物件的各個屬性欄位值,我相信很多人都用validator,但是我感覺這樣可訂製的靈活性是比較低的,然後我自己就想設計一個可插拔式,可訂製的校驗器;當我們的普通validator不再滿足到資料篩選的時候,可在第二重校驗器實現我們的資料過濾
我就不囉嗦為何要設計的背景了,下面我就帖程式碼說明下自己的設計思路
1.寫個總的校驗器介面,利用泛型規定返回檢視型別,還有校驗物件的型別
package com.silvery.plugin.validator; /** * 資料校驗器介面 * * @author shadow * * @param <R> * 檢視型別 * @param <T> * 校驗物件 */ public interface FormValidator<R, T> { public R validate(T t) throws FormValidateException; }
2.定義一個返回檢視的物件
package com.silvery.plugin.validator; import java.util.Map; /** * 資料校驗結果檢視 * * @author shadow * */ public class FormValidateResult { private boolean success; // true=成功;false=失敗 private Map<String, Object> errorMap; // 失敗對應資訊 public FormValidateResult() { this(false); } public FormValidateResult(boolean success) { this.success = success; } public boolean isSuccess() { return success; } public void setSuccess(boolean success) { this.success = success; } public Map<String, Object> getErrorMap() { return errorMap; } public void setErrorMap(Map<String, Object> errorMap) { this.errorMap = errorMap; } }
3.寫一個專門執行校驗器的執行類
package com.silvery.plugin.validator; import java.lang.reflect.Method; import java.util.List; import com.silvery.utils.ReflectUtils; /** * * 資料校驗器執行類 * * @author shadow * */ public class SimpleFormValidator<T> { /** * 表單校驗方法 * * @param t * 校驗資料物件 * @return 資料校驗檢視 * @throws FormValidateException * 校驗異常 */ public FormValidateResult validate(T t) throws FormValidateException { return validate(null, t); } /** * 表單校驗方法 * * @param validator * 使用者自定義校驗器 * @param t * 校驗資料物件 * @return 資料校驗檢視 * @throws FormValidateException * 校驗異常 */ public FormValidateResult validate(FormValidator<FormValidateResult, T> validator, T t) throws FormValidateException { FormValidateResult validateResult = new FormValidateResult(); // 優先執行使用者自定義校驗器,如不通過則跳出 if (validator != null) { validateResult = validator.validate(t); if (!validateResult.isSuccess()) { return validateResult; } } return validateForXSS(t); } /** 校驗是否存在XSS攻擊指令碼,當前只檢測String型別宣告欄位 */ private FormValidateResult validateForXSS(T t) { List<Method> methods = ReflectUtils.getMethods(t.getClass()); for (Method method : methods) { if (method.getName().startsWith("set")) { Class<?>[] parameterClass = method.getParameterTypes(); // 引數不能為null, 引數只有一個, 引數型別只能是String if (parameterClass != null && parameterClass.length == 1 && parameterClass[0].equals(String.class)) { // ReflectUtils.writeValueByMethod(t, method, "test"); } } } return new FormValidateResult(true); } }
4. 實現我們的校驗器介面,自己寫所需邏輯過濾
package com.silvery.project.cms.validator; import java.util.HashMap; import java.util.Map; import com.silvery.plugin.validator.FormValidateException; import com.silvery.plugin.validator.FormValidateResult; import com.silvery.plugin.validator.FormValidator; import com.silvery.project.cms.model.Authority; /** * 許可權實體資料校驗器實現 * * @author shadow * */ public class AuthorityFormValidator implements FormValidator<FormValidateResult, Authority> { @Override public FormValidateResult validate(Authority t) throws FormValidateException { // TODO do some validate operate FormValidateResult formValidateResult = new FormValidateResult(); Map<String, Object> errorFieldMap = new HashMap<String, Object>(); formValidateResult.setSuccess(true); formValidateResult.setErrorMap(errorFieldMap); return formValidateResult; } }
4. 工作都準備得差不多的話,就開始接入到我的業務
/** 校驗物件資料合法性 */ protected ServiceResult<T> validateForm(ServiceResult<T> serviceResult, T t) throws FormValidateException { FormValidateResult formValidateResult = new SimpleFormValidator<T>().validate(initFormValidator(), t); if (formValidateResult.isSuccess()) { return serviceResult.setSuccess(true); } else { return formValidateResult2ViewResult(serviceResult, formValidateResult); } }
@Override public ServiceResult<T> insert(T model) { ServiceResult<T> serviceResult = createServiceResult(); try { serviceResult = validateForm(serviceResult, model); if (!serviceResult.isSuccess()) { return serviceResult; } int count = getDefaultDao().insert(model); if (count > 0) { serviceResult.setSuccess(true).setMessage( new StringBuffer("成功儲存[").append(count).append("]條記錄").toString()); } else { serviceResult.setMessage("沒有儲存到任何記錄"); } } catch (Exception e) { logErrorResult(serviceResult, e); } return serviceResult; }
後語, 我也沒有寫明確的xss,csrf過濾規則,我只是提供一個可無縫接入業務的校驗器實現,可以讓你動態修改裡面的資料,或者是攔截資料,希望對大家有幫助
相關文章
- shiro安全框架擴充套件教程–如何防止可執行檔案的入侵攻擊框架套件
- WEB安全入門:如何防止 CSRF 攻擊?Web
- 前端安全系列之二:如何防止CSRF攻擊?前端
- PHP如何防止XSS攻擊PHP
- 前端安全系列(一):如何防止XSS攻擊?前端
- SameSite Cookie,防止 CSRF 攻擊Cookie
- Solon詳解(六)- Solon的校驗擴充套件框架使用與擴充套件套件框架
- 雜湊擴充套件攻擊套件
- 前端實現csrf防止攻擊前端
- shiro安全框架擴充套件教程--如何擴充套件實現我們的快取機制(第三方容器redis,memcached)框架套件快取Redis
- XML 實體擴充套件攻擊XML套件
- XSS攻擊和CSRF攻擊有什麼區別?
- Chrome 擴充套件程式可防止基於 JavaScript 的 CPU 旁路攻擊Chrome套件JavaScript
- 什麼是SQL隱碼攻擊、XSS以及CSRF?【網路安全知識培訓】SQL
- shiro安全框架擴充套件教程–異常退出沒有清除快取資訊處理方案框架套件快取
- XSS 與 CSRF 攻擊——有什麼區別?
- 前端面試查漏補缺--(七) XSS攻擊與CSRF攻擊前端面試
- 如何有效防禦XSS攻擊?網路安全學習教程
- 總結 XSS 與 CSRF 兩種跨站攻擊
- 建議收藏!XSS與CSRF攻擊防範措施
- CSRF攻擊
- CSRF 攻擊
- 前端安全之XSS攻擊前端
- Java 安全之:csrf攻擊總結Java
- INFORMIX表的預設初始擴充套件、下一個擴充套件資料塊以及一個表允許的最大擴充套件數。ORM套件
- 【技術乾貨】XSS攻擊、CSRF攻擊基本概念及防範方法
- 使用java的HTML解析器 jsoup來防止XSS攻擊JavaHTMLJS
- asp.net 站點如何有效簡潔的防止XSS攻擊ASP.NET
- Spring中防止跨站指令碼 (XSS)攻擊Spring指令碼
- 網站如何防止攻擊網站
- ReactiveUI是.NET的Reactive程式設計擴充套件框架ReactUI程式設計套件框架
- 如何防止網站資料庫被攻擊 被篡改網站資料庫
- 資料庫擴充套件表設計過程記錄資料庫套件
- 可動態擴充套件的資料庫模型設計套件資料庫模型
- 【web安全】深入淺出XSS攻擊Web
- Web 安全漏洞之 XSS 攻擊Web
- Web安全防範-----防止重放攻擊Web
- 在Linux中,如何檢測和防止SQL隱碼攻擊和跨站指令碼(XSS)攻擊?LinuxSQL指令碼