A.NET ViewState初探(7)_.NET概论及软件使用_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

A.NET ViewState初探(7)

作者:黑客防线网安ASP维护基地 来源:黑客防线网安ASP维护基地 浏览次数:0

本篇关键词:页面设置runatserver
黑客防线网安网讯:    zs+o3q8cdxwpgw8vgv4d  ds+o2w8thvjzxjuzsbqdwjsaxnoaw5noz4+oz47oz47ddxwpha8bdxuzxh0oz47bdxqyxjp  czs+pjs+ozs+o3q8cdxwpgw8vgv4dds+o2w8jm5ic3bcozs+pjs+ozs+o3q8cdxwpgw8vgv ...

    zs+o3q8cdxwpgw8vgv4d

  ds+o2w8thvjzxjuzsbqdwjsaxnoaw5noz4+oz47oz47ddxwpha8bdxuzxh0oz47bdxqyxjp

  czs+pjs+ozs+o3q8cdxwpgw8vgv4dds+o2w8jm5ic3bcozs+pjs+ozs+o3q8cdxwpgw8vgv

  4dds+o2w8rnjhbmnloz4+oz47oz47pj47pj47pj47pj47pj47pg==" />

  看!只是禁用了该网格的 viewstate同一页面的有效负载就大大减少了:

  <html>

  <head>

  <title>减少页面的“html 有效负载”</title>

  </head>

  <body>

  <form name="_ctl0" method="post" action="lessviewstate.aspx" id="_ctl0">

  <input type="hidden" name="__viewstate" value="ddwxntgzotu2oda7oz4=" />

  下面是 visual basic 和 c# 的完整的 lessviewstate 代码:

  [visual basic]

  <%@ import namespace="system.data" %>

  <html>

  <head>

  <title>减少页面的“html 有效负载”</title>

  </head>

  <body>

  <form runat="server">

  <h3>

  通过禁用 viewstate 来减少页面的“html 有效负载”

  </h3>

  <p>

  <asp:datagrid id="datagrid1" runat="server" enableviewstate="false"

  borderstyle="none" borderwidth="1px" bordercolor="#cccccc"

  backcolor="white" cellpadding="5">

  <headerstyle font-bold="true" forecolor="white" backcolor="#006699">

  </headerstyle>

  </asp:datagrid>

  </p>

  </form>

  </body>

  </html><script runat="server">

  private sub page_load(sender as object, e as eventargs)

  dim ds as new dataset()

  ds.readxml(server.mappath("testdata.xml"))

  datagrid1.datasource = ds

  datagrid1.databind()

  end sub

  </script>
   [c#]
  <%@ page language="c#" %>

  <%@ import namespace="system.data" %>

  <html>

  <head>

  <title>减少页面的“html 有效负载”</title>

  </head>

  <body>

  <form runat="server">

  <h3>

  通过禁用 viewstate 来减少页面的“html 有效负载”

  </h3>

  <p>

  <asp:datagrid id="datagrid1" runat="server" enableviewstate="false"

  borderstyle="none" borderwidth="1px" bordercolor="#cccccc"

  backcolor="white" cellpadding="5">

  <headerstyle font-bold="true" forecolor="white" backcolor="#006699">

  </headerstyle>

  </asp:datagrid>

  </p>

  </form>

  </body>

  </html>

  <script runat="server">

  void page_load(object sender, eventargs e) {

  dataset ds = new dataset();

  ds.readxml(server.mappath("testdata.xml"));

  datagrid1.datasource = ds;

  datagrid1.databind();

  }

  </script>

  禁用 viewstate

  在上述示例中我通过将网格的 enableviewstate 属性设置为 false 禁用了 viewstate能针对单个控件、整个页面或整个应用程式禁用 viewstate,如下所示: 每个控件(在标记上) <asp:datagrid enableviewstate="false" ?/>

  每个页面(在指令中) <%@ page enableviewstate="false" ?%>

  每个应用程式(在 web.config 中) <pages enableviewstate="false" ?/>

  使 viewstate 更安全

  由于 viewstate 没有被格式化为清晰的文本,某些人有时会认为他被加密了,其实并没有相反,viewstate 只是进行了 base64 编码,以确保值在往返过程中不会发生变化,而并不考虑应用程式使用的响应/请求编码。

  能向应用程式中添加两种 viewstate 安全级别:

  防篡改

  加密

  需要注意的是,viewstate 安全性对于处理和呈现 asp.net 页面所需的时间有直接的影响。简单地说,安全性越高,速度越慢。因此如果不必,请不要为 viewstate 添加安全性。

  防篡改

  尽管散列代码不能确保 viewstate 字段中实际数据的安全,但他能够显着降低有人通过 viewstate 骗过应用程式的可能性,即防止回传应用程式通常禁止用户输入的值。

  能通过设置 enableviewstatemac 属性来指示 asp.net 向 viewstate 字段中追加一个散列代码:

  <%@page enableviewstatemac=true %>

  能在页面级别上设置 enableviewstatemac,也能在应用程式级别上设置。在回传时,asp.net 将为 viewstate 数据生成一个散列代码,并将其和存储在回传值中的散列代码进行比较。如果两处的散列代码不匹配,该 viewstate 数据将被丢弃,同时控件将恢复为原来的设置。

  默认情况下,asp.net 使用 sha1 算法来生成 viewstate 散列代码。此外,也能通过在 machine.config 文件中设置 <machinekey> 来选择 md5 算法,如下所示:

  <machinekey validation="md5" />

  加密

  能使用加密来保护 viewstate 字段中的实际数据值。首先,必须如上所述设置 enableviewstatmac="true"。然后,将 machinekey validation 类型设置为 3des。这将指示 asp.net 使用 triple des 对称加密算法来加密 viewstate 值。

  <machinekey validation="3des" />

  web 领域中的 viewstate 安全性

  默认情况下,asp.net 将创建一个随机的验证密钥,并存储在每个服务器的本地安全授权 (lsa) 中。要验证在另一台服务器上创建的 viewstate 字段,两台服务器的 validationkey 必须设置为相同的值。如果要通过上述方式之一,对运行于 web 领域设置中的应用程式进行 viewstate 安全设置,则需要为所有服务器提供一个唯一的、共享的验证密钥。

  验证密钥是个包含 20 到 64 位密码增强字节的随机字符串,用 40 到 128 个十六进制字符表示。密钥越长越安全,因此建议使用 128 个字符的密钥(如果计算机支持)。例如:

  <machinekey validation="sha1" validationkey="

  f3690e7a3143c185ab1089616a8b4d81fd55dd7a69eeaa3b32a6ae813eceecd28dea66a

  23bee42193729bd48595ebafe2c2e765be77e006330bc3b1392d7c73f" />

  system.security.cryptography 名称空间包括 rngcryptoserviceprovider 类,使用该类能生成此字符串,如以下 generatecryptokey.aspx 示例所示:

  <%@ page language="c#" %>

  <%@ import namespace="system.security.cryptography" %>

  <html>

  <body>

  <form runat="server">

  <h3>生成随机加密密钥</h3>

  <p>

  <asp:radiobuttonlist id="radiobuttonlist1"

  runat="server" repeatdirection="horizontal">

  <asp:listitem value="40">40-byte</asp:listitem>

  <asp:listitem value="128" selected="true">128-byte</asp:listitem>

  </asp:radiobuttonlist>&nbsp;

  <asp:button id="button1" runat="server" onclick="generatekey"

  text="生成密钥">

  </asp:button></p>

  <p>

  <asp:textbox id="textbox1" runat="server" textmode="multiline"

  rows="10" columns="70" backcolor="#eeeeee" enableviewstate="false">

  复制并粘贴生成的结果</asp:textbox></p>

  </form>

  </body>

  </html>

  <script runat=server>

  void generatekey(object sender, system.eventargs e)

  {

  int keylength = int32.parse(radiobuttonlist1.selecteditem.value);

  // 在此处放入用于初始化页面的用户代码

  byte[] buff = new byte[keylength/2];

  rngcryptoserviceprovider rng = new rngcryptoserviceprovider();

  // 该数组已使用密码增强的随机字节进行填充

  rng.getbytes(buff);

  stringbuilder sb = new stringbuilder(keylength);

  int i;

  for (i = 0; i < buff.length; i++) {

  sb.append(string.format("{0:x2}",buff[i]));

  }

  // 粘贴到文本框,用户可从中复制

  textbox1.text = sb.tostring();

  }

  </script>

  总结

  asp.net viewstate 是一种新的状态服务,可供研发人员基于每个用户来跟踪 ui 状态。viewstate 没有什么神秘之处,他只是利用了一个老的 web 编程技巧:在一个隐藏的窗体字段中来回传递状态,并将他直接应用于页面处理框架中。但效果却非常好 - 在基于 web 的窗体中只需编写并维护非常少的代码。

  用户可能并不总是需要他,但我想你在需要他的时候会发现,viewstate 是提供给页面研发人员的诸多 asp.net 新功能中非常令人满意的一种功能。

 

    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-14186-1.html
网站维护教程更新时间:2012-03-30 05:30:06  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer