我正在创建一个简单的Web服务来验证用户。
我在填充数据表(用于存储select语句的结果)时遇到问题,'dt.rows.count'(dt是数据表的名称)总是返回0,即使select语句没有返回任何内容。我已经尝试在填充之前清除数据表,并且在if条件之后,但是无效,我得到相同的结果。
非常感谢任何关于如何继续的建议。
[WebMethod]
public string Authen(string a, string b)
{
var con = new SqlConnection("Data Source=SERVER-SQL;Initial Catalog=DECA-DB;Persist Security Info=True;User ID=sa;Password=*****");
var sda = new SqlDataAdapter("SELECT * FROM Login_Matrix WHERE Username = ' " + a + " ' AND Password = ' " + b + " '", con);
var dt = new DataTable();
con.Open();
dt.Clear();
sda.Fill(dt);
con.Close();
int x = dt.Rows.Count;
//return (x);
if ( x >0)
{
dt.Clear();
return ("In");
}
else
{
dt.Clear();
return ("out");
}
}
}
答案 0 :(得分:2)
在单引号之前和之前添加空格会使您的查询搜索不必要的用户名和密码(例如“Steve”)并且它不返回任何记录
快速修复可能
var sda = new SqlDataAdapter(@"SELECT * FROM Login_Matrix
WHERE Username = '" + a + "'
AND Password = '" + b + "'", con);
但这非常危险 此代码容易受到Sql Injection attacks的攻击 你应该使用参数
var sda = new SqlDataAdapter(@"SELECT * FROM Login_Matrix
WHERE Username = @uname
AND Password = @pwd", con);
sda.SelectCommand.Parameters.Add("@uname", SqlDbType.NVarChar).Value = a;
sda.SelectCommand.Parameters.Add("@pwd", SqlDbType.NVarChar).Value = b;
关于安全性的另一方面,另一件需要考虑的事情是,在您的数据库中存储纯文本密码是一个非常大的安全风险。您应该搜索how to salt and store an hash of the password
此代码的其他部分需要改进。
因此,您可以将代码重写为:
string cmdText = @"IF EXISTS(SELECT 1 FROM Login_Matrix
WHERE Username = @uname AND Password = @pwd)
SELECT 1 ELSE SELECT 0";
using(SqlConnection con = new SqlConnection("....."))
using(SqlCommand cmd = new SqlCommand(cmdText, con))
{
con.Open();
int result = (int)cmd.ExecuteScalar();
return ( result == 1 ? "In" : "out");
}