A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 瞎猫馒头米田共 中级黑马   /  2013-8-20 21:26  /  1711 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

只有存储过程才能解决SQL注入风险是吗

6 个回复

倒序浏览
SQL注入技术

强制产生错误
对数据库类型、版本等信息进行识别是此类型攻击的动机所在。它的目的是收集数据库的类型、结构等信息为其他类型的攻击做准备,可谓是攻击的一个预备步骤。利用应用程序服务器返回的默认错误信息而取得漏洞信息。
采用非主流通道技术
除HTTP响应外,能通过通道获取数据,然而,通道大都依赖与数据库支持的功能而存在,所以这项技术不完全适用于所有的数据库平台。SQL注入的非主流通道主要有E-mail、DNS以及数据库连接,基本思想为:先对SQL查询打包,然后借助非主流通道将信息反馈至攻击者。
使用特殊的字符
不同的SQL数据库有许多不同是特殊字符和变量,通过某些配置不安全或过滤不细致的应用系统能够取得某些有用的信息,从而对进一步攻击提供方向。
使用条件语句
此方式具体可分为基于内容、基于时间、基于错误三种形式。一般在经过常规访问后加上条件语句,根据信息反馈来判定被攻击的目标。
利用存储过程
通过某些标准存储过程,数据库厂商对数据库的功能进行扩展的同时,系统也可与进行交互。部分存储过程可以让用户自行定义。通过其他类型的攻击收集到数据库的类型、结构等信息后,便能够建构执行存储过程的命令。这种攻击类型往往能达到远程命令执行、特权扩张、拒绝服务的目的。
避开输入过滤技术
虽然对于通常的编码都可利用某些过滤技术进行SQL注入防范,但是鉴于此种情况下也有许多方法避开过滤,一般可达到此目的的技术手段包括SQL注释和动态查询的使用,利用截断,URL编码与空字节的使用,大小写变种的使用以及嵌套剥离后的表达式等等。借助于此些手段,输入构思后的查询可以避开输入过滤,从而攻击者能获得想要的查询结果。
推断技术
能够明确数据库模式、提取数据以及识别可注入参数。此种方式的攻击通过网站对用户输入的反馈信息,对可注入参数、数据库模式推断,这种攻击构造的查询执行后获得的答案只有真、假两种。基于推断的注入方式主要分为时间测定注入与盲注入两种。前者是在注入语句里加入语句诸如“waitfor 100”,按照此查询结果出现的时间对注入能否成功和数据值范围的推导进行判定;后者主要是“and l=l”、“and l=2”两种经典注入方法。这些方式均是对一些间接关联且能取得回应的问题进行提问,进而通过响应信息推断出想要信息,然后进行攻击。
所以存储过程并非可以彻底解决SQL的注入问题。。。。。。
回复 使用道具 举报
SQL注入通过前台读取出数据库中的内容,

别让用户自己能使用SQL语句就可以了。。换句话说,要对用户输入信息进行过滤。~
回复 使用道具 举报
也可以在程序中通过用SqlParameter这种方式把参数值传入拼接sql语句。
例如:
string sql="select *  from test where id=@id and name=@name";
SqlParameter[] params= new SqlParameter[] { new SqlParameter("@id", 参数值), new SqlParameter("@name", 参数值) };
这样也是可以的;
回复 使用道具 举报
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Configuration;
  6. using System.Data.SqlClient;

  7. namespace sql注入
  8. {
  9.     class Program
  10.     {
  11.         static void Main(string[] args)
  12.         {
  13.             string dataDir = AppDomain.CurrentDomain.BaseDirectory;
  14.             if (dataDir.EndsWith(@"\bin\Debug\") || dataDir.EndsWith(@"\bin\Release\"))
  15.             {
  16.                 dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName;
  17.                 AppDomain.CurrentDomain.SetData("DataDirectory", dataDir);
  18.             }
  19.             Console.WriteLine("请输入用户名:");
  20.             string userName = Console.ReadLine();
  21.             Console.WriteLine("请输入密码:");
  22.             string passWord = Console.ReadLine();
  23.             string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
  24.             using (SqlConnection conn = new SqlConnection(connStr))
  25.             {
  26.                 conn.Open();
  27.                 using (SqlCommand cmd = conn.CreateCommand())
  28.                 {
  29.                     //cmd.CommandText = "select * from T_Users where FName='"+userName+"' and FPass='"+passWord+"'";//拼接字符串容易出现sql注入,如果用户输入admin,密码输入1' or '1'='1也会提示登录成功
  30.                     cmd.CommandText = "select * from T_Users where FName=@name and FPass=@password";//使用参数查询的时候会把参数当作一项去数据表中做比较,而不是拼接字符串
  31.                     cmd.Parameters.Add(new SqlParameter("name",userName));
  32.                     cmd.Parameters.Add(new SqlParameter("password", passWord));
  33.                     using (SqlDataReader reader = cmd.ExecuteReader())
  34.                     {
  35.                         if (reader.Read())
  36.                         {
  37.                             Console.WriteLine("登陆成功");
  38.                         }
  39.                         else
  40.                         {
  41.                             Console.WriteLine("用户名或密码错误");
  42.                         }
  43.                     }
  44.                 }
  45.             }
  46.             Console.ReadKey();
  47.         }
  48.     }
  49. }
复制代码
回复 使用道具 举报 1 0
其实SQL注入产生的原因就是从客户端传过来的内容不可信,在执行上和计划上发生了偏差。所以如何来防范客户端传过来的内容才是问题的本质。总体来说可以分为三种方法:
(1)对用户输入的字符串进行检测:例如只能让用户输入英文和数字,一些特殊字符拒绝让用户输入。但是这样做的缺点是对有要求的用户造成了输入困难。而且特殊字符也无法穷举,并不能保证万无一失。
(2)使用存储过程:将参数传到存储过程里面处理,这样便可以有效防止SQL语句执行中的偏差。而且存储过程可以加快执行过程。
(3)参数化查询:就是凡需要传值或者数据的地方均作为参数来处理。在这种情形下,数据库不会将参数的内容视为SQL指令的一部分来处理。而是等数据库完成编译后,才调用参数运行。所以说即使有一些特殊内容,也会被数据库傻傻过滤掉,不会再来坑爹了!!!
参数化的例子就参考楼上吧!

评分

参与人数 1技术分 +1 收起 理由
赵宗荣 + 1

查看全部评分

回复 使用道具 举报
防sql注入式攻击,一般很少在客户端做输入限制,只在服务器端做防范处理
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马