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);
[解决办法]
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%不需要吗??
[解决办法]
顶起来~ 我也遇到这样的问题了
[解决办法]
// 检测字符串中是否有非法的字符,如果有,返回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; }