- Rongsen.Com.Cn 版权所有 2008-2010 京ICP备08007000号 京公海网安备11010802026356号 朝阳网安编号:110105199号
- 北京黑客防线网安工作室-黑客防线网安服务器维护基地为您提供专业的
服务器维护
,企业网站维护
,网站维护
服务 - (建议采用1024×768分辨率,以达到最佳视觉效果) Powered by 黑客防线网安 ©2009-2010 www.rongsen.com.cn
作者:黑客防线网安ASP维护基地 来源:黑客防线网安ASP维护基地 浏览次数:0 |
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>
<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 新功能中非常令人满意的一种功能。
我要申请本站:N点 | 黑客防线官网 | |
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479 |