在执行SQL查询的时候,为了考虑安全性,所以用户提交的字段都必须经过关键字转义后才执行数据库查询
假设
sql = "select * from 表 where uName='select'"
由于select是关键字,需要过滤掉,若不过滤容易造成安全隐患
我的过滤方法是把s替换成html的转义符s
可是存入数据库当中的时候,则变成了select
这样在字段限制大小的情况下又会产生错误
请问有什么办法,可以将一些字符转义成sql不会去处理的,并且进行转义后储存?

解决方案 »

  1.   

    SELECT *
    FROM titles
    WHERE notes LIKE 'aa%'''
       ESCAPE ''''用ESCAPE 或[]
      

  2.   

    如楼上:加[]或ESCAPE
    如字段名count,在sql中用[count]
      

  3.   

    可以用数字来表示的字段比如 int,float,decimal,double等等用个 clng过滤后传入sql语句中,或直接用isnumeric之类的函数检测.
    datetime可以用isdate
    可以用字符表示的字段,比如 char,varchar,等等,将 ' 替换为 ''(是两个单引号,不是一个双引号) 就行了.
    没必要像你那样 将什么乱七八糟的都替换了.
      

  4.   

    记住一点, 防sql 注入,只需对参数类型和  SQL需转义的字符做转义. 不需要替换关健字.做好了转义, 传进来的关健字也只是 SQL 中的字串.
    set @sql='select * from tb where name =''count'''
    就像这个一样. nbsi你可以搜一下,这就是我们几年前弄的注入工具.
      

  5.   

    以下问题我理解不透,请高人指教
    EXEC ('select 部门,姓名,性别'+@sql+',打卡日期,编号from 临时where 打卡日期between '2008-6-1' and '2008-06-20' group by 部门,姓名,性别,打卡日期,编号')
    这句是无法运行的,因为between '2008-6-1' and '2008-06-20' 没有进行转义,改成如下格式就可以了
    EXEC ('select 部门,姓名,性别'+@sql+',打卡日期,编号from 临时 where 打卡日期between ''2008-6-1'' and ''2008-06-20'' group by 部门,姓名,性别,打卡日期,编号') 
    加双引号就可以(between ''2008-6-1'' and ''2008-06-20'' ) ,这是为什么呢,我想不通,请高人指教.
      

  6.   


    加双引号在动态SQL中就是' (单引号)意思了。。