1. 程式人生 > >資料物件安全校驗(oval框架)

資料物件安全校驗(oval框架)

很多時候我們都是忽略了物件資料的合法性,以為簡單通過前臺的js驗證下是否正確就可以了,這後果比較讓人但疼,下面舉例個簡單的例子,頁面需要使用者提交個簡介,使用者

這個時候可以寫指令碼在這個內容裡,你說你在js有校驗合法性,但是你要明白,現在的抓包工具是可以等你提交的時候,攔截住請求,然後通過編輯器修改了提交的值來繞過前臺的js

驗證,這樣就造成了資料的不合法,所以如果資料安全要求高的,必須在後臺再次驗證合法性,下面我講下選擇的這個物件校驗框架---oval

OVal 是一個可擴充套件的Java物件資料驗證框架,驗證的規則可以通過配置檔案、Annotation、POJOs 進行設定。可以使用純 Java 語言、

JavaScript 、Groovy 、BeanShell 等進行規則的編寫。網上資料是很少,所以自己學習的時候碰壁比較多

oval框架可以支援xml,註解配置,我個人傾向於xml配置,因為不想看到一個實體類的欄位上寫了n多的註解,所以下面我說下如何使用這個框架,灰常簡單,暴力,靈活,不需要與頁面的表單層打交道

先看看如何單獨使用,比較簡單

  1. public static void main(String[] args) {  
  2.         try {  
  3.             XMLConfigurer configurer = new XMLConfigurer(new File("valid-oval.xml"));  
  4.             Validator validator = new Validator(configurer);  
  5.             List<ConstraintViolation>violations = validator.validate(new Object());  
  6.             for (ConstraintViolation violation : violations) {  
  7.                 System.out.println(violation.getMessage());  
  8.             }  
  9.         } catch (IOException e) {  
  10.             e.printStackTrace();  
  11.         }  
  12.     }  

直接通過validate方法傳入你需要校驗的物件即可,然後看看valid-oval.xml配置檔案該如何寫
  1. <?xmlversion="1.0"?>
  2. <oval
  3.   xmlns="http://oval.sf.net/oval-configuration"
  4.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5.   xsi:schemaLocation="http://oval.sf.net/oval-configuration http://oval.sourceforge.net/oval-configuration.xsd">
  6.   <constraintSetid="testPattern">
  7.     <notNull/>
  8.     <matchPatternmessage="只允許純數字組合">
  9.       <patternpattern="[0-9]+"flags="0"/>
  10.     </matchPattern>
  11.   </constraintSet>
  12.   <classtype="com.silvery.project.cms.model.Authority"overwrite="false"applyFieldConstraintsToSetter="true">
  13.     <fieldname="name">
  14.       <maxSizemax="5"message="最多允許{max}個字元"/>
  15.       <assertConstraintSetid="testPattern"/>
  16.     </field>
  17.     <fieldname="content">
  18.       <assertConstraintSetid="testPattern"/>
  19.     </field>
  20.   </class>
  21. </oval>

有預設的校驗實現,有可自定義正則校驗,完全可以滿足你需要擴充套件的野心(不得不說有個深坑,我首次下載的是oval-1.84版本,自定義正則死活拋異常,然後換了個1.8的版本馬上可以,不知道是不是我的用法有問題,還是bug,有空再仔細研究)

下面再看看如何與spring結合配置

先宣告一個validator校驗器

  1. <description>OVAL資料校驗器配置</description>
  2.     <beanid="validator"class="net.sf.oval.Validator">
  3.         <constructor-arg>
  4.             <list>
  5.                 <beanclass="net.sf.oval.configuration.xml.XMLConfigurer">
  6.                     <constructor-argtype="java.io.InputStream"value="classpath:valid-oval.xml"/>
  7.                 </bean>
  8.             </list>
  9.         </constructor-arg>
  10.     </bean>


然後類裡面直接注入validator即可

  1. @Autowired(required = false)  
  2.     protected Validator validator;  

  1. if (!validModel) {  
  2.             return viewResult.setFormValid(true);  
  3.         }  
  4.         Validator validator = getValidator();  
  5.         if (validator != null) {  
  6.             List<ConstraintViolation>violations = getValidator().validate(obj);  
  7.             if (!isNull(violations)) {  
  8.                 viewResult.setFormValid(false);  
  9.                 viewResult.setFormErrors(validErrorToList(violations));  
  10.             } else {  
  11.                 viewResult.setFormValid(true);  
  12.             }  
  13.         }  
  14.         return viewResult;  

下面再看看如何使用註解的方式,雖然這個更方便,但是我覺得還是xml配置比較好管理

  1. private static class TestEntity  
  2. {  
  3.   @Min(1960)  
  4.   private int year = 1977;  
  5.   @Range(min=1max=12)  
  6.   private int month = 2;  
  7.   @ValidateWithMethod(methodName = "isValidDay"parameterType = int.class)  
  8.   private int day = 31;  
  9.   private boolean isValidDay(int day)  
  10.   {  
  11.     GregorianCalendar cal = new GregorianCalendar();  
  12.     cal.setLenient(false);  
  13.     cal.set(GregorianCalendar.YEAR, year);   
  14.     cal.set(GregorianCalendar.MONTH, month - 1);  
  15.     cal.set(GregorianCalendar.DATE, day);  
  16.     try {  
  17.       cal.getTimeInMillis(); // throws IllegalArgumentException  
  18.     } catch (IllegalArgumentException e) {   
  19.       return false;  
  20.     }  
  21.     return true;  
  22.   }  
  23. }  
RE: http://blog.csdn.net/shadowsick/article/details/40345019 

相關推薦

資料物件全校(oval框架)

很多時候我們都是忽略了物件資料的合法性,以為簡單通過前臺的js驗證下是否正確就可以了,這後果比較讓人但疼,下面舉例個簡單的例子,頁面需要使用者提交個簡介,使用者 這個時候可以寫指令碼在這個內容裡,你說你在js有校驗合法性,但是你要明白,現在的抓包工具是可以等你提交的時候

WebAPI接口全校

nic apps 驗證 時區 image 用戶數據 unix ger nlog 通過網上查看相關WebAPI接口驗證的方法,整理了一下,直接上代碼,功能不復雜,有問題留言, //---------------------------------------------

關於全校程式碼的一些心得

前言 我以前寫程式碼的時候沒有這個意識 但是看視訊教程或者看其他人寫的程式碼,發現前面都有一大堆這些冗雜程式碼,可能核心程式碼只有一兩句 比如說,判斷字典是否為空,按鈕是否重複點選,try catc

CXF動態客戶端呼叫JDK自帶Webservice全校

        專案中有個需求,需要使用CXF動態客戶端呼叫webservice服務端,這個服務端是JDK自帶的webservice釋出的,而且我們需要在呼叫時傳入使用者名稱和密碼。網上CXF客戶端和服務端配套使用webservice的方法很多,這裡不再贅述,這裡主要講下我

利用JWT判斷使用者登入以及全校

廢話不多說,直接上程式碼,自己之前寫過一篇介紹token的,有興趣的話可以去翻看下。 1.首先先引用jar,專案是maven,貼出程式碼: <!-- jwt --> <depen

php介面全校原理

php做APP介面時,如何保證介面的安全性? 1、當用戶登入APP時,使用https協議呼叫後臺相關介面,伺服器端根據使用者名稱和密碼時生成一個access_key,並將access_key儲存在session中,將生成的access_key和session_id返回

shiro安全框架擴充套件教程--設計資料物件器,如何防止xss以及csrf攻擊

       很多時候我們都知道,xss,csrf都需要通過我們前臺傳入的資料,然後再輸出到頁面,渲染成可執行指令碼,導致載入頁面即可執行或者被動型的讓使用者點選各種常用的按鈕來觸發指令碼效果,所以我們需要嚴格篩選以及控制過濾資料物件的各個屬性欄位值,我相信很多人都用vali

