我有一个asp.net应用程序。其中我有这样的代码:
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注入攻击时,攻击失败。但是如果我用这个来改变片段:
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注入攻击的最佳方法是什么?
发布于 2013-09-03 16:11:26
始终使用命令参数来避免sql注入。Sql注入由命令参数自动处理。如果使用命令参数,则不需要担心sql注入。
当您不使用命令参数时,参数的值只是插入到sql查询中,而不处理sql注入。但是,当您使用命令参数时,ADO.Net会为您处理sql注入。
发布于 2013-09-03 16:14:23
防止SQL注入的最佳方法是使用参数化查询。
当将值连接到字符串中时,您可以使它成为安全的,但您必须做到完全正确,而且不同数据库品牌的确切方法也不同。
对于Server,您可以通过加倍字符串中的任何撇号来编码字符串值。这样,数据库将正确地解释任何撇号,因此不可能使用撇号来打破字符串:
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
https://stackoverflow.com/questions/18596803
复制相似问题