日期:2014-05-18  浏览次数:20420 次

一个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版了?
呵呵```欢迎欢迎``