下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

SQL注入基本语法解

作者:课课家教育     来源: http://www.kokojia.com点击数:1104发布时间: 2017-09-03 16:00:50

标签: SQL注入B/S模式数据库服务器

软考,您想通过吗?一次通过才是硬道理

  SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。SQL注入是代码注入的一种,破坏性比较高,SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况,需要构造巧妙的SQL语句,从而成功获取想要的数据。SQL注入一般很隐蔽,不容易找,但是一些学校、政府和小型网站SQL注入漏洞还是比较常见的。

SQL注入基本语法解_SQL注入_B/S模式_数据库_服务器_课课家教育
  SQL是一种解释性语言,即它在运行时由另外一个运行的组件解释其语言并执行其中的代码。现在的WEB网站都是使用数据库来保存各种信息。数据库中的信息通过SQL语句来访问,执行查询、插入、删除、更新等操作。如果服务器端处理SQL语句不安全,应用程序很容易受到SQL注入攻击,读取甚至修改数据库数据,严重时可能会控制运行数据库的主机。现在常见的三种数据库是oracle、mssql、mysql,其对应的SQL语法有大同小异。
  1、最简单的SQL注入例子,select*from user where username=‘ youthflies’ ,这条sql语句是从user表里查询youthflies这个用户的所有信息,通常这个youthflies字符串是由用户输入的,如果我们输入youth’flies呢,那么服务器接收到用户的查询后,拼装sql,成为select * from user where username= ‘youth’flies’, 这条语句会产生语法错误,如果服务器端没有对错误页面进行处理,我们就可以直接看到后台爆出的异常。修改我们的输入,输入youthflies’ or ’1′=’1 , 这样服务器端的sql就会变成 select * from user where username=’youthflies’ or ’1′=’1′, 正好产生有效的sql语句,这样服务器端就会给我们返回数据库中所有的用户信息。另外也可以这样输入 youthflies’ or 1=1-,“-”是数据库的注释字符,其后面的字符串会被当成注释处理,服务器端变成 select * from user where username=’youthflies’ or 1=1-’, 效果一样。 PS: mysql中-之后要有一个空格, 或者用#制定后面的字符时注释。
  2、 前面的例子只是查询时sql注入,如果用户登录时候产生sql注入,那就可以绕够密码验证了。假如用户登录时,服务器端的sql语句为 select * from user where username=’youthflies’ and password=’passwd’, 我们用户名填写 admin’ or 1=1- ,这样服务器端的sql拼装为select * from user where username=’admin’ or 1=1 -’ and password =’passwd’, 这样如果管理员的用户名是admin,那我们就可以直接以管理员身份登录了。但是如果猜不出管理员的用户名,用户名可以这样 ‘ or 1=1- ,管理员一般是数据库中的第一个用户,这样就很有可能返回管理员的权限。
  SQL注入攻击是我们需要担心的事情,知道它是怎么回事远远是不够的,我们需要的是对它进行防范。
  .NET防SQL注入方法
  1、利用SqlCommand传参数的方法:
  string strSQL="SELECT * FROM [user] WHERE user_id=@id";
  SqlCommand cmd = new SqlCommand();
  cmd.CommandText = strSQL;
  cmd.Parameters.Add("@id",SqlDbType.VarChar,20).Value=Request["id"].ToString();
  2、过滤禁止运行法:
  /// <summary>
  /// 过滤SQL语句,防止注入
  /// </summary>
  /// <param name="strSql"></param>
  /// <returns>0 - 没有注入, 1 - 有注入 </returns>
  public int filterSql(string sSql)
  {
  int srcLen, decLen = 0;
  sSql = sSql.ToLower().Trim();
  srcLen = sSql.Length;
  sSql = sSql.Replace("exec", "");
  sSql = sSql.Replace("delete", "");
  sSql = sSql.Replace("master", "");
  sSql = sSql.Replace("truncate", "");
  sSql = sSql.Replace("declare", "");
  sSql = sSql.Replace("create", "");
  sSql = sSql.Replace("xp_", "no");
  decLen = sSql.Length;
  if (srcLen == decLen) return 0; else return 1;
  }
  3、存储过程
  js版的防范SQL注入式攻击代码:
  <script language="javascript">
  <!--
  var url = location.search;
  var re=/^\\?(.*)(select%20|insert%20|delete%20from%20|count\\(|drop%20table|update%20truncate%20|asc\\(|mid\\(|char\\(|xp_cmdshell|exec%20master|net%20localgroup%20administrators|\\"|:|net%20user|\\|%20or%20)(.*)$/gi;
  var e = re.test(url);
  if(e) {
  alert("地址中含有非法字符~");
  location.href="error.asp";
  }
  //-->
  <script>
  以上只是个人愚见,如若您有更好的见解不妨和我们我们交流。如果您喜欢本文,请分享给您的朋友,想要学习更多的IT课程,欢迎登陆课课家教育或关注公众号【课课家IT精品课程】学习。

赞(27)
踩(0)
分享到:
推荐查看
华为认证网络工程师 HCIE直播课视频教程