C# 困惑于如何检查用户是否存在
我有一个名为ID、name、username、pass的4列表。我试图做的是在用户输入用户名和密码后。XmlhttpRequest对象返回一条类似于user exist或not的消息。但我在这一行得到了这个异常C# 困惑于如何检查用户是否存在,c#,asp.net,sql,C#,Asp.net,Sql,我有一个名为ID、name、username、pass的4列表。我试图做的是在用户输入用户名和密码后。XmlhttpRequest对象返回一条类似于user exist或not的消息。但我在这一行得到了这个异常 SqlDataReader dr = cmd.ExecuteReader(); 例外消息说 Incorrect syntax near 'hatca'.(thats the username) Unclosed quotation mark after the character s
SqlDataReader dr = cmd.ExecuteReader();
例外消息说
Incorrect syntax near 'hatca'.(thats the username)
Unclosed quotation mark after the character string ''.
这条线有问题吗
SqlCommand cmd = new SqlCommand("select * from userstable where username='" + username + "'AND pass='" + pass + "'",con);
我觉得一切都很好,我做错什么了
这是全部代码
aspx.cs
和html页面
<script src="Scripts/jquery-2.1.1.js"></script>
<script type="text/javascript">
function createXHR() {
var xhr;
try {
xhr = new XMLHttpRequest();
} catch (e) {
}
return xhr;
}
function signIn() {
var xhr = createXHR();
var username=$('#txtusername').val();
var pass=$('#txtpass').val()
xhr.onreadystatechange=function(){
if(xhr!=null){
if(xhr.readyState==4){
if(xhr.status>=200 && xhr.status<300){
var v = $('#result').html(xhr.responseText);
if (v == "exist") {
$('#result').html("Done");
}
else if (v == "Doesntexist") {
$('#result').html("Error");
}
else{
$('#result').html(v);
}
}
}
}
else{
$('#result').html("Error");
}
}
xhr.open("GET", "Default.aspx?ka='" + username + "&pass=" + pass, true);
xhr.send(null);
}
</script>
除了您容易受到SQL注入攻击这一事实之外,单引号的这一行最有可能是错误的根源
username='" + username + "'AND
如果:
username='" + username + "' AND
一定要仔细研究,如何避免它 我猜用户名中有一个“a”,因为这是您收到此类消息的唯一原因
为了避免这种情况,以及出于许多其他原因,您应该使用参数:
SqlCommand cmd = new SqlCommand("select * from userstable where username=@username AND pass=@pass",con);
cmd.Parameters.AddWithValue("@username", username);
cmd.Parameters.AddWithValue("@pass", pass);
您的完整查询输出是select*from userstable,其中username='hatca'和pass='pass'注意,'和没有空间?它们应该按空格分隔,以便SQL解析器知道您正在执行的命令
另外,当涉及到查询和身份验证时,您所做的也是一种糟糕的做法。搜索有关SQL参数化查询的更多信息,或者如果您使用的是asp.net MVC,请尝试查找EFEntity Framework,以便与数据库通信
您现在所做的是不安全的这行有问题是的,您的sql很容易受到sql注入攻击。使用sql参数。这也将解决此问题。问题,您是否将密码以纯文本形式存储在数据库中?我也注意到了“和”,但在SSMS中尝试时,我无法再现错误。我不确定SSMS的具体情况,但像它这样的工具,例如Oracle的SQL Developer有时会预处理查询,这意味着您使用它得到的结果可能与ADO.NET略有不同。
SqlCommand cmd = new SqlCommand("select * from userstable where username=@username AND pass=@pass",con);
cmd.Parameters.AddWithValue("@username", username);
cmd.Parameters.AddWithValue("@pass", pass);