• web开发中常见的安全漏洞及避免方法


    1、安全攻击

        1、SQL、HTML、JS、OS命令注入

        2、XSS跨站脚本攻击,利用站内信任的用户,在web页面插入恶意script代码

        3、CSRF跨站请求伪造,通过伪装来自信任用户的请求来利用受信任的网站。

        4、目录遍历漏洞

        5、参数篡改

        6、会话劫持

    2、防止攻击的措施总结

    1) 对用户输入的数据进行全面安全检查或过滤,尤其注意检查是否包含SQL 或XSS特殊字符。

       验证用户输入的数据,包括值、类型、范围等等,用验证控件进行验证 RequiredFieldValidator RangeValidator RegularExpressionValidator

       这些检查或过滤必须在服务器端客户端都进行。客户端服务端都要进行验证,客户端为了提高用户体验,服务端才可以有效防止威胁

    2)不要使用管理员权限的数据库连接,不要使用动态拼接sql

    3)机密信息加密,不能使用明文

    4)每个页面加载时,对用户合法性进行判断。

    5)登录后session中的敏感信息需要加密,避免在永久cookies中存储敏感信息,重要的cookie标记为http only

    6)发送敏感信息时使用SSL、POST方式,尽量使用新型web HSTS安全协议

    7)不要直接抛出异常的详细信息给用户,异常返回友好的页面,防止用户看到敏感信息

    8)在服务器与网络的接口处配置防火墙,用于阻断外界用户对服务器的扫描和探测。

    9)限制网站后台访问权限,如:禁止公网IP访问后台;禁止服务员使用弱口令。

    10)关闭windows的8.3格式功能。DOS系统下的命令方式为8.3格式,即文件名不超过8个字符,扩展名不超过3个字符。形如:???.exe 。

           现在Windows系统文件名长度最长可达255个字符了。

    11)限制敏感页面或目录的访问权限。

    12)项目发布前使用使用漏洞扫描软件,如IBM appScan,UnisWebScanner,对安全性进行评估。

    安全漏洞及防止:

    1、sql注入漏洞
         1、在框架中内置对有害语句及符号的过滤,如insert ‘ update,在基类进行过滤,这样子类就不用关心也可以避免这些常用的攻击了

          

     /// <summary>
            /// 过滤 Sql 语句字符串中的注入脚本
            /// </summary>
            /// <param name="source">传入的字符串</param>
            /// <returns>过滤后的字符串</returns>
            public static string SqlFilter(string source)
            {
                if (string.IsNullOrEmpty(source))
                {
                    return "";
                }
                //单引号替换成两个单引号
                source = source.Replace("'", "''");
                source = source.Replace(""", "");
                source = source.Replace("&", "&amp");
                source = source.Replace("<", "&lt");
                source = source.Replace(">", "&gt");
                source = source.Replace("delete", "");
                source = source.Replace("update", "");
                source = source.Replace("insert", "");
    
                //半角封号替换为全角封号,防止多语句执行
                source = source.Replace(";", ";");
    
                //半角括号替换为全角括号
                source = source.Replace("(", "(");
                source = source.Replace(")", ")");
    
                ///////////////要用正则表达式替换,防止字母大小写得情况////////////////////
    
                //去除执行存储过程的命令关键字
                source = source.Replace("Exec", "");
                source = source.Replace("Execute", "");
    
                //去除系统存储过程或扩展存储过程关键字
                source = source.Replace("xp_", "x p_");
                source = source.Replace("sp_", "s p_");
    
                //防止16进制注入
                source = source.Replace("0x", "0 x");
                return source;
            }


         2、坚持使用参数化方式赋值
         3、不要直接抛出异常的详细信息给用户,异常返回友好的页面,防止用户看到数据库的细节,关闭了Web.Config的CustomErrors的时候,可能就不会看到。
             <system.web>
                  <compilation debug="true" targetframework="4.0" />
             </system.web>
    2、XSS又叫CSS--Cross Site Script 跨站脚本攻击
         1、清理用户输入,过滤js代码,过滤特殊字符
              [1] <>(尖括号)     [5] ;(分号)
              [2] "(引号)           [6] ()(括号)
              [3] '(单引号)         [7] &(& 符号)
              [4] %(百分比符号) [8] +(加号)
         2、使用HttpUitility及AntiXSSLibrary类库中的方法对html代码进行处理

               赋值不会弹框 this.lblName.Text = Encoder.HtmlEncode("<script>alert('OK');</script>");

    编码方法 使用场景
    HtmlEncode(String) 不受信任的HTML代码。
    HtmlAttributeEncode(String) 不受信任的HTML属性
    JavaScriptEncode(String) 不受信任的输入在JavaScript中使用
    UrlEncode(String) 不受信任的URL
    VisualBasicScriptEncode(String) 不受信任的输入在VBScript中使用
    XmlEncode(String) 不受信任的输入用于XML输出
    XmlAttributeEncode(String) 不 受信任的输入用作XML属性


    3、用户信息用MD5加密
        

           #region MD5加密
    
            /// <summary>
            /// 获取MD5哈希值
            /// </summary>
            /// <param name="Text">字符串</param>
            /// <returns>MD5哈希值</returns>
            public static string GetMd5Hash(string Text)
            {
                MD5 md5 = MD5.Create();
                byte[] data = md5.ComputeHash(Encoding.Default.GetBytes(Text));
                StringBuilder builder = new StringBuilder();
                for (int i = 0; i < data.Length; i++)
                {
                    builder.Append(data[i].ToString("x2"));
                }
                return builder.ToString();
            }
    
            /// <summary>
            /// 验证MD5哈希值
            /// </summary>
            /// <param name="Text">字符串</param>
            /// <param name="TextHash">哈希值</param>
            /// <returns>相同返回True,不同返回False</returns>
            public static bool VerifyMd5Hash(string Text, string TextHash)
            {
                string hash = GetMd5Hash(Text);
                StringComparer comparer = StringComparer.OrdinalIgnoreCase;
                if (0 == comparer.Compare(hash, TextHash))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
    
            #endregion
    

      

    4、在页面加载时判断用户是否登录,如果没有登录则转到登录界面,每个页面继承基类BaseControl

      protected override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                //身份验证
                if (CurrentUser == null)
                {
                    string request = System.Web.HttpContext.Current.Request.Headers.Get("X-Requested-With");
    
                    if (string.Compare(request, "XMLHttpRequest", true) == 0)
                    {
                        filterContext.Result = new JsonResult { Data = "登录超时,请刷新页面!" };
                        filterContext.HttpContext.Response.ContentType = "text/plain;charset=UTF-8";
                        filterContext.HttpContext.Response.Status = "403 Internal Server Error";
                        filterContext.HttpContext.Response.StatusCode = 403;
                    }
                    else
                    {
                        filterContext.Result = new RedirectResult("~/Login/SessionOutTime");
                    }
                }
            }
    

      

    参见:

    Web的脆弱性:各种注入、攻击

    Web开发常见的几个漏洞解决方法

    PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等)

  • 相关阅读:
    面向对象简述
    python面向对象
    Python中int()函数的用法浅析
    给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
    python中关于round函数的小坑
    Xmind8破解,以及相关的流程和破解包
    生成器和生成器表达式
    brush图标
    js声明全局变量的方式
    js修改全局变量
  • 原文地址:https://www.cnblogs.com/xiaochun126/p/5113371.html
Copyright © 2020-2023  润新知