string sql="select * from [User] where [UserName]='"+name+"'";
//对name进行转义
public static string ToSafeString(string str)
{
return str.Replace("'","''");
}
sql注入可以做到吗?
public static string ToSafeString(string str)
{
return str.Replace("'", "''").Replace("[", "[[]").Replace("%", "[%]").Replace("_", "[_]");
}
你的做法可以防注入,在问题补充中替换了多个字符,目前看是安全的,也不会造成执行错误,但是并不能保证以后不会出问题
另外从效率上来讲,在程序中多次字符串替换对效率会有一点点的影响,主要的影响还是在数据库端,参数化的语句效率会高一些
所以,综合来说,还是用参数化比较好,同时带来一个好处就是程序的易读性。这里只是一个参数,如果有很多参数,有各种类型的参数,拼字符串的形式处理起来会很头疼
string sql="select * from [User] where [UserName]=@name";
需要用参数化的SQL。
string sql="select * from [User] where [UserName]='"+name.Replace("'","''")+"'";
这样就不怕注入了
可以防止sql注入,不过建议使用参数化的sql
用参数化比拼字符串快。字符串的处理其实很耗性能的。
用你上面的方法可以防止sql注入了,建议再过滤掉 update 跟 delete 两个关键字,不过最好使用参数形式,这样更简洁更安全
参数化和字符串拼接的速度是没有明显区别的,内部实现的问题。
强烈建议使用参数化
注入就注入呗,什么项目,很重要吗。我们的项目,黑客都懒得黑。
public static string HtmlEncode(string str) { str = str.ToLower(); string s = "dbcc|alter|drop|* |and|exec|or|insert|select|delete|update|count|master|truncate|declare|char|mid(|chr|set |where|xp_cmdshell|tab"; string[] ss = s.Split('|'); for (int i = 0; i < ss.Length; i++) { str = str.Replace(ss[i], ""); } str = str.Replace("&", "&"); str = str.Replace("<", "<"); str = str.Replace(">", ">"); str = str.Replace("'", "''"); str = str.Replace("*", ""); str = str.Replace("\n", "<br/>"); str = str.Replace("\r\n", "<br/>");
str = str.Replace("--", ""); str = str.Replace("/*", ""); str = str.Replace("*/", ""); //str = str.Replace("?",""); if (str.Trim().ToString() == "") { str = "###"; } return str.Trim(); }
记得以前可以使用编码的方式绕过系统对单引号的过滤。楼主不妨查查看相关资料,
防SQL注入用参数化是比较合理的解决方案
帮我找找.找到了分全给兄弟.麻烦您了:)
用存储过程好点
可以用存储过程 、也可以用微软给我做的强类型的DataSet也可以用微软给我们做的Linq To SQL
这些微软都做了安全的技术
只要你会用