我的计算机上有一个在SQL Server 2008中创建的数据库。它包含一个名为login的表,其中包含两列带有特定值的用户名和密码。
用Visual Studio 2008编写的This is my web service code。我需要检查我提供的用户名和密码是否正确,基本上我想通过Web服务对用户进行身份验证。
所以有人可以告诉我该怎么办呢?
答案 0 :(得分:3)
我建议您在处理SQL时使用parameters,以免受SQL注入攻击;特别是面向公众的网络服务。
从您的查询中可以看出,您将密码存储在plain text中。我再次强烈建议您加密并hash用户密码以提高安全性。
您可以通过将查询更改为COUNT(*)
并执行标量并确保计数大于等于1来完成您要查找的内容。像这样:
myCommand.CommandText = "select COUNT(*) from Login where Username = @Username AND Password = @HashedPassword";
int rowCount = (int)mycommand.ExecuteScalar();
return rowCount == 1 ? "success" : "bad username or password";
SqlDataReader
应从原始代码中删除。
修改强>: 那么这段代码在做什么呢?
我们稍微改变了SQL查询。我也修改了它以使用参数。那么这个查询所说的是获取具有此用户名的用户数量以及此密码为整数。
因此,如果一个用户拥有该用户名和密码,则会返回1
。如果没有人拥有该用户名和密码,则会返回0
。
ExecuteScalar
很有用;只是一个值。在我们的案例中这是事实;我们所期待的只是一个数字:用户数量。
所以当你把所有这些代码放在一起时;看起来应该是这样的:
try
{
using(SqlConnection myConnection = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=student;User ID=sa;Password=123"))
{
myConnection.Open();
using (SqlCommand myCommand = new SqlCommand())
{
myCommand.Connection = myConnection;
myCommand.CommandText = "SELECT COUNT(*) FROM Login WHERE UserName = @UserName AND Password = @Password";
myCommand.Parameters.Add("@UserName", SqlDbType.VarChar).Value = UserName;
myCommand.Parameters.Add("@Password", SqlDbType.VarChar).Value = Password;
return (int) myCommand.ExecuteScalar() == 1 ? "success" : "bad username or password";
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return "an error occurred.";
}