Bagaimana cara membuka dua berbeda berdasarkan hak pengguna?

pemrograman


Saya mengembangkan aplikasi dengan database sql server. Saya memiliki tabel untuk login pengguna dengan admin dan pengguna normal. Masalahnya ketika saya login dengan pengguna normal, formulir untuk Admin dan pengguna normal juga terbuka. Singkatnya ini membuka dua formulir ketika saya login dengan pengguna normal. Tolong bantu.

Apa yang saya coba:

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();
                    
                }
            }

            
            }

        }
    }

Solusi 1

Anda mempunyai masalah terburuk yang harus ditangani terlebih dahulu, jadi saya akan menjelaskan apa yang terakhir kali Anda perhatikan.

1) Jangan pernah menggabungkan string untuk membuat perintah SQL. Ini membuat Anda terbuka lebar terhadap serangan SQL Injection yang tidak disengaja atau disengaja yang dapat menghancurkan seluruh database Anda. Selalu gunakan kueri berparameter sebagai gantinya.

Saat Anda menggabungkan string, Anda menimbulkan masalah karena SQL menerima perintah seperti:

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

Kutipan yang ditambahkan pengguna mengakhiri string sejauh menyangkut SQL dan Anda mendapatkan masalah. Tapi itu bisa lebih buruk. Jika saya datang dan mengetik ini: “x’;DROP TABLE MyTable;–” Kemudian SQL menerima perintah yang sangat berbeda:

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

SQL mana yang dilihat sebagai tiga perintah terpisah:

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

SELECT yang benar-benar valid

SQL
DROP TABLE MyTable;

Perintah “hapus tabel” yang valid

SQL
--'

Dan yang lainnya adalah komentar.
Begitu pula: memilih baris yang cocok, menghapus tabel dari DB, dan mengabaikan yang lainnya.

Jadi SELALU gunakan kueri berparameter! Atau bersiaplah untuk sering memulihkan DB Anda dari cadangan. Anda melakukan backup secara teratur, bukan?

Dan di LAYAR LOGIN? Itu benar-benar bunuh diri karena saya bahkan tidak perlu menjadi pengguna untuk menghancurkan DB Anda!

2) Jangan pernah menyimpan kata sandi dalam teks biasa – ini merupakan risiko keamanan yang besar. Ada beberapa informasi tentang cara melakukannya di sini: Penyimpanan Kata Sandi: Bagaimana melakukannya.[^]

Dan ingat: jika Anda memiliki pengguna di Uni Eropa maka GDPR akan berlaku dan itu berarti Anda harus menangani kata sandi sebagai data sensitif dan menyimpannya dengan cara yang aman dan terjamin. Teks bukan salah satu dari itu dan dendanya bisa …. um … luar biasa. Pada bulan Desember 2018, sebuah perusahaan Jerman menerima denda yang relatif rendah, yaitu €20.000 hanya karena hal tersebut.

3) Anda tidak memeriksa apakah DB mengembalikan baris apa pun: jika Anda salah mengetik, kesalahan “indeks di luar jangkauan” akan muncul dan aplikasi Anda akan mogok.

4) Anda hanya menutup koneksi untuk Admin. Daripada menutup koneksi secara manual, masukkan seluruh kode DB ke dalamnya using blok dan sistem akan secara otomatis membereskannya untuk Anda.

5) Masalah yang Anda perhatikan… Lihat kode Anda:

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

Jika kondisinya cocok maka akan menutup koneksi. Kemudian selalu mengeksekusi kode dalam tanda kurung kurawal meskipun kondisinya tidak cocok …

Solusi 2

Itu terlihat terlalu rumit bagi saya. Yang Anda perlukan hanyalah membaca baris yang cocok dengan nama pengguna dan kata sandi yang diberikan, dan mengembalikan tipe pengguna. Dengan informasi itu Anda kemudian dapat membuka formulir admin atau pengguna. Membuat dua adaptor data dan tabel data hanya untuk membaca satu baris agak membuang-buang sumber daya. Sesuatu seperti:

C#
string queryString = "select Type from loginTab where UserName='" + txtUsername.Text + "' and Password='" + txtPassword.Text  + "'";
string usertype = "None";
using (SqlConnection connection = new SqlConnection(
           connectionString))
{
    SqlCommand command = new SqlCommand(
        queryString, connection);
    connection.Open();
    using(SqlDataReader reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            usertype = reader[0]; // returned value
        }
    }
}
if (usertype == "Admin")
{
    Hide();
    Admin ad = new Admin();
    ad.Show();
}
else if(usertype == "User")
{
    Hide();
    User us = new User();
    us.Show();   
}
else
{
    // invalid type, or no matching record.
}

コメント

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