一个SQL语句的安全问题!高手来~~
asp.ent c#
sqlcomm = "SELECT * FROM Agents WHERE (AgentsIsOnline like  @Value ) ";
Sql.splpar("@Value", SqlDbType.VarChar, 5, "%" + Value + "%")  
SQLHelper.ExecuteReader
这样的Value是否安全,或需要过滤?
疑问:
1、Value不都写成参数了吗?为什么参数里带 %能在SQL里执行?
2、带参数,是不是可以过滤SQL注入?
------解决方案--------------------1、你在程序里面要对传入sql的参数 Value  进行检查,这样才能保证数据安全
2、"%" + Value+"%" 应该是动态 sql 语句的查询条件,sql可以执行的
------解决方案--------------------public static  string GenSafeChars(string SourceString)
		{
			if(SourceString!=null)
				SourceString=SourceString.Replace("'","''");
			else
				SourceString="";
			return SourceString;				
		}
------解决方案--------------------3楼的语句,根本就不可能执行的啊,你到底需要达到什么目的啊
------解决方案--------------------用 preparestatement,预处理,或者是类似的名字,里面带有@的那种,可以取消,控制字符的转义
------解决方案--------------------同意7樓的辦法,
還可以對value進行處理。單引號換成雙引號。
------解决方案--------------------不安全。可以SQL注入。
比如,value的值就是 " '%' ",那你的SQL语句变成:
SELECT   *   FROM   Agents   WHERE   (AgentsIsOnline   like     '%'   )  
或者,value的值是 " '%' ) or ( 1 = 1' ",那你的SQL语句变成:
SELECT   *   FROM   Agents   WHERE   (AgentsIsOnline   like     '%' ) or ( 1 = 1 )  
尤其是第二句,可以把表里面的全部记录都返回。 :)
------解决方案--------------------to 搂主
你的例子举的不好,SqlDbType.VarChar(5)长度的基本上不可能被注入.
------解决方案--------------------sqlcomm   =   "SELECT   *   FROM   ATB   WHERE   (ATB1   like     @Value   )";  
SqlParameter[]   para   =   {Sql.splpar("@Value",SqlDbType.VarChar,20,"%"+Value+"%")}  
我试了'%'   )   or   (   1   =   1 没用.  
-----------------------------------------------------
嗯,你使用的SQL中已经明确指明是应用一个参数,不是那种纯粹动态构造一个查询的。
明确指定参数要安全很多。
那么value = '%' 呢?
------解决方案--------------------=什么都所谓,只不过的是改变查询条件。并不能执行你定义的语句。也就是说没有通常所说的安全风险。
------解决方案--------------------cpp2017  
慕白兄(非常十分以及极其怀念旧版论坛)  
等 级:
  发表于:2007-12-19 11:31:3016楼 得分:0  
参数化写法可以避免sql   注入.    
--------------------------
慕白兄跑来泡SQL版了?
呵呵```欢迎欢迎``