ASP.NET页的客户端
视图状态存储在隐藏字段中,以便使它与 特定的页请求明确关联。当给定页实例中的任何 HTML 元素回发时,动态生成的页类开始在服务器上运行 ,并使用存储在视图状态中的数据,来为页面中的控件重新创建最后所能够知道的正常状态。如果视图状 态在客户端被篡改了,情况会怎么样呢?这种情况可能发生吗?默认情况下,会使用 Base64 公式对视图 状态编码并进行散列处理,所得到的散列值也与视图状态一起存储。散列值是通过计算视图状态的内容外 加服务器密钥得到的。一旦回发页面,页类中的代码会将视图状态的内容和散列值分离。下一步,它将基 于检索到的视图状态内容和服务器密钥重新计算散列值。如果两个散列值不匹配,则引发安全异常(请参 见图 4)。
图 4 不能在客户端上更改页面视图 如果恶意用户试图发布已修改了视图状态的假请求,情况会怎么样呢?恶意用户需要知道服务器密钥 ,才能为经过修改的视图状态内容生成可以在服务器上匹配的散列值。但是,服务器密钥是仅由服务器信 息组成的,并且不出现在视图状态字段中。附带代码中的 tweakviewstate.aspx 页包含的脚本代码可以 修改视图状态,并演示所发生的异常情况,如图 4 所示。 尽管视图状态几乎不能用于发动攻击, 但它无法保证数据的机密性,除非使用加密。实际上,可以在客户端对视图状态的内容进行解码和检查, 但不可能成功修改该内容以使经过更改的页状态用于服务器环境。 __EVENTVALIDATION 隐藏字段 是 ASP.NET 2.0 的新增安全措施。该功能可以阻止由潜在的恶意用户从客户端发送的未经授权的请求。 为了确保每个回发和回调事件来自于所期望的用户界面元素,页将在事件中添加额外的验证层。页通常通 过将请求的内容与 __EVENTVALIDATION 字段中的信息进行匹配,来验证未在客户端添加额外的输入域, 并且该值是在服务器已知的列表中选择的。页将在生成期间创建事件验证字段,而这是最不可能获取该信 息的时刻。 像视图状态一样,事件验证字段包含散列值以防止发生客户端篡改。 控件使用 ClientScriptManager 对象的 RegisterEventForValidation 方法存储自己的安全回发相关信息。每个控 件还可能会注册它自己的唯一 ID,但这种情况十分少见。列表控件还会存储列表中的所有值。支持事件 验证的服务器控件通常在其 IPostBackDataHandler 接口的实现中调用 ValidateEvent 方法。如果验证 失败,将引发安全异常。 可以基于每个页启用和禁用事件验证;每个控件类都通过 SupportsEventValidation 属性来启用事件验证。目前,还不能在特定控件实例上启用或禁用事件验证。 事件验证是为了仅限输入一组已知值而设置的防卫屏障。它只是将安全防护提升到更高水平,但 本身不会阻止脚本注入式的攻击。 如果在启用 AJAX 的应用程序的环境中使用事件验证,则可能造成问题。在这类应用程序中,某些客 户端工作可以临时创建新的输入元素,因而可能会由于出现未知元素而导致下一个回发失败。最好的应对 方法是,一旦可能就在服务器上生成所有用户界面,并使用级联样式表显示属性在客户端上隐藏它。这样 ,您要使用的任何用户界面都将注册到事件验证字段。如果编写自定义控件,则应当用 SupportsEventValidation 属性设置该控件,以启用此功能。 回发机制 图 1 中的 ASP.NET 页会在用户单击按钮时执行回发操作。这是因为 <asp:Button> 标记将转 换为 HTML 的提交 <input> 元素。单击提交输入字段时,浏览器将触发 HTML 客户端事件 onsubmit,然后根据所提交表单的内容来准备提交到服务器的新请求。所发送的 HTTP 请求包括一部分其 他信息,用于计算按钮 ID。 页类将扫描 HTTP 请求的正文,以确定所发布的字段中是否有任何字段与 ASP.NET 页中按钮控件的 ID 匹配。如 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |