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