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

原文地址:https://www.cnblogs.com/xiaochun126/p/5113371.html

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,在基类进行过滤,这样子类就不用关心也可以避免这些常用的攻击了

      

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/// <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加密
    

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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" );
               }
           }
       }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值