如何根据用户权限打开两个不同的?


我用sql server 数据库开发了一个应用程序。 我有用于使用管理员和普通用户登录的用户表。 当我使用普通用户登录时出现问题,它会打开管理员和普通用户的表单。 简而言之,当我以普通用户登录时,它会打开两个表单。 请协助。

我尝试过的:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace Stokvel_Management_System
{
    public partial class Login : Form
    {
        public Login()
        {
            InitializeComponent();
        }
        public string constring = "Data Source=LAPTOP-TINYIKOB\\SQLEXPRESS;Initial Catalog=Stokvel;Integrated Security=True";
                         
        private void BtnLogin_Click(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection(constring);
            con.Open();
            
            SqlDataAdapter da = new SqlDataAdapter("select count(*) from loginTab where UserName='" + txtUsername.Text + "' and Password='" + txtPassword.Text + "'and Type='" + UsercomboBox.Text + "'", con);
            DataTable dt = new DataTable();
            da.Fill(dt);
            if (dt.Rows[0][0].ToString() == "1")
            {
                SqlDataAdapter da1 = new SqlDataAdapter("select Type from loginTab where UserName='" + txtUsername.Text + "' and Password='" + txtPassword.Text  + "'", con);
                DataTable dt1 = new DataTable();
                da1.Fill(dt1);
                if (dt1.Rows[0][0].ToString() == "Admin")
                    con.Close();
                {
                    Hide();
                    Admin ad = new Admin();
                    ad.Show();
                }
                if(dt1.Rows[0][0].ToString()=="User")
                {
                    Hide();
                    User us = new User();
                    us.Show();
                    
                }
            }

            
            }

        }
    }

解决方案1

你首先要处理最糟糕的问题,所以我将解释你最后注意到的问题。

1) 切勿连接字符串来构建 SQL 命令。 它使您很容易受到意外或故意的 SQL 注入攻击,从而破坏您的整个数据库。 始终使用参数化查询。

连接字符串时,会导致问题,因为 SQL 接收如下命令:

SQL
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'

就 SQL 而言,用户添加的引号终止了字符串,并且您会遇到问题。 但情况可能会更糟。 如果我输入以下内容: “x’;DROP TABLE MyTable;–” 那么 SQL 会收到一个非常不同的命令:

SQL
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'

其中 SQL 将其视为三个单独的命令:

SQL
SELECT * FROM MyTable WHERE StreetAddress = 'x';

完全有效的 SELECT

SQL
DROP TABLE MyTable;

完全有效的“删除表”命令

SQL
--'

其他一切都是评论。
它确实如此:选择任何匹配的行,从数据库中删除该表,并忽略其他任何内容。

所以总是使用参数化查询! 或者准备经常从备份恢复数据库。 您确实定期进行备份,不是吗?

在登录屏幕上? 这绝对是自杀行为,因为我什至不需要成为用户就可以破坏你的数据库!

2) 切勿以明文形式存储密码 – 这是一个重大的安全风险。 这里有一些关于如何执行此操作的信息: 密码存储:如何操作。[^]

请记住:如果您有任何欧盟用户,则适用 GDPR,这意味着您需要将密码作为敏感数据处理并以安全可靠的方式存储它们。 文本既不是这些,罚款也可能……嗯……悬而未决。 2018 年 12 月,一家德国公司因此收到相对较低的 20,000 欧元罚款。

3)您不检查数据库是否返回任何行:如果您输入错误,它将抛出“索引超出范围”错误,并且您的应用程序将崩溃。

4) 您仅关闭管理员的连接。 而不是手动关闭连接,将整个数据库代码包含在 using 块,系统会自动为您整理。

5)你注意到的问题……看看你的代码:

if (dt1.Rows[0][0].ToString() == "Admin")
    con.Close();
{
    Hide();
    Admin ad = new Admin();
    ad.Show();
}

如果条件匹配,它将关闭连接。然后,即使条件不匹配,它也始终执行大括号中的代码…

コメント

タイトルとURLをコピーしました