要么就过滤全,要么就参数化的方式
还有,如果你的程序运行的是内网的环境,我想这个不是什么问题
你把查询条件参数化就行,光过滤单引号不行。简单的例子是:条件A: 1=1;drop table xxxx
好像这样会直接报错而不会删表
1 SqlConnection conn = new SqlConnection("data source=192.168.1.101;database=OMSCRM;uid=sa;pwd=sa;"); 2 conn.Open(); 3 SqlCommand cmd = new SqlCommand("select * FROM tbTest WHERE '1= 1;drop table tbTest'", conn); 4 cmd.ExecuteNonQuery();
在应使用条件的上下文(在 '1= 1;drop table tbTest' 附近)中指定了非布尔类型的表达式。
@koi: 晕,你的单引号还在,错误提示很明显了啊,where 后面需要跟着一个布尔型的表达式,你跟的是字符串
@飞来飞去: 对啊 我把客户端输入的单引号都过滤掉 不就不会出现例如删表的情况了吗? sql注入不久是根据单引号来弄的? 比如
select * FROM tbTest WHERE User_ID = '条件'
如果上面条件 是 qqq' or 1=1 ;drop table tbTest
结果sql就变成
select * FROM tbTest WHERE User_ID = 'qqq' or 1=1 ;drop table tbTest
过滤掉里面的单引号 不就还是
select * FROM tbTest WHERE User_ID = 'qqq or 1=1 ;drop table tbTest’
参数化和采用存储过程都行
struts2有过滤功能
存储过程!
过滤 参数化
参数化查询