首页 新闻 搜索 专区 学院

关于sql注入问题

1
悬赏园豆:100 [已解决问题] 解决于 2012-03-24 21:36
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("_""[_]");
        }

 

对于查询操作用参数化快,还是用拼字符串快?
【秦时明月】的主页 【秦时明月】 | 小虾三级 | 园豆:851
提问于:2012-02-22 10:00
< >
分享
最佳答案
0

你的做法可以防注入,在问题补充中替换了多个字符,目前看是安全的,也不会造成执行错误,但是并不能保证以后不会出问题

另外从效率上来讲,在程序中多次字符串替换对效率会有一点点的影响,主要的影响还是在数据库端,参数化的语句效率会高一些

所以,综合来说,还是用参数化比较好,同时带来一个好处就是程序的易读性。这里只是一个参数,如果有很多参数,有各种类型的参数,拼字符串的形式处理起来会很头疼

收获园豆:11
丁学 | 专家六级 |园豆:18530 | 2012-02-22 11:26
其他回答(11)
0
string sql="select * from [User] where [UserName]=@name";

需要用参数化的SQL。

dudu | 园豆:37173 (高人七级) | 2012-02-22 10:45
0
string sql="select * from [User] where [UserName]='"+name.Replace("'","''")+"'";
这样就不怕注入了
如梭 | 园豆:210 (菜鸟二级) | 2012-02-22 10:54
0

可以防止sql注入,不过建议使用参数化的sql

收获园豆:11
LCM | 园豆:6876 (大侠五级) | 2012-02-22 10:57

用参数化比拼字符串快。字符串的处理其实很耗性能的。

支持(0) 反对(0) LCM | 园豆:6876 (大侠五级) | 2012-02-22 11:03
0

用你上面的方法可以防止sql注入了,建议再过滤掉 update  跟 delete 两个关键字,不过最好使用参数形式,这样更简洁更安全

收获园豆:12
artwl | 园豆:16536 (专家六级) | 2012-02-22 11:01
0

参数化和字符串拼接的速度是没有明显区别的,内部实现的问题。

收获园豆:11
az235 | 园豆:8283 (大侠五级) | 2012-02-22 12:45
0

强烈建议使用参数化

收获园豆:11
陈齐 | 园豆:311 (菜鸟二级) | 2012-02-22 14:34
0

注入就注入呗,什么项目,很重要吗。我们的项目,黑客都懒得黑。

收获园豆:11
$飘渺$ | 园豆:221 (菜鸟二级) | 2012-02-23 15:17
0

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("&", "&amp;");         str = str.Replace("<", "&lt;");         str = str.Replace(">", "&gt");         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();     }

wvsy | 园豆:297 (菜鸟二级) | 2012-02-25 10:52
0

记得以前可以使用编码的方式绕过系统对单引号的过滤。楼主不妨查查看相关资料,

防SQL注入用参数化是比较合理的解决方案

收获园豆:11
Hunt | 园豆:21 (初学一级) | 2012-02-25 12:54

帮我找找.找到了分全给兄弟.麻烦您了:)

支持(0) 反对(0) 【秦时明月】 | 园豆:851 (小虾三级) | 2012-03-01 08:44
0

用存储过程好点

收获园豆:11
zemin1 | 园豆:180 (初学一级) | 2012-02-25 17:11
0

可以用存储过程 、也可以用微软给我做的强类型的DataSet也可以用微软给我们做的Linq To SQL
这些微软都做了安全的技术
只要你会用

收获园豆:11
唯吴独尊 | 园豆:707 (小虾三级) | 2012-02-25 18:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册