0

我在 c# 中有我的 windows 应用程序的登录页面。即使我以大写形式输入用户名和密码,即打开大写字母,登录仍然成功。

这不应该是这种情况,因为数据库中的条目是小写的。

public partial class frmlogin : Form
{
    SqlConnection con = new SqlConnection("Data Source=TH07L019;Initial Catalog=procurement;Integrated Security=True");
    DataTable dt = new DataTable();
    SqlCommand cmd = new SqlCommand();
    SqlDataAdapter adp = new SqlDataAdapter();


    public frmlogin()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        cmd.Connection = con;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        con.Open();
        cmd.CommandText = "select * from login where username='" + txtusername.Text + "' and password='" + txtpassword.Text + "'";
        adp.SelectCommand = cmd;
        adp.Fill(dt);
        if (dt.Rows.Count > 0)
        {
            frmmain main = new frmmain();
            main.Show();
        }
        else
        {
            MessageBox.Show("Please enter correct name and passowrd", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            txtusername.Clear();
            txtpassword.Clear();
        }
        con.Close();
    }
}

如何解决这个问题呢

4

3 回答 3

2

这很可能是数据库问题 - 默认排序规则可能不区分大小写,这意味着数据库中的任何字符串比较都将不区分大小写。

您需要将这些字段的排序规则更改为区分大小写,或在用户名/密码检查查询中添加提示以使用此类排序规则。

笔记:

你的代码和实现有几个问题——一个是它对SQL 注入开放——你不应该像那样将字符串连接到 SQL 中,而是使用参数化查询

此外,以纯文本形式存储密码是非常不安全的——如果您的数据库落入恶意之手,他们将拥有所有密码。你应该使用哈希。我建议阅读Troy Hunt关于构建安全密码重置功能的所有你想知道的内容。

于 2013-04-05T09:10:34.497 回答
2

撇开以纯文本形式存储密码从安全角度来看是最糟糕的想法,以及用户可以通过输入“特殊”密码+对您的数据库执行 SQL 注入攻击这一事实,您的代码忽略大写字母的原因是您的 RDBMS 具有不区分大小写的字符串比较。


+ 想象一下(不要尝试)一个如下所示的密码字符串:

';drop table login--

你知道会发生什么吗?此外,

';select 1;--

将成为您的“主密码”,让任何人都可以像其他人一样登录。

于 2013-04-05T09:11:08.553 回答
0

您应该在数据库中将默认排序规则更改为区分大小写,或者您可以在查询本身中更改排序规则。喜欢:

select * from login where username = 'someusername' COLLATE SQL_Latin1_General_CP1_CS_AS 
and password = 'somepassword' COLLATE SQL_Latin1_General_CP1_CS_AS
于 2013-04-05T09:17:28.427 回答