如果你的代码写:  string sql=Text1.Text;我看你根本无法过滤什么东西。因此你的答案纯粹要看你的sql语句怎么拼写。例如如果仅用于拼写在sql语法中“常量”位置,例如:
 
 string sql_1="select year([退休时间]) from [员工--中国部] where age >"+ x;
 string sql_2="select [标题] from [文章,小说] where [标题] like '"+y+"%'";
 string sql_3="select * from ["+z+"]";这里,根本没有什么“过滤”概念,而是只要符合语法就行。为了符合语法,你要确保x确实是一个int类型的,所以应该写:
  string x=int.parse(TextBox1.Text).ToString(); //除字符以外所有类型常量都应该用parse解析同样为了符合语法,你要确保y是 nvarchar 并且其中的'号应该写为两个'号(这是SQL语法要求的),所以应该写:
  string x=TextBox1.Text.Replace("'","''");同样为了语法,只需要写:
  string z=TextBox1.Text;  //表名中可包含空格、特殊字符等,看SQL语法,不要轻信“过滤”之说注意,当这种将数据拼在SQL的常量部位的写法总,纯粹是为了保证SQL语法正确,我看到“过滤”二字以及在这个上面做文章的文章就觉得很成问题。以上三种(其实还有更多种)其实都是从SQL语法出发的,属于你应该把SQL语法学好,不要轻信“过滤”之说。

解决方案 »

  1.   

    哦,上面的y还是少了对两个替换符号的处理。察看一下SQL语法,它会告诉你当like运算中出现%符号的时候应该写为什么符号。
    上面查询“标题”的语句凭什么不能包含'号呢?显然过滤是毫无道理的,应该正确地接受这些符号,并且按照相应的SQL语句的语法去进行正确的替换,而不是过滤。
      

  2.   

    “过滤”什么时候可以牵强地接受呢?当你写  string sql = "select abc from def where 1=1 and "+x;这种时候,也就是说设计者已经不顾语法,直接让客户端输入SQL语句(而不是常量)了。但是这种编程很少出现在正式的程序员的作品中。“过滤”一词用语“放注入”有时候到了比较可笑的地步,很多人不知道如何注入、不知道如何写SQL,而去首先考虑如何过滤。不知道自己的目的地在哪里,而去准备行装,相当盲目。
      

  3.   

    哦,我写的那一行代码也没有对 z 中包含的“]”号进行替换。其实我也不知道如何替换,一方面因为我不写这样的代码,另一方面这必须即时查相应数据库的SQL手册,手册上已经写的很清楚,跟“防注入”无关,如果能够注入,纯粹是写的代码根本不合SQL语法。
      

  4.   

    知道怎么过滤  汗~    要过滤哪些东西?or,and '& + ,''可以了吗?
      

  5.   

    比较弱的规则里,需要过滤的敏感符号有 ' % & @
    比较强的规则里,会把sql 的关键字都过滤掉,比如 select update delete declare 等
    不过后一个强规则会让用户发表的部分内容丢失,需要看实际情况决定
      

  6.   

    ' % & @
    一般认为是以上四个
      

  7.   

    SQL 语句用参数,限制好参数数据类型
    在加一些特殊字符的过滤
      

  8.   

    逗号/分号/&/还有就是访问权限控制,不能使用sa帐户,这样就不能执行系统的sp了