• ASP.NET 高级编程基础第七篇—开发原则2


    前言: 从这篇博客开始我们在介绍一下web开发的原则2,再上一章博客中我们主要说了一些基本的Web开发原则,这篇我们在上篇的基础上面在深入的讲解一下。

    1. 客户端验证不能代替服务端验证

    (1) <asp:Button>来讲,onclick是服务端事件,onclientClick是最终生成到客户端浏览器中的onclick事件。

    (2) 设置取款金额不能超过100元

     1) 客户端:<form id="form1" runat="server" onsubmit="if(parseInt(document.getElementById('TextBox1').value,10)>100){alert('最多只能取款100元');return false;}">

     2) 服务器端:Label1.Text = "取款成功,金额是:" + TextBox1.Text;

    (3) 如果禁用JavaScript(Internet选项—>安全—>自定义级别—>脚本—>活动脚本—>禁用,那么客户端JavaScript校验就被禁用了,就可以取款多于100元了)。

    (4) 在服务端也要进行数据校验。

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

    注:新建一个Web页面,拖放一个TextBox控件,Button控件和Label控件,Button控件的代码为:

     <asp:Button ID="Button1" runat="server" Text="Button"  OnClientClick="var value=document.getElementById('TextBox1').value; if(parseInt(value,10)>100){alert('金额不能大于100'); return false;}" onclick="Button1_Click" />

    在Button控件的事件下面写入如下代码:

     1     protected void Button1_Click(object sender, EventArgs e)
     2 
     3     {
     4 
     5         if (Convert.ToInt32(TextBox1.Text) > 100)
     6 
     7         {
     8 
     9             Label1.Text = "禁止取款金额大于100元";
    10 
    11         }
    12 
    13         else
    14 
    15         {
    16 
    17             Label1.Text = "取款成功,金额是" + TextBox1.Text;
    18 
    19         }
    20 
    21     }
    1. 不要把敏感数据,算法写在浏览器端

    (1)   先举一个简单的例子来说明一下:

     1  <script src="../script/jquery-1.4.1.min.js" type="text/javascript"></script>
     2 
     3     <script type="text/jscript">
     4 
     5         $("#btnLogin").click(function () {
     6 
     7             if ($("#UserName").val() == "admin" && $("#Password").val() == "citsoft") {
     8 
     9                 alert("登录成功");
    10 
    11             }
    12 
    13             else {
    14 
    15                 alert("登录失败");
    16 
    17             }
    18 
    19         });
    20 
    21 </script>

     (2) 用户在浏览器中查看源代码就可以看到用户名,密码是什么,在动态网站空间还是很少的那个年代,很多人的主页都是用这种方法来实现的。

    1. 不要把机密信息隐藏在HTML中

    (1) 应该在服务端控制密码不对则Visible=False,服务端控件的HyperLink1.Visible=false是根本不输出到客户端的,在和Jquery等结合的时候无法用$(“#控件ID”).Show()来显示visible=false的控件,因为控件根本没有渲染到Html中。

    (2) 应该是在机密页面打开之前做权限校验,而不是在一个页面中做校验,如果正确就导向机密页面,不正确就不导向。

    (3) 只有密码输入正确了才显示下载地址,实现代码如下:

    注:新建一个下载页面.aspx,导入纯JavaScript代码:

     1 <body>
     2 
     3     <form id="form1" runat="server">
     4 
     5     <div>
     6 
     7         <input type="text" id="Password" />
     8 
     9         <input type="button" value="确定" onclick="var passwordID=document.getElementById('Password').value; if(Password=='111'){document.getElementById('div1').style.display='';}" />
    10 
    11         <div id="div1" style="display:none"><a href="http://www.cnblogs.com/hanyinglong.zip">点击下载</a></div>
    12 
    13         <br />
    14 
    15         <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
    16 
    17         <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
    18 
    19         <br />
    20 
    21         <asp:HyperLink ID="HyperLink1" runat="server"
    22 
    23             NavigateUrl="http://www.cnblogs.com/hanyinglong.zip" Visible="False">下载地址</asp:HyperLink>
    24 
    25     </div>
    26 
    27     </form>
    28 
    29 </body>

    在Button控件的事件下面写入如下代码:

       

     1  protected void Button1_Click(object sender, EventArgs e)
     2 
     3     {
     4 
     5         if (TextBox1.Text == "111")
     6 
     7         {
     8 
     9             HyperLink1.Visible = true;
    10 
    11         }
    12 
    13     }
    1. XSS漏洞

    (1) 不要轻信用户提交上来的数据。

    (2) alert消息太难看,因此开发一个ashx页面用来统一展示消息ShowMessage.ashx。

    1 context.Response.ContentType = "text/html";       
    2 
    3 context.Response.Write("<center><font color='red'>" + context.Request["msg"] + "</font></center>");
    4 
    5  context.Response.Write("<a href='javascript:history.back();'>返回上一页</a>");

    (3) 系统内部需要弹出消息的时候只要将用户的Redirect到ShowMessage.ashx?Msg=’消息’,就可以,比如:

    Response.Redirect("ShowMessage.ashx?Msg=用户名不能为空");

    (4) 新建一个发帖子的文件夹,在文件夹上面加上view.aspx和ass.aspx页面,首先

     1)add.aspx中拖放一个TextBox和Button控件,设置TextBox的TextMode=”Multiline”,双击Button控件在其事件下面写入如下代码:ValidateRequest="false"

     File.AppendAllText("c:/1.txt", TextBox1.Text + "<br />");

    2)在View.aspx页面中加入如下代码

      //Response.Write(File.ReadAllText("c:/1.txt"));

       Response.Write(HttpUtility.HtmlEncode(File.ReadAllText("c:/1.txt")));

     注:给文件中写入<script type=”text/javascript”>alert(‘去韩迎龙的博客园吧!’);</script>

    (5)我们可以对请求的数据做检测,如果请求数据库有<等就认为是恶意请求,禁止提交,aspx默认就是采用这种策略,这样做的缺点是如果做得是一个程序员论坛,程序员就无法发表HTML代码中的帖子了,因此更好的处理策略是将用户发表的内容按照原样显示出来,使用HttpUtility.HtmlEncoding就可以将字符串中的<,/等特殊符号转换为HTML显示的字符,也就是不把<script>当成定义脚本的标签,而是当成”&lt;script&gt;”,这样可以在页面上直接显示出来的内容。

    (6) 修改看贴代码,将context.Response.Write(line+”<hr />”);修改为:

     context.Response.Write(HttpUtility.HtmlEncode(line)+”<hr />”);即可。

    (7) aspx中默认对请求的数据进行了校验,如果数据中有<./等有潜在XSS攻击的字符,则会报错,对于一些CMS系统等确实需要提交HTML内容的地方要关闭它,在页面顶部的page中加入ValidateRequest="false"这个属性。

    (8) 在显示的时候如果需要对内容在显示之前进行HTMLEncode,除了可以使用HttpUtility.HtmlEncode进行手动编码的话,还可以使用Literal控件显示,如果修改Literal的Model属性为Encode,那么会自动进行HtmlEncode,然后显示。

    注释:开发原则2我们就说到这里了,从下节我们开始说特殊路径的处理以及Request对象。

  • 相关阅读:
    闭包 (Closure)
    RSA算法
    HTTPS
    SSH
    HDU1754 I hate it_线段树(入门级别)
    HDU1166 敌兵布阵_线段树
    c++运算符优先级表
    归并排序练习.
    HDU 1969 精度二分
    uva10944 状态压缩bfs or DP
  • 原文地址:https://www.cnblogs.com/hanyinglong/p/2637204.html
Copyright © 2020-2023  润新知