几种参数传递的性能与安全性比较

时间:2022-11-26 14:27:05

    我们在创建ASP.NET应用时,常常会碰到在页面之间传递参数的应用,在页面之间传递参数有好几种方法(Url地址法、Application/Session、Cache、Cookie),如何在页面之间有效的传递参数呢?下面我们来一一分析。     

Url地址法
     定义:在页面地址后面附带参数的方式浏览页面
     使用:我们可以用两种方法来传递Url地址在不同页面之间切换并且传递参数:
     服务器端方法(Response.Redirect) 在此方案中,服务器只是将上下文传输到另一页。其优点是您可以共享页之间的页上下文信息。其缺点是用户的浏览器不知道在进行传输,因此不更新浏览器的历史记录。如果用户刷新此页,则可能会产生意外的结果。例如:Server.Transfer("Test.aspx?ParaID=ParamValue");   

     使用浏览器(Server.Tansfer) 在此方案中,将一个命令发送到用户浏览器,使浏览器获取另一页。其优点是更新浏览器的历史记录。其缺点是此方案执行额外的往返过程,这会影响性能。
     例如:Response.Redirect("Test.aspx?ParamID=ParamValue");

                               性能及安全性分析
     性能: 

     1、只能传递字符型参数,且长度受限,传递对象要先手工序列化。
     2、Url地址法可以很方便的在页面之间切换并传递参数,无需额外的处理,基于正常情况比较不会性能损失。


     安全性:


     1、很容易导致错误:开发人员可能没有对参数和地址进行编码,参数可能包含一些非法字符从而导致错误;
     2、信息泄露:Url地址在客户端可见,导致会泄露信息,可能被黑客用来攻击系统。比如有些网站通过这个方法在页面传递一些关键参数,导致某些专业用户只需要适当修改这个Url中的参数值就可以获得额外的访问权限,进行非授权的操作,这显然是我们所不期望的。
     
     建议:

     1、地址要编码;

     2、参数加密,但带来性能损失。

     3、在安全性要求较高的系统中我们不推介使用这种方法,他只适合在一些安全性要求不高,页面逻辑比较的简单的的场合。

     Tips:在页面跳转时将 Response 对象的 BufferOutput 属性设置为 true 来提高性能。

使用Application/Session传递

     定义:通过在Application/Session中定义变量的方式在页面之间传递参数的方法
     使用:我们可以在Application/Session定义变量,例如定义参数
          Application["ParamID"]=ParamValue;
          Application["ParamID"]=ObjectInstance;
          Session["ParamID"]=ParamValue;
          Session["ParamID"]=ObjectInstance;
     在页面中引用参数:
          VarID=Application["ParamID"];
          VarID=Session["ParamID"];
          这种方式传递参数就是逻辑简单清晰,保密性好,对用户透明;需要靠率会话(Session)过期的问题.


                          性能及安全性分析
      性能考虑:


      1、可以传递任何值,对象自动序列化,但来额外的性能损失;
      2、Application/Session都要占用内存,消耗宝贵的服务器资源,且需要手工释放变量;
      安全性:
      1、Application是全局对象,任何用户都可以访问,可能导致用户变量之间的值覆盖,从而丢失信息。
      2、对用户透明,保密性较好

 

      建议:

      1、对用户量较大的系统不推介使用,因为要消耗大量的内存资源。2、适宜用在传递一些关键全局性的参数,且宜为字符类型的参数,千万不要通过它来传递大内存对象。
      
                      

使用Cache传递参数

      定义:通过在全局对象Cache中定义变量来传递参数的方法。
      使用:详细应用请见NET Framework SDK文档
      定义变量:Cache.Add("ParamID", "ParamValue", null, DateTime.Now.AddSeconds(60), TimeSpan.Zero, CacheItemPriority.High, null);
      在页面中使用:VarInstance=Cache["ParamID"];
      Cache方式传递参数有些复杂,可以传递任何值,享受内存自动回收的好处。

 

性能及安全性分析


      性能考虑:


      1、可以穿传递任何值,对象自动序列化,但来额外的性能损失;     
      2、要占用内存,消耗宝贵的服务器资源,在设置生存期后系统可以自动释放所占用内存。主要其生存期时间,否则就和Application一样的效能。


      安全性:
      1、Cache也全局对象,任何用户都可以访问,可能导致用户变量之间的值覆盖,从而丢失信息。
      2、对用户透明,保密性较好

     建议:这是笔者认为最好的传递参数的方式,在设定参数的生存期的情况下,生存期尽可能的短,以使系统自动回收内存,当然用户也可以手工释放打倒回收内存的效果。

                           

Cookie(小甜饼)法
     定义:通过把参数定义在Cookie中在不同页面之间传递参数的方法
     使用:定义变量:
          HttpCookie MyCookie = new HttpCookie("ParamID");
          MyCookie.Value = ParamValue;
          MyCookie.Expires = now.AddHours(1);
          Response.Cookies.Add(MyCookie);
          在页面中使用:VarInstance=Request.Cookies["ParamID"].vlaue;更完整的用户请参见NET Framework SDK文档

 

性能及安全性分析


     性能考虑:


     1、可以存储字符型数据,且长度受限,不适宜传递大数据;传递对象需要手工序列化。
     2、参数在客户端和服务器端来回传递,占用网络带宽。
     安全性:
     1、Cookie在客户端保存,用户可以查看,会导致信息泄露,可能为黑客所利用来攻击系统。
     2、Cookie在客户端和服务器段来回传递,可能被截获,可能为黑客所利用来攻击系统。

     建议:

     1、如果需要保留跨天的数据,否则不建议使用;

     2、数据需要加密保证安全性;

     3、一定要设置好生存期[过期]时间。