<th id="v9g6b"><track id="v9g6b"></track></th>

  • <em id="v9g6b"><acronym id="v9g6b"></acronym></em>
    <progress id="v9g6b"><pre id="v9g6b"></pre></progress>
    <tbody id="v9g6b"></tbody>
    <button id="v9g6b"><acronym id="v9g6b"></acronym></button>
    <rp id="v9g6b"><ruby id="v9g6b"></ruby></rp>

        <dd id="v9g6b"></dd>

        <em id="v9g6b"></em>

          Web安全问题及防范规范之SQL注入 B/S开发框架

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

          web框架防攻击

          适用范围

          Web网站

          攻击原理

          若B/S开发框架后台SQL语句(包含存储过程)使用拼接方式输入参数,则可在Web参数中构造特殊的带SQL语句的参数进行攻击。


          示例1:

          后台SQL语句:

          set @sql= 'select * from Table where id =' + @id

          exec(@sql)

          若id为int类型,正常情况下只能传数值型参数,此时SQL注入攻击无法进行。

          但若id为string(varchar)类型时,可以人为构造特殊参数如下:

          @id='1'' select * from Table1'

          传入后则变为:

          select * from Table1 where id = '1' select * from Table1

          那么此时,后面的select语句将被执行。

          原理:

          此时起到关键作用的是''号,引号将字符串参数前面的引号闭合,导致后面的SQL语句作为真实语句执行。


          示例2:

          后台SQL语句:

          set @sql='select * from Table1 where id in(' + @param + ')'

          exec(@sql)

          构造@param='1) select * from Table2 --'

          传入后则变为:

          select * from Table1 where id in(1) select * from Table2 --)

          那么此时,后面的select语句将被执行。

          原理:

          此时起关键作用的是--号,先用)闭合前面的语句,然后将后面的语句--释掉,从而成为合法的SQL语句一起执行。

          解决方案

          应用程序处理

          1、不使用SQL拼接参数,使用参数化的方式传入参数,包括代码中SQL语句和存储过程语句。

          代码示例:

          	string sql = "select * from Table1 where id=@id";
          	SqlParameter[] pars = new[] {
          	 new SqlParameter("@id",id),
          

          };

          存储过程示例:

          	set @sql='select * from Tests where id=@id'
          	exec sp_executesql @sql, N'@id int', @id
          


          2、替换特殊符号和监视关键字

          根据攻击原理,正常情况下,替换(注意必须是替换,不是过滤删除)掉特殊符号,例如引号',分号;,双减号--等,可减少此类注入发生。

          同时监视特殊关键字,遇到则提示错误,例如declare

          示例代码(适用于MVC或Web API):

          public class SQLAntiInjectionFilterAttribute : System.Web.Http.Filters.ActionFilterAttribute
          {
              public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext filterContext)
              {
                  //对参数处理
                  var actionParameters = filterContext.ActionDescriptor.GetParameters();
          
                  foreach (var p in actionParameters)
                  {
                      if (p.ParameterType == typeof(string) && filterContext.ActionArguments[p.ParameterName] != null)
                      {
                          filterContext.ActionArguments[p.ParameterName] = FilterSQL(filterContext.ActionArguments[p.ParameterName].ToString());
                      }
          
                      else if (p.ParameterType == typeof(object))//BODY参数
                      {
                          JObject json = filterContext.ActionArguments[p.ParameterName] as JObject;
          
                          if (json != null)
                          {
                              foreach (var a in json)
                              {
                                  if (a.Value.Type == JTokenType.String)
                                  {
                                      json[a.Key] = FilterSQL(a.Value.ToString());
                                  }
                              }
                          }
                      }
                  }
                  base.OnActionExecuting(filterContext);
              }
          
              private const string StrKeyWord = @"declare |exec ";
              public string FilterSQL(string s)
              {
                  if (string.IsNullOrEmpty(s)) return string.Empty;
                  s = s.Trim().ToLower();
                  string[] strTemp = StrKeyWord.Split('|');
                  foreach (var a in strTemp)
                  {
                      if (s.IndexOf(a) >= 0)
          
                      {
                          throw new Exception("System Error!");
                      }
                  }
          
                  s = s.Replace("=", "=");
                  s = s.Replace("'", "''");
                  s = s.Replace(";", ";");
                  s = s.Replace("--", "——");
                  return s;
              }
          }

          管理处理

          使用第三方收费的Web应用防火墙,包括软件防火墙和硬件防火墙。

          例如阿里云Web应用防火墙,或亚马逊AWS WAF等。

          物理处理

          标签: B/S开发框架Web安全问题及防范规范标签

          网站&系统开发技术学习交流群:463167176

          本站文章除注明转载外,均为本站原创或翻译,欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,共创和谐网络环境。
          转载请注明:文章转载自:华晨软件-云微开发平台 ? Web安全问题及防范规范之SQL注入
          本文标题:Web安全问题及防范规范之SQL注入
          本文地址:http://www.sajuice.com/OrgTec/Back/0011.html

          相关文章: 软件工程风险管理

          电话
          电话 18718672256

          扫一扫
          二维码
          本港台开奖 <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>