【问题标题】:Database returning username check as incorrect数据库返回用户名检查不正确
【发布时间】:2014-02-13 16:23:40
【问题描述】:

每当我用正确的数据检查我的数据库时,数据库将它作为错误的用户名返回,我不确定是我的代码还是我的数据库,她就是代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Configuration;
public partial class Login : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void Button_Login_Click(object sender, EventArgs e)
    {
        SqlConnection conn = new SqlConnection("Data Source=TOSHIBA0007\\TESTSERVER;Initial Catalog=users;Integrated Security=True");
            conn.Open();
            string checkuser = "select count(*) from userdatabase where Username=' " + Username.Text + " ' ";
            SqlCommand UserComm = new SqlCommand(checkuser, conn);
            int temp = Convert.ToInt32(UserComm.ExecuteScalar().ToString().Replace(" ", ""));
            conn.Close();
            if (temp == 1)
            {
                conn.Open();
                string checkPasswordQuery = "select Password from userdatabase where Username=' "+Username.Text+" ' ";
                SqlCommand passCom = new SqlCommand(checkPasswordQuery, conn);
                string password = passCom.ExecuteScalar().ToString().Replace(" ", "");
                if(password == Password.Text)
                {
                    Session["New"] = Username.Text;
                    Response.Write("Password Accepted");
                }
                else
                {
                    Response.Write("Password Incorrect");
                }        
            }
            else
            {
                Response.Write("Username is Incorrect");
            }
    }
}

任何和所有的帮助都将不胜感激,因为我不知道为什么这不起作用。

【问题讨论】:

  • 这里需要注意两点:1) 您的代码对 SQL 注入攻击完全开放,请改用参数化查询。 2)您以纯文本形式存储密码。 切勿以纯文本形式存储密码。 收到密码后立即对密码进行哈希处理并存储哈希值。检查密码时,对其进行哈希处理并比较哈希值。
  • 如果我改变它产生的 temp 值并出错,实际上这可能是问题
  • 好的大卫,我把它搞定了,我只是开始它的本地化,所以它现在不是很多问题,但谢谢你的建议
  • 正如大卫所说,这里需要解决许多安全问题。除此之外,您还要在检查密码之前添加空格,这很可能会导致密码永远不会匹配。
  • @user3306240:好吧,将安全问题分为两个不同的类别。 SQL注入漏洞确实是你自己的问题,你可以及时解决。但密码存储是另一回事。一旦您从实际用户那里接受密码,不正确地处理这些密码就是严重不负责任的行为。 SQL 注入会使您的系统受到攻击,但不正确的密码处理会使您的用户 受到攻击。首先考虑用户。

标签: c# .net database sql-server-2012 visual-studio-2013


【解决方案1】:

问题:您在查询中的用户名前后留出了空格。

1.替换这个:

string checkuser = "select count(*) from userdatabase where Username=' " + Username.Text + " ' ";

有了这个:

 string checkuser = "select count(*) from userdatabase where Username='" + Username.Text + "'";

2.替换这个:

string checkPasswordQuery = "select Password from userdatabase where Username=' "+Username.Text+" ' ";

有了这个:

string checkPasswordQuery = "select Password from userdatabase where Username='"+Username.Text+"'";

建议:1您的查询对sql injection attacks 开放,所以我建议您使用parameterised queries 来避免它们。

建议2:您不需要对用户名和密码进行多次比较。 您可以编写如下单个查询来查找有效用户:

select count(*) from userdatabase where Username=@username and Password=@password;

解决方案:Parameterised Queries 与单个查询一起使用

protected void Button_Login_Click(object sender, EventArgs e)
{
        SqlConnection conn = new SqlConnection("Data Source=TOSHIBA0007\\TESTSERVER;Initial Catalog=users;Integrated Security=True");
        conn.Open();
        string checkuser = "select count(*) from userdatabase where Username=@username and Password=@password";
        SqlCommand UserComm = new SqlCommand(checkuser, conn);
        UserComm.Parameters.AddWithValue("@username",Username.Text);
        UserComm.Parameters.AddWithValue("@password",Password.Text);
        int temp = Convert.ToInt32(UserComm.ExecuteScalar());
        conn.Close();
        if (temp == 1)
        {
           Session["New"] = Username.Text;
           Response.Write("User Is Valid!");
        }
        else
        {
           Response.Write("Invalid User Credentials!");
        }   
}

建议 3:您不应该将密码作为纯文本存储在数据库中,请注意这一点。有关如何以安全方式存储密码的更多信息,请参阅 this link

【讨论】:

  • 而且你永远不应该让用户知道是用户名还是密码不正确。对用户的响应应该始终是“无效”或“有效”登录...否则用户可以使用系统找出系统中存在哪些用户名...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 2019-11-22
相关资源
最近更新 更多