看了很多写防注入代码 而且是一大堆很多都是判断有没有 SQL关键字
我认为 不必如此麻烦
第一条
string str = str.Replace("'","");
理由是任何 SQL 语句都变成了 在两个单引号之间的字符串第二条
在纯数字查询语句下 如:select * from tb where id=?
在这 种情况下 判断是不是数字就可以了 是数字就查询,非数字就给个0以上是在 没有使用存储过程下 比较简单的两条语句了欢迎高手 拍砖

解决方案 »

  1.   

    正则判断''中内容,判断是否存在关键字
    @"(?<='[\s\w]*)'(?=[\s\w]*')"
    参数操作
    where id=@id";
      

  2.   

    你用参数就不会发生sql注入了,不要直接用字符串拼接,太不安全
      

  3.   


    一个真正学过t-sql的人应该记住如何在字符常量中写单引号的“规矩”的!string str = str.Replace("'","''");
    首先如果真的按照t-sql语法来写代码,知道要把单引号处理掉才能去拼凑sql语句字符串,那么也就没有那么多很夸张的所谓“防注入噱头”了。
      

  4.   

    在你的sql server查询分析器上去写一个sql语句,字符串常量中你会不去处理单引号吗?你会在字符串常量中遇到select于是就把电源拔掉以防数据库被“注入”吗?一些编客户端小软件的人的所作所为,让数据库编程的人都笑话不已。人家数据库编程时就是可以往数据库里写单引号,所谓的“关键字”的,只要语法正确也不存在什么“注入”。都是编客户端界面的那些人不懂sql语句而产生的有bug的sql字符串。
      

  5.   


    “非数字”给个0是不对的,应该抛出异常。界面层跟业务处理层之间,应该传递强类型的数据,而不是滥用object或者string类型。如果类型不对,按照异常处理,而不应该再花费时间去查询数据库。
      

  6.   

    string str = str.Replace("'","''");
    去掉sql语句中的单引号、空格和特殊符号
      

  7.   

    其实我是想保存更完整的内容
    因为看到很多 防注入代码 都以 判断是否存在SQL关键字 而判断为非法操作
    觉得不能保存更完整的内容第一
    现在把 单引号 替换为 双单引号 就保存了更完整的内容 包括 单引号
    一开始是觉得 单引号 会分开 sql 语句 
    现在转 换成 双单引号 转义了 就没事了
    string str = str.Replace("'","''");第二
    使用强类型在非参数化和不使用存储过程下,有以上两个做法应该够了,没有什么方法可以注入了,
    如果有,贴出来,让我们这些新手们见识见识。第三
    使用参数化第四
    使用存储过程我想大家都推荐使用 后面两种方法吧,其实我也是
      

  8.   

    我没有处理输入的内容,你注入给我看看DECLARE @InputStr NVARCHAR(50);
    SET @InputStr = N'aa;DELETE FROM tb;';
    DECLARE @_SqlMain NVARCHAR(4000);
    DECLARE @_ParamsDef NVARCHAR(1000);
    SET @_SqlMain =N'SELECT * FROM tb WHERE [Name] = @InputStr;';
    SET @_ParamsDef = N'@_InputStr NVARCHAR(50)';
    EXECUTE SP_EXECUTESQL @_SqlMain,@_ParamsDef,@InputStr;
      

  9.   

    请参考以下MSDN链接:
    使用 sp_executesql:
    http://msdn.microsoft.com/zh-cn/library/ms175170.aspx
    SQL 注入:
    http://msdn.microsoft.com/zh-cn/library/ms161953.aspx