zoukankan      html  css  js  c++  java
  • B/S开发框架Web安全之XSS跨站入侵

            Web站点为什么会遭受攻击?是为了恶作剧?损害企业名誉?免费浏览收费内容?盗窃用户隐私信息?获取用户账号谋取私利?总之攻击方式层出不穷,作为B/S开发框架来说,帮助开发者做好解决安全问题也是刻不容缓的,本篇文章来告诉大家怎么防范非法SQL注入。

    适用范围

    Web中 带有显式URL跳转 或 带有存储型文本框的页面。

    攻击原理

    1、非持久型分为反射型XSS及URL跳转;

    反射型XSS恶意代码不保留在服务器上,而是通过其他形式实时通过服务器反射给普通用户;

    URL跳转,参数型跨站脚本,主要用于将恶意脚本附加到URL地址的参数中,然后诱使用户访问该网址,当受害者单击这些专门设计的链接时,恶意代码会直接在受害者主机上的浏览器中执行。它的特点是只在用户单击时触发,而且只执行一次,非持久化,所以称为反射型跨站脚本。

    例子:URL跳转

    http://www.hstjp.com:883/Login.aspx?ReturnUrl=http%3A%2F%2Fwww.hstgzpt.com%2F  URL跳转,将参数ReturnUrl的值替换成钓鱼网站的地址。

    反射: <input type="text" name="address1" value="value1from"> value1from 是来自用户的输入,如果用户不是输入value1from,

    而是输入"/><script>alert(document.cookie)</script><!- 那么就会变成<input type="text" name="address1"value=""/><script>alert(document.cookie)

    </script><!- "> 嵌入的JavaScript代码将会被执行

    2、持久型XSS 也叫存储型跨站脚本,比反射型跨站脚本更具威胁性,并且可能影响到Web服务器自身的安全。此类XSS不需要用户单击特定的URL就能执行跨站脚本,攻击者事先将恶意代码上传或存储到漏洞服务器中,只要受害者浏览该页面就会执行恶意脚本。

    例子:用户通过文本框输入脚本,后台未进行过滤或转义,脚本直接保存,下一个用户访问该地址时用户通过某种方式获取用户的cookie信息。

    解决方案

    应用程序处理

    1、URL跳转:

    B/S开发框架策略1:指定域名跳转,后台进行判断,非该域名不予跳转; 

    System.Uri u = new System.Uri(strReturnUrl);
    if (u.Host.IndexOf(".baidu.com") == -1)
    {
            strReturnUrl = @"http://www.baidu.com";
    }

    策略2:

    参照百度,对URL进行加密传输。

    2、反射型与持久型

    web开发中反射型与持久型过滤方式一至

    策略1:过滤,对html标签及js脚本进行过滤,这种方式由于标签量较大,实标应用中不算可取。

    策略2 转义:

    String title = request.getParameter(“title”);
    String id = request.getParameter(“id”);
    <span> <%=xss.HtmlEncoder(title,”HTML”)%></span>
    <span> <%=xss.HtmlEncoder(contect,”HTML”)%></span>

    3、B/S开发框架后台过滤

    public static string HtmlEncode(string Encode)
    {
        // 将输入字符串编码,这样所有的HTML标签都失效了。   
        StringBuilder sbStr = new StringBuilder(HttpUtility.HtmlEncode(Encode));
        // 选择性的允许<b> 和 <i>   
        sbStr.Replace("<b>", "<b>");
        sbStr.Replace("</b>", "</b>");
        sbStr.Replace("<i>", "<i>");
        sbStr.Replace("</i>", "</i>");
        return sbStr.ToString();
    }
    public static string WipeScript(string html)
    {
        System.Text.RegularExpressions.Regex regex1 = new 
        System.Text.RegularExpressions.Regex(@"<script[sS]+</script *>", 
        System.Text.RegularExpressions.RegexOptions.IgnoreCase);
        System.Text.RegularExpressions.Regex regex2 = new 
        System.Text.RegularExpressions.Regex(@" href *= *[sS]*script *:", 
        System.Text.RegularExpressions.RegexOptions.IgnoreCase);
        System.Text.RegularExpressions.Regex regex3 = new 
        System.Text.RegularExpressions.Regex(@" on[sS]*=", 
        System.Text.RegularExpressions.RegexOptions.IgnoreCase);
        System.Text.RegularExpressions.Regex regex4 = new 
        System.Text.RegularExpressions.Regex(@"<iframe[sS]+</iframe *>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
        System.Text.RegularExpressions.Regex regex5 = new 
        System.Text.RegularExpressions.Regex(@"<frameset[sS]+</frameset *>", 
        System.Text.RegularExpressions.RegexOptions.IgnoreCase);
        System.Text.RegularExpressions.Regex regex6 = new 
        System.Text.RegularExpressions.Regex(@"<input[sS]+</input *>", 
        System.Text.RegularExpressions.RegexOptions.IgnoreCase);
        System.Text.RegularExpressions.Regex regex7 = new 
        System.Text.RegularExpressions.Regex(@"<style[sS]+</style *>", 
        System.Text.RegularExpressions.RegexOptions.IgnoreCase);
        System.Text.RegularExpressions.Regex regex8 = new 
        System.Text.RegularExpressions.Regex(@"<link[sS]+</link *>", 
        System.Text.RegularExpressions.RegexOptions.IgnoreCase);
        System.Text.RegularExpressions.Regex regex9 = new 
        System.Text.RegularExpressions.Regex(@"<(input|link|iframe|frameset|frame)[^>]*/>", 
        System.Text.RegularExpressions.RegexOptions.IgnoreCase);
        System.Text.RegularExpressions.Regex regex10 = 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, ""); //过滤其它控件的on...事件 
        html = regex4.Replace(html, ""); //过滤iframe 
        html = regex5.Replace(html, ""); //过滤frameset 
        html = regex6.Replace(html, ""); //过滤input
        html = regex7.Replace(html, ""); //过滤Style
        html = regex8.Replace(html, ""); //过滤link
        html = regex9.Replace(html, ""); //过滤通用标签名
        html = regex10.Replace(html, ""); //过滤尖括号星号等
        return html;
    }
    

      

    管理处理

    物理处理

    Web站点为什么会遭受攻击?是为了恶作剧?损害企业名誉?免费浏览收费内容?盗窃用户隐私信息?获取用户账号谋取私利?总之攻击方式层出不穷,作为B/S开发框架来说,帮助开发者做好解决安全问题也是刻不容缓的,本篇文章来告诉大家怎么防范非法SQL注入。

  • 相关阅读:
    Android 编程下 Eclipse 恢复被删除的文件
    Android 编程下背景图片适配工具类
    Android 编程下 Managing Your App's Memory
    Android 编程下代码之(QQ消息列表滑动删除)
    Android 编程下 Canvas and Drawables
    Android 编程下 AlarmManager
    Android 编程下去除 ListView 上下边界蓝色或黄色阴影
    Java 编程下字符串的 16 位、32位 MD5 加密
    C#枚举类型和int类型相互转换
    MVC和普通三层架构的区别
  • 原文地址:https://www.cnblogs.com/bdft/p/10105216.html
Copyright © 2011-2022 走看看