Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 困惑于如何检查用户是否存在_C#_Asp.net_Sql - Fatal编程技术网

C# 困惑于如何检查用户是否存在

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

我有一个名为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 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);