黑马训练营自学笔记(04)

 

---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------

 

IsPostBack的作用以及实现原理。

  一:IspostBack原理分析,及在ashx中的实现

  在WebForm中的Page对象拥有一个IsPostBack属性,其作用是标识页面是第一次加载,还是为了响应回发而加载。IsPostBack为false的话就是第一次被加载,为true就是为了响应回发而加载。

  用一般处理程序(ashx)进行Asp.Net开发的时候,我们也需要自己动手去实现这个功能。方法就是获取某个表单元素的值来进行判断,如果这个表单元素的值为空,则说明是第一次直接访问(因为第一次访问表单没提交,肯定获取值为空),反之就是表单提交后为了响应回发而加载。获取的这个表单元素通常有两种:一种是专门用一个隐藏域表单,另一种通常就是获取提交按钮的值。下面分别实现。

(1)获取提交按钮的值

Login_Submit.html模版页代码:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <style>
        span {
            display:block;
        }
    </style>
</head>
<body>
    <form action="Login_Submit.ashx" method="post">
        <span>用户:<input type="text" name="username" /></span>
        <span>密码:<input type="password" name="pass"/></span>
        <span><input type="submit" value="提交" name="submit"/></span>
        </form>
</body>
</html>

Login_Submit.ashx代码:

<%@ WebHandler Language="C#" Class="Login_Submit" %>

using System;
using System.Web;

public class Login_Submit : IHttpHandler {

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/html";
        string ispostback = context.Request["submit"];//获取提交按钮的值
        if (string.IsNullOrEmpty(ispostback))//如果是第一次进入,显示登录界面
        {
            context.Response.Write("第一次进入");
            string content = System.IO.File.ReadAllText(context.Server.MapPath("Login_Submit.html"));
            context.Response.Write(content);
        }
        else
        {
            context.Response.Write("表单提交后进入");
        }
    }
 
    public bool IsReusable {
        get {
            return false;
        }
    }

}

(2)用一个专用的隐藏域实现.

Login_hidden.html代码:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <style>
        span {
            display:block;
        }
    </style>
</head>
<body>
    <form action="Login_hidden.ashx" method="post">
        <span>用户:<input type="text" name="username" /></span>
        <span>密码:<input type="password" name="pass"/></span>
        <span><input type="submit" value="提交" name="submit"/></span>
        <input type="hidden" name="ispostback" value="true"/><!--这里用了一个专门的隐藏域-->
        </form>
</body>
</html>

Login_hidden.ashx代码:

<%@ WebHandler Language="C#" Class="Login_hidden" %>

using System;
using System.Web;

public class Login_hidden : IHttpHandler {
    
    public void ProcessRequest (HttpContext context) {
        context.Response.ContentType = "text/html";
        string ispostback = context.Request["ispostback"];//获取隐藏域的值
        if (ispostback!="true")//如果是第一次进入,显示登录界面
        {
            context.Response.Write("第一次进入");
            string content = System.IO.File.ReadAllText(context.Server.MapPath("Login_hidden.html"));
            context.Response.Write(content);
        }
        else
        {
            context.Response.Write("表单提交后进入");
        }
    }
 
    public bool IsReusable {
        get {
            return false;
        }
    }

}

二、疑问。

(1)上面ashx是先的IsPostBack是可以轻易的伪造的,虽然表单中的method="post"是采用post方式进行数据的提交,可我实验的时候发现仍然可以通过get方式进行表单的提交。也就是只需采用Login_Submit.ashx?submit=%E6%8F%90%E4%BA%A4就可以伪造第一种的提交。用Login_hidden.ashx?ispostback=true就可以伪造第二种的提交。这样就是不安全的。

(2)虽然知道了WebForm中IsPostBack的实现原理,但是不知道究竟具体是怎么实现的。如果说是放在ViewState中的话,发现禁用了ViewState仍然正常使用IsPostBack。至于是否是获取提交表单按钮的值实现就不清楚了。

---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------

posted @ 2012-10-11 17:39  duguao  阅读(157)  评论(0编辑  收藏  举报