回到目錄html
對於一個Http請求如何保證它的安全,這已經不是一個新的話題,對於請求的安全咱們一般考慮的無非就是"請求的被篡改性"和"請求的被複制性",第一個問題咱們很容易實現,能夠經過參數+密鑰的方式,而第二個問題就很難實現了,到目前爲止也沒有一個統一的標準,今天咱們要說的安全性,也主要針對的第一種來說的.json
對於一個URL地址來講,多是這樣的格式api
http://www.domain.com?vid=1&type=3&main=ok
對上面地址進行安全防篡改以後,可能地址就變成了這樣安全
http://www.domain.com?vid=1&type=3&main=ok&cipherText=e10adc3949ba59abbe56e057f20f883e
其中cipherText咱們叫作密文,它由全部參數名+參數值+鑰密再進行md5生成的,其中鑰密是不公開的,在數據傳遞過程當中,只要修改任意參數,你生成的cipherText就與咱們正確的值不一樣,這時,你的驗證就是不經過的,呵呵.架構
對此,我把這套邏輯進行了抽象,提取到了特性裏(過濾器),若是你的action須要進行這種安全性驗證的話,直接在方法上添加這個特性便可app
/// <summary> /// api數據安全性驗證 /// </summary> [AttributeUsage(AttributeTargets.Method)] public class ApiValidateFilter : System.Web.Mvc.ActionFilterAttribute { public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext) { var request = filterContext.HttpContext.Request; var method = request.HttpMethod; var passKey = "tsingda123"; var paramStr = new StringBuilder(); foreach (string param in request.Form.Keys) { if (param != "cipherText") paramStr.Append(request.Form[param]); } paramStr.Append(passKey); if (VCommons.Encryptor.Utility.EncryptString(paramStr.ToString(), VCommons.Encryptor.Utility.EncryptorType.MD5) != request.Form["cipherText"]) { //驗證失敗 filterContext.HttpContext.Response.ContentType = "applicatin/json"; filterContext.HttpContext.Response.Write(VCommons.SerializeMemoryHelper.SerializeToJson(new { Message = "驗證失敗" })); filterContext.HttpContext.Response.End(); } else { base.OnActionExecuting(filterContext); } } }
使用時很是簡單,呵呵dom
[ApiValidateFilter] public JsonResult AddHello(string username, string password, string email) { return Json(new { Message = username + password + email }, JsonRequestBehavior.AllowGet); }
在系統架構的世界裏,咱們須要的已經對問題的抽象,對代碼的重構,這種重構是不斷的,反覆的,我一直不相信"有一次寫好的代碼",代碼是在不斷的重構中完美的!ide
回到目錄ui