/// <summary>
/// Sql防注入字符串过滤
/// </summary>
/// <param name="strInput">要过滤的字符串</param>
 /// <returns>过滤后的字符串</returns>
public string SqlEncode(string strInput)
{
    string[] src = { "'"};
    string[] dis = { "''"};
    for (int i = 0; i < src.Length; i++)
    {
       strInput.Replace(src[i], dis[i]);
     }
     return strInput;
}
我想不出来其它,好像这个就够了。
大家一起来帮我完善。

解决方案 »

  1.   

    过滤基本上起不到什么作用、例如你要过滤掉and 只要我构造 aandnd ,你过滤了and后还会变成and 
      

  2.   

    private bool ProcessSqlStr(string Str)
        {
            bool ReturnValue = false;
            try
            {
                if (Str != "")
                {
                    string SqlStr = "and|exec|insert|select|delete|update|count| *|chr|mid|master|truncate|char|declare|' ";
                    string[] anySqlStr = SqlStr.Split('|');
                    foreach (string ss in anySqlStr)
                    {
                        if (Str.Contains(ss.Trim()))
                        {
                            ReturnValue = true;
                            break;
                        }
                    }
                }
            }
            catch
            {
                ReturnValue = false;
            }
            return ReturnValue;
        }
    这个可以吧
      

  3.   

    private bool ProcessSqlStr(string Str) 有这个,照样可以注入
      

  4.   

    不拼接sql就得了,全部用参数。
    现在用LINQ就不存在这样的问题.
      

  5.   

    不是吧?
    比如我传了个参数@Conditon
    set @sql='select * from table'+@Conditon;
    如果@Conditon里有注入,最后连接出来的SQL不是有问题吗?
      

  6.   

    只是判断了一些关键字。
    比如一篇文单里面,出现了Update就不让人家发表吗?
      

  7.   

    使用参数化查询可以防止注入
    System.Data.SqlClient.SqlConnection   cnn   =   new   System.Data.SqlClient.SqlConnection("连接字符串");   
      System.Data.SqlClient.SqlCommand   cm   =   new   System.Data.SqlClient.SqlCommand();   
      cm.Connection   =   cnn;   
      cm.CommandText   =   "insert   into   table1   (field1,field2)   values(@field1,@field2)";   
        
      cm.Parameters.Add("@field1",SqlDbType.Float);   
      cm.Parameters["@field1"].Value   =   1;   
      cm.Parameters.Add("@field2",SqlDbType.DateTime   );   
      cm.Parameters["@field2"].Value   =   System.DBNull.Value;   
      cnn.Open();   
      cm.ExecuteNonQuery();   
      cnn.Close();
      

  8.   

    不是吧? 
    比如我传了个参数@Conditon 
    set @sql='select * from table'+@Conditon; 
    如果@Conditon里有注入,最后连接出来的SQL不是有问题吗?你的@sql就没个类型阿 定义好类型不就可以了?
      

  9.   

    通过存储过程和参数实现数据维护。
    public static string  GetQueryStringSafe(string pStr)
         {
              bool IsValue = true;
             if (pStr != null && pStr.Length > 0)
              {
                   pStr = pStr.ToLower();
                   string strSQLin = "'|and|--|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|;|&|%20|==|>|<";
                  string[] strSQLinGroup = strSQLin.Split(new char[] { '|' }, 23);              for (int i = 0; i < strSQLinGroup.Length; i++)
                 {
                     if (pStr.IndexOf(strSQLinGroup[i]) >= 0)
                       {
                          IsValue = false;
                           break;
                      }
                  }
               }
               else
               {
                  IsValue = false;
              }
               if (IsValue)
               {
                   return pStr;
               }
               else
                  return "";
           } 
    http://www.cnblogs.com/raindust/articles/1219407.html
      

  10.   

    通用分页。这个是条件字符串
    @SQL也是varchar
      

  11.   

    比较安全的做法就是使用存储过程或者参数化SQL语句,用替换的办法一个是容易遗漏,而是效率上会有些问题。
      

  12.   

    set @sql='select * from table'+@Conditon;
    这种用法用起来是省事,但不推荐,存储过程的优点发挥不出来
    条件建议一个字段一个字段地表示,最好不要传入整个条件字符串
      

  13.   

    建议用SqlParameter这个类来解决注入问题,如果你不要用,还有一个办法,就是判断用户输入的参数是否有'这个符号就可以了,因为一般的注入的人,参数中一定会带上这个'符号的。像上面循环判断是否关键字之类的方法,用也是可以用,但是感觉都是垃圾代码!花那么多的循环时间去做不一定对的事!
      

  14.   

    1. 永远不要使用动态SQL。如果必须,那么就用一个受限用户来执行。
    2. 分类你的数据,对你的秘密数据进行加密。
    3. 使用多层设计。改变UI-》DATABASE这样的做DEMO程序使用的习惯。其实,好的编码习惯能够避免很多麻烦。有句话叫做苍蝇不叮.........
      

  15.   

    对于MS SQL SERVER,如果条件个数不固定的话,可以通过系统存储过程 sp_executesql 来执行关于SQL防注入,建议使用顺序是
    存储过程
    SqlParameter
    sp_executesql
    字符串过滤(这种方法应该根本不用考虑)
    但不管使用哪种方案,均不应该使用一个完整的条件串
    例如:
    有表test(name,age,city)
    需要按年龄范围和城市进行查询
    那么条件的指定应该分别指定年龄(age)和城市(city),而不能传入一个类似于 age>3 and city='江苏' 这样的条件字符串
    还有,执行SQL语句时,应该尽量直接执行,而不是先组织、拼接一条SQL语句,
    然后通过Exec来执行,这样也可能防注入失败。
      

  16.   


    有非法字符就禁止提交了,变成AND也无所谓。
      

  17.   

    组织拼接一条SQL语句再Exec是不能防注入的,不是有可能失败。
      

  18.   

    字符串过滤的方法应用有局限性,如果类似于新闻采集的系统,你凭什么不让人家使用这些单词呢
    and|exec|insert|select|delete|update|count| *|chr|mid|master|truncate|char|declare|