zoukankan      html  css  js  c++  java
  • WebApi系列~基于单请求封装多请求的设计~请求的安全性设计与实现

    回到目录

    对于一个Http请求如何保证它的安全,这已经不是一个新的话题,对于请求的安全我们通常考虑的无非就是"请求的被篡改性"和"请求的被复制性",第一个问题我们很容易实现,可以通过参数+密钥的方式,而第二个问题就很难实现了,到目前为止也没有一个统一的标准,今天我们要说的安全性,也主要针对的第一种来讲的.

    对于一个URL地址来说,可能是这样的格式

    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需要进行这种安全性验证的话,直接在方法上添加这个特性即可

     /// <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);
                }
    
            }
        }

    使用时非常简单,呵呵

         [ApiValidateFilter]
            public JsonResult AddHello(string username, string password, string email)
            {
                return Json(new { Message = username + password + email }, JsonRequestBehavior.AllowGet);
            }

    在系统架构的世界里,我们需要的已经对问题的抽象,对代码的重构,这种重构是不断的,反复的,我一直不相信"有一次写好的代码",代码是在不断的重构中完美的!

    回到目录

  • 相关阅读:
    python3 接口测试 一般方法
    python2 接口测试一般方法.
    Postman 官网教程,重点内容,翻译笔记,
    Unity3D --对撞机/碰撞器 介绍
    MyBatis之配置文件与操作
    Eclipse连接mysql数据库jdbc下载(图文)
    MyBatis概述和环境的搭建
    样式加载不出来,浏览器控制台报错:Resource interpreted as Stylesheet but transferred with MIME type text/html
    bootstrap之navbar
    JSP中的内置标记(JSP动作)和 EL表达式
  • 原文地址:https://www.cnblogs.com/lori/p/4499371.html
Copyright © 2011-2022 走看看