/// <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;
}
我想不出来其它,好像这个就够了。
大家一起来帮我完善。
/// 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;
}
我想不出来其它,好像这个就够了。
大家一起来帮我完善。
{
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;
}
这个可以吧
现在用LINQ就不存在这样的问题.
比如我传了个参数@Conditon
set @sql='select * from table'+@Conditon;
如果@Conditon里有注入,最后连接出来的SQL不是有问题吗?
比如一篇文单里面,出现了Update就不让人家发表吗?
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();
比如我传了个参数@Conditon
set @sql='select * from table'+@Conditon;
如果@Conditon里有注入,最后连接出来的SQL不是有问题吗?你的@sql就没个类型阿 定义好类型不就可以了?
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
@SQL也是varchar
这种用法用起来是省事,但不推荐,存储过程的优点发挥不出来
条件建议一个字段一个字段地表示,最好不要传入整个条件字符串
2. 分类你的数据,对你的秘密数据进行加密。
3. 使用多层设计。改变UI-》DATABASE这样的做DEMO程序使用的习惯。其实,好的编码习惯能够避免很多麻烦。有句话叫做苍蝇不叮.........
存储过程
SqlParameter
sp_executesql
字符串过滤(这种方法应该根本不用考虑)
但不管使用哪种方案,均不应该使用一个完整的条件串
例如:
有表test(name,age,city)
需要按年龄范围和城市进行查询
那么条件的指定应该分别指定年龄(age)和城市(city),而不能传入一个类似于 age>3 and city='江苏' 这样的条件字符串
还有,执行SQL语句时,应该尽量直接执行,而不是先组织、拼接一条SQL语句,
然后通过Exec来执行,这样也可能防注入失败。
有非法字符就禁止提交了,变成AND也无所谓。
and|exec|insert|select|delete|update|count| *|chr|mid|master|truncate|char|declare|