首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免Sql注入攻击

避免Sql注入攻击
EN

Stack Overflow用户
提问于 2013-09-03 16:05:57
回答 2查看 1.3K关注 0票数 1

我有一个asp.net应用程序。其中我有这样的代码:

代码语言:javascript
复制
 using (Data.connexion)
    {
        string queryString = @"select id_user , nom, prenom, mail, login, mdp, last_visite, id_group, id_user_status from USERS where login =@login and mdp=@mdp";
        SqlCommand command = new SqlCommand(queryString, Data.connexion);
        command.Parameters.AddWithValue("@login", _login);
        command.Parameters.AddWithValue("@mdp", _password.GetHashCode().ToString());
        try
        {
            SqlDataReader reader = command.ExecuteReader();
            do
            {
                while (reader.Read())
                {
                    return View("Success");
                }
            } while (reader.NextResult());

        }
        catch {  }
    }

当我尝试使用这个登录'' or 1=1 --的Sql注入攻击时,攻击失败。但是如果我用这个来改变片段:

代码语言:javascript
复制
 using (Data.connexion)
            {
                string queryString = @"select id_user , nom, prenom, mail, login, mdp, last_visite, id_group, id_user_status from USERS where login =" + _login + " and mdp=" + _password.GetHashCode().ToString();
                SqlCommand command = new SqlCommand(queryString, Data.connexion);
              //  command.Parameters.AddWithValue("@login", _login);
               // command.Parameters.AddWithValue("@mdp", _password.GetHashCode().ToString());
                try
                {
                    SqlDataReader reader = command.ExecuteReader();
                    do
                    {
                        while (reader.Read())
                        {
                            return View("Success");
                        }
                    } while (reader.NextResult());

                }
                catch {  }
            }

我被重定向到视图success,所以攻击是成功的。

这两种编码方式有什么区别?防止和避免Sql注入攻击的最佳方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-03 16:11:26

始终使用命令参数来避免sql注入。Sql注入由命令参数自动处理。如果使用命令参数,则不需要担心sql注入。

当您不使用命令参数时,参数的值只是插入到sql查询中,而不处理sql注入。但是,当您使用命令参数时,ADO.Net会为您处理sql注入。

票数 2
EN

Stack Overflow用户

发布于 2013-09-03 16:14:23

防止SQL注入的最佳方法是使用参数化查询。

当将值连接到字符串中时,您可以使它成为安全的,但您必须做到完全正确,而且不同数据库品牌的确切方法也不同。

对于Server,您可以通过加倍字符串中的任何撇号来编码字符串值。这样,数据库将正确地解释任何撇号,因此不可能使用撇号来打破字符串:

代码语言:javascript
复制
string queryString = "select id_user, nom, prenom, mail, login, mdp, last_visite, id_group, id_user_status from USERS where login = '" + _login.Replace("'","''") + "' and mdp = '" + _password.GetHashCode().ToString().Replace("'","''") + "'";

但是,使用参数化查询仍然更容易,然后数据库驱动程序会为您执行此操作。如果您试图自己处理编码,但没有正确处理,那么您将陷入更糟糕的境地,因为您认为问题已经得到解决,但它可能会受到SQL注入攻击的广泛影响。

附带注意:String.GetHashCode方法不适合哈希密码之类的东西。该方法的实现在将来可能会改变(就像过去一样),这将使数据库中的所有散列密码毫无用处。

“不要序列化哈希代码值或将它们存储在数据库中。”-- http://msdn.microsoft.com/en-us/library/system.string.gethashcode.aspx

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18596803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档