Java第十六天學習筆記(基本資料物件、集合框架

基本資料物件 基本資料型別物件包裝類          * 為了方便操作基本資料型別值,將其封裝成了物件,在物件中定義了屬性和行為豐富了該資料的操作。          * 用

卓 網絡 框架 視頻

targe == andro 開發 click url www. data nth 韓夢飛沙 韓亞飛 [email protected] yue31313 han_meng_fei_sha 安卓 網絡 框架 視頻 ========= 《老羅Android開

卓 log日誌框架

intent targe public exceptio eba als gad imp prior ◆elvishew/xLog 框架特性介紹 Global config(tag, formatters...) or log-based config Support

裝運行symfony框架編寫的edusoho開源程序

分享 proc vpd fff 安裝 oca github china shadow mac電腦。×××地址:http://www.github.com/edusoho/edusoho官網:http://www.edusoho.com/ 按此教程先安裝和設置symfony:

java modbus crc16校碼 socket給傳送的資料新增crc校

首先crc16校驗碼的生成的原理在上一篇部落格裡面已經說過了; 前提:xframe配置京金華伺服器的埠號,繫結ip地址和埠號 程式要實現什麼? 這個程式主要實現的是伺服器傳送資料到客戶端,然後客戶端傳送資料到伺服器端; 是一問一答的形式; 只有伺服器傳送,客戶端才會應答 傳送

ajax的get方法獲取資料,對資料物件賦值

ajax方法獲取資料 用vue寫一個方法將後臺資料渲染到table表格(iview表單) 首先,在div中插入table元件: <Table border height=226 :columns="columns1" :

實驗二 資料物件的定義、單表資料查詢

實驗內容 1、建立資料庫Student_DB,並在此資料庫中用命令方式建立資料表(注意表中列的相關約束): 學生表:Student(Sno, Sname, Ssex, Sage, Sdept); 課程表:Course(Cno, Cname, Cpno, Ccredit); 學生選課表:S

pickle模組以特殊的二進位制格式儲存和恢復資料物件

先用pickle模組進行資料物件的儲存 1 import pickle 2 3 data1 = {'a': [1, 2, 3, 9], 4 'b': ('string', 'Unicode string'), 5 'c': ('True',

Oracle資料庫資料物件分析 下

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

資料結構個人總結和程式框架

線性表 順序逆序  單向連結串列 雙向連結串列  迴圈連結串列 靜態連結串列   順序儲存方式 地址計算方法 c語言中陣列從0開始第一個下標 所以知道某一點地址 ai=a1+(i-1)*c 順序儲存結構需要的演算法思路兩個 插入演算法思路 1 插入

redis 系列15 資料物件的(型別檢查,記憶體回收,物件共享)和資料庫切換

redis 系列15 資料物件的(型別檢查,記憶體回收,物件共享)和資料庫切換 一.  概述   對於前面的五章中,已清楚了資料物件的型別以及命令實現,其實還有一種資料物件為HyperLogLog,以後需要用到再瞭解。下面再瞭解型別檢查,記憶體回收,物件共享,物件的空轉時長。

通過SAP函式組GOX_OBJECTS_GENERATE中的函式建立資料物件(域,資料元素,表)

  *&---------------------------------------------------------------------* *& Report ZRCP10 *&-------------------------

一起來學大資料|優秀的持久層框架Mybatis,連線資料庫快人一步

  我們之前學習了JDBC和連線池之後,攻城獅們對程式設計的效率仍然不是很滿意。於是乎!有了今天更加優秀的內容,那就是Mybatis框架。它的出現解決了jdbc中的一些問題,提升了程式碼的魯棒性。我們一起來看一下吧~ 一起來學大資料|Java與資料庫之間的連線JDBC