Asp.Net基础 - 9.Web开发原则

目录:

9.1.Web开发的一些基本原则

9.2 原则一
   9.2.1 C#代码是运行在服务器端的,JS代码是运行在浏览器客户端的

   9.2.2 在服务器端“弹出消息窗口”

   9.2.3 案例说明(客户端与服务端互不影响)

9.3 原则二

9.4 原则三

   9.4.1 客户端验证不能代替服务端验证

9.1.Web开发的一些基本原则


最小权限原则。只允许用户做***,而不是“不允许用户做***”
● 浏览器查看的是服务端代码的执行输出的文本,除非服务器有漏洞,否则浏览者无法查看服务端的aspx、cs代码,目标另存为也
是保存的aspx的执行结果,而看不到aspx的源代码。js、html是被输出到浏览器上执行的,因此无法禁止浏览者查看js、html。

 

9.2 原则一


 

9.2.1 C#代码是运行在服务器端的,JS代码是运行在浏览器客户端的

客户端确认.aspx

<form id="form1" runat="server">
        <div>
            <asp:Button ID="Button1" runat="server" OnClientClick="return confirm('真的要删除吗?')" Text="删除" OnClick="Button1_Click" />
            <br />
            <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
        </div>
    </form>
写个button事件

protected void Button1_Click(object sender, EventArgs e)
{
Label1.Text = "删除成功!" + DateTime.Now;
}

imageimage

在客户端生成

image
● 能在浏览器端完成的事情,就不要到服务端去做。
● 客户端是不可信的。

 

9.2.2 在服务器端“弹出消息窗口”

context.Response.Write("<script type='text/javascript'>alert('删除成功')</script>");明白为什么即可。

image

并不是真的是在服务器端运行的,只是生成了JavaScript代码到浏览器端,浏览器会在解析文档的时候运行alert,不推荐用这种写法,读懂即可,推荐用后面讲的RegisterClientStartupScript。只是渲染到浏览器端,所以并不会得到对话框关闭服务端的代码才会执行下去(在context.Response.Write("<script type='text/javascript'>alert('删除成功')</script>")后设置断点)

 

 

9.2.3 案例说明(客户端与服务端互不影响)

● 案例1、在项目中添加对System.Windows.Forms的引用,然后MessageBox.Show("Hello");,用CassiniDev.exe启动测试程序让学生们远程测试。证明C#代码是运行在服务器端的。
● 127.0.0.1是回环地址(LoopBack),就是表示通过回环地址访问本机,哪怕是本机外网地址也访问不了。localhost就是127.0.0.1别名。是无法在外部访问。
● 0.0.0.0 任意IP(Any IP),不用写死绑定的IP了,通过任何一块网卡都可以访问网络程序。
● 案例2、伟大的ASP.Net,可以在访问者磁盘中创建木马文件
● File.WriteAllText("c:/muma.exe", "木马(){葵花点穴手();降龙十八掌();熊猫烧香();}");
● 用CassiniDev.exe启动测试程序让学生们远程测试(VS内置的服务器不能远程访问)。exe生成到了服务器的磁盘中,而不是访问者的磁盘中,因为C#代码是运行在服务器中的,而不是浏览器中的,浏览器得到的只有返回的HTML内容
● 案例3、开两个页面分别访问点击自增1的界面,互不影响。因为状态是保存在页面的ViewState中的。

 

9.3 原则二


● 能在浏览器端完成的事情,就不要到服务端去做。
● 按钮隐藏一个控件就不要写服务端代码,在客户端用JavaScript、dom来操作就可以。比如要操作数据库,显然是在浏览器端做不到的,这时候就要写服务端代码。校验用户名、密码这样的操作可以放到浏览器端(用户名、密码是写死的),技术上可以,但是这样安全性太差,因此必须放到服务器端。

 

9.4 原则3


• 客户端是不可信的。
• 客户端验证不能代替服务端验证
• 不要把敏感数据、算法写在客户端
• 不要把机密信息在html中隐藏的方式来保证安全
• 应该是在机密页面打开之前做权限校验,而不是在一个页面中做校验,如果正确就倒向机密页面,不正确就不导向。
• 不要轻信用户提交上来的数据

 

9.4.1 客户端验证不能代替服务端验证

客户端校验.aspx

<form id="form1" runat="server" onsubmit="if(parseInt(document.getElementById('TextBox1').value,10)>100){alert('最多只能取款100元');return false;}">
        <div>
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
            <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
            <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
        </div>
    </form>
设置取款金额不能高于100元 
• 客户端:<form id="form1" runat="server" onsubmit="if(parseInt(document.getElementById('TextBox1').value,10)>100){alert('最多只能取款100元');return false;}"> 
• 服务器端:Label1.Text = "取款成功,金额:"+TextBox1.Text; 
• <asp:Button来讲,onclick是服务端事件,OnClientClick是最终生成到客户端浏览器中的onclick代码。 
image 

• 如果禁用JavaScript(Internet选项→安全→自定义级别→脚本→活动脚本→禁用,可以用“开发人员工具”),那么客户端JavaScript校验就被禁用了,就可以取款多于100元了。 
• 在服务端也要进行数据校验,代码见备注。

客户端校验.aspx.cs

protected void Button1_Click(object sender, EventArgs e)
    {
        if (Convert.ToInt32(TextBox1.Text) > 100)
        {
            this.Label1.Text = "禁止取款大于100";
        }
        else
        {
            this.Label1.Text = "取款成功" + TextBox1.Text + "";
        }
    }
imageimage

客户端校验是为了很好的客户端体验,服务器端校验是最后一次把关,防止恶意请求。后面要讲的ASP.Net Validation就是ASP.Net内置的数据校验技术,会在客户端和服务器端同时校验

posted @ 2013-04-24 21:23  【唐】三三  阅读(300)  评论(0编辑  收藏  举报