如何防止脚本攻击

来源:互联网 发布:基线网络监控管理系统 编辑:程序博客网 时间:2024/04/29 11:27

一:如何禁止TextBox输入html标签和脚本?

    /// <summary>    /// 删除Html标签    /// </summary>    /// <param name="text"></param>    /// <returns></returns>    public static string ReplaceHtml(string text)    {        return Regex.Replace(text, @"<(.[^>]*)>", "", RegexOptions.IgnoreCase);    }//或者    /// <summary>    /// 删除文本里的html标签和多余空格    /// (用在主题或者少量的文字)    /// </summary>    /// <param name="html">包含HTML的文本</param>    /// <returns></returns>    public static string RemoveHtml(string html)    {        System.Text.RegularExpressions.Regex regex1 = new System.Text.RegularExpressions.Regex(@"<script[\s\S]+</script *>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);        System.Text.RegularExpressions.Regex regex2 = new System.Text.RegularExpressions.Regex(@" href *= *[\s\S]*script *:", System.Text.RegularExpressions.RegexOptions.IgnoreCase);        System.Text.RegularExpressions.Regex regex3 = new System.Text.RegularExpressions.Regex(@" no[\s\S]*=", System.Text.RegularExpressions.RegexOptions.IgnoreCase);        System.Text.RegularExpressions.Regex regex4 = new System.Text.RegularExpressions.Regex(@"<iframe[\s\S]+</iframe *>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);        System.Text.RegularExpressions.Regex regex5 = new System.Text.RegularExpressions.Regex(@"<frameset[\s\S]+</frameset *>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);        System.Text.RegularExpressions.Regex regex6 = new System.Text.RegularExpressions.Regex(@"\<img[^\>]+\>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);        System.Text.RegularExpressions.Regex regex7 = new System.Text.RegularExpressions.Regex(@"</p>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);        System.Text.RegularExpressions.Regex regex8 = new System.Text.RegularExpressions.Regex(@"<p>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);        System.Text.RegularExpressions.Regex regex9 = new System.Text.RegularExpressions.Regex(@"<[^>]*>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);        html = regex1.Replace(html, ""); //过滤<script></script>标记              html = regex2.Replace(html, ""); //过滤href=javascript: (<A>) 属性             html = regex3.Replace(html, " _disibledevent="); //过滤其它控件的on...事件          html = regex4.Replace(html, ""); //过滤iframe                 html = regex5.Replace(html, ""); //过滤frameset              html = regex6.Replace(html, ""); //过滤frameset             html = regex7.Replace(html, ""); //过滤frameset               html = regex8.Replace(html, ""); //过滤frameset                 html = regex9.Replace(html, "");        html = html.Replace(" ", "");        html = html.Replace("</strong>", "");        html = html.Replace("<strong>", "");        return html;    }     /// <summary>    /// 删除文本里的脚本和框架    /// (保留非危险的html标签,用在文章内容等)    /// </summary>    /// <param name="html">包含HTML的文本</param>    /// <returns></returns>    public static string RemoveScript(string html)    {        System.Text.RegularExpressions.Regex regex1 = new System.Text.RegularExpressions.Regex(@"<script[\s\S]+</script *>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);        System.Text.RegularExpressions.Regex regex2 = new System.Text.RegularExpressions.Regex(@" href *= *[\s\S]*script *:", System.Text.RegularExpressions.RegexOptions.IgnoreCase);        System.Text.RegularExpressions.Regex regex3 = new System.Text.RegularExpressions.Regex(@" no[\s\S]*=", System.Text.RegularExpressions.RegexOptions.IgnoreCase);        System.Text.RegularExpressions.Regex regex4 = new System.Text.RegularExpressions.Regex(@"<iframe[\s\S]+</iframe *>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);        System.Text.RegularExpressions.Regex regex5 = new System.Text.RegularExpressions.Regex(@"<frameset[\s\S]+</frameset *>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);        System.Text.RegularExpressions.Regex regex6 = new System.Text.RegularExpressions.Regex(@"\<img[^\>]+\>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);        System.Text.RegularExpressions.Regex regex7 = new System.Text.RegularExpressions.Regex(@"</p>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);        System.Text.RegularExpressions.Regex regex8 = new System.Text.RegularExpressions.Regex(@"<p>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);        //   System.Text.RegularExpressions.Regex regex9 = new System.Text.RegularExpressions.Regex(@"<[^>]*>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);           html = regex1.Replace(html, ""); //过滤<script></script>标记             html = regex2.Replace(html, ""); //过滤href=javascript: (<A>) 属性            html = regex3.Replace(html, " _disibledevent="); //过滤其它控件的on...事件         html = regex4.Replace(html, ""); //过滤iframe                 html = regex5.Replace(html, ""); //过滤frameset              html = regex6.Replace(html, ""); //过滤frameset             html = regex7.Replace(html, ""); //过滤frameset               html = regex8.Replace(html, ""); //过滤frameset                 //  html = regex9.Replace(html, "");  //                  html = html.Replace(" ", "");        html = html.Replace("</strong>", "");        html = html.Replace("<strong>", "");        return html;    }

   

二: 脚本攻击指输入一个恶意脚本到 aspx 页面,造成页面的不正常工作。例如,在留言博中输入:

    

<script>alert(\"the msg box\");</script>

     若页面不对用户留言进行处理,就会弹出一个对话框。

     脚本主要是利用了HTML编码,若有错误,则不能显示,可以用

   this.Server.HtmlEncode();

     来去除HTML代码的影响。

      建立一个页面HTMLEncode.aspx,并加入一个Label控件:

  <asp:label id="Lable" runat="server" text="Label"></asp:label>
     在PageLoad中添加如下代码:

     

    protected void Page_Load(object sender, EventArgs e)    {        this.Lable.Text = "";        this.Lable.Text += this.Server.HtmlEncode("<script>alert(\"the msg box\");</script>");        this.Lable.Text += this.Server.HtmlDecode("<br>this is the script after Server.HTMLEncode");        this.Lable.Text += this.Server.HtmlDecode("<br><br><br>");        this.Lable.Text += this.Server.HtmlEncode("the \"some msg\" is hidden,beacause of the error of <script>");        this.Lable.Text += "<script>some msg";    }
  其结果是:

       <script>alert("the msg box");</script>
       this is the script after Server.HTMLEncode


       the "some msg" is hidden,beacause of the error of <script>

  

  按照设置,最后一行应该是some msg,而结果并非如此,因为<script>造成了<html>错误。

  可见,HTMLEncode把“<”换成了“&lt;”,这叫做HTML转义。所以使用

this.Server.HtmlEncode();可防止脚本攻击。


0 0