读书人

C# 过滤非法字符的函数,希望给个全一点

发布时间: 2012-02-19 19:43:39 作者: rapoo

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;


}
return result;
}

/// <summary>
/// 过滤非法字符
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string ReplaceBadChar(string str)
{
if (string.IsNullOrEmpty(str))
return "";
string strBadChar, tempChar;
string[] arrBadChar;
strBadChar = "@@,+,',--,%,^,&,?,(,),<,>,[,],{,},/,\\,;,:,\",\"\"";
arrBadChar = SplitString(strBadChar, ",");
tempChar = str;
for (int i = 0; i < arrBadChar.Length; i++)
{
if (arrBadChar[i].Length > 0)
tempChar = tempChar.Replace(arrBadChar[i], "");
}
return tempChar;
}


/// <summary>
/// 替换sql语句中的有问题符号
/// </summary>
public static string ReplaceBadSQL(string str)
{
string str2 = "";
if (string.IsNullOrEmpty(str))
{
return "";
}
string str1 = str;
string[] strArray = new string[] { "'", "--" };
StringBuilder builder = new StringBuilder(str1);
for (int i = 0; i < strArray.Length; i++)
{
str2 = builder.Replace(strArray[i], "").ToString();
}
return builder.Replace("@@", "@").ToString();


}

[解决办法]
借楼主宝地向高手问个问题,如果使用了存储过程还需要过滤非法字符吗?
[解决办法]
借楼主宝地向高手问个问题,如果使用了存储过程还需要过滤非法字符吗?
是100%不需要吗??
[解决办法]
顶起来~ 我也遇到这样的问题了
[解决办法]

C# code
    // 检测字符串中是否有非法的字符,如果有,返回true    public bool ChkBadWord(string badword)    {        string[] bw = strbadword();        bool isok = false;        foreach (string str in bw)        {            if (badword.IndexOf(str) > -1)            {                isok = true;                return isok;            }        }        return isok;    }    private string[] strbadword()    {        string[] bad = new string[15];        bad[0] = "'";        bad[1] = "\"";        bad[2] = ";";        bad[3] = "--";        bad[4] = ",";        bad[5] = "!";        bad[6] = "~";        bad[7] = "@";        bad[8] = "#";        bad[9] = "$";        bad[10] = "%";        bad[11] = "^";        bad[12] = "&";        bad[13] = "  ";        bad[14] = "_";        return bad;    } 

读书人网 >asp.net

热点推荐