日期:2014-05-18  浏览次数:20510 次

C# 过滤非法字符的函数,希望给个全一点的。谢谢。
C# 过滤非法字符的函数
主要是为了防止sql注入攻击。
因为没有用到sql参数传递,
所以需要一个过滤函数。
希望给个全一点的。

------解决方案--------------------
这种是错误的防注入方法,原因如下:

可能替换不全,不是所有的关键字都列入其中了的。 
本身这种替换就有漏洞,比如 aandnd 本身没有问题,把其中的 and 替换掉后,反而冒出一个 and 出来。 
这种替换方式还破坏了文字的原义,我曾经在某个网站上注册了 candy 这个用户名,后来该系统却告诉我没有这个用户,后来才知道 candy 中的 and 被去掉了。


正确的防注入方法是:

对数字类型进入 sql 前强制转换为数字。 
对文本类型进入 sql 前替换单引号为双引号。 
对日期类型进入 sql 前强制转换成日期,并替换单引号为双引号。
这是从注入的原理来防的。

------解决方案--------------------
为什么不使用参数化@id 之类的呢?
string sql="select * from id=@id";
SqlCommand cmd=new SqlCommand(sql,conn);

------解决方案--------------------
C# code

public string CheckSql(string str) 
        { 
            string s=string.Empty ;
            if (str==null)
            { 
                s = string.Empty ;
            }
            else
            {
                s = str.Replace("'","").Replace("*","").Replace("select","")
                       .Replace("where","").Replace(";","").Replace("(","").Replace(")","").Replace("drop","").Replace("DROP","").Replace("and","").Replace("or","").Replace("delete","").Replace("asc","").Replace("<","").Replace(">","").Replace("=","").Replace(";","").Replace("&","").Replace("*","").Replace(" ","");
            } 
            return s;
        }

------解决方案--------------------
正则不行么?
------解决方案--------------------
private bool ProcessSqlStr(string Str)
{
bool ReturnValue = true;
try
{
if (Str.Trim() != "")
{

string SqlStr = "exec|insert+|select+|delete|update|count|chr|mid|master+|truncate|char|declare|drop+|drop+table|creat+|create|*|iframe|script|";
SqlStr += "exec+|insert|delete+|update+|count(|count+|chr+|+mid(|+mid+|+master+|truncate+|char+|+char(|declare+|drop+table|creat+table"; 
string[] anySqlStr = SqlStr.Split('|');
foreach (string ss in anySqlStr)
{
if (Str.ToLower().IndexOf(ss) >= 0)
{
ReturnValue = false;
break;
}
}
}
}
catch
{
ReturnValue = false;
}
return ReturnValue;
}
------解决方案--------------------
/// <summary>
/// 检查是否含有非法字符
/// </summary>
/// <param name="str">要检查的字符串</param>
/// <returns></returns>
public static bool ChkBadChar(string str)
{
bool result = false;
if (string.IsNullOrEmpty(str))
return result;
string strBadChar, tempChar;
string[] arrBadChar;
strBadChar = "@@,+,',--,%,^,&,?,(,),<,>,[,],{,},/,\\,;,:,\",\"\"";
arrBadChar = SplitString(strBadChar, ",");
tempChar = str;
for (int i = 0; i < arrBadChar.Length; i++)
{
if (tempChar.IndexOf(arrBadChar[i]) >= 0)
result = true;