Można jakimś wyrażeniem regularnym zabezpieczyć pole textBox z imieniem czy nazwiskiem aby było odporne na atak SQL Injection w aplikacji okienkowej w c#?
Przed SQL Injection nie zabezpiecza się na poziomie wpisywania do textboxa, tylko na poziomie budowania zapytania SQL przed wykonaniem go.
Jeśli używasz ORMa albo budujesz SqlCommand zgodnie z wytycznymi, to na taki atak nie ma szans.
string szukaj_klienta_id = "select CONCAT_WS(' ',
nazwisko_nazwa
,imie
,ulica
,nr
) fromklienci
where id_klienta='"** + txtIdSzukaj.Text + **"' ";
MySqlCommand cmd = new MySqlCommand(szukaj_klienta_id, conn);
MySqlDataReader reader = cmd.ExecuteReader();
Jak takie zapytanie mogę w najprostszy sposób zabezpieczyć? Prosił bym o przykład na jego podstawie jak ma wyglądać jego modyfikacja.
Próbowałem ogarniać linqu ale w połączeniu z mysql ciężko mi to szło.
Mniej więcej tak:
string szukaj_klienta_id = "select CONCAT_WS(' ',nazwisko_nazwa,imie, ulica,nr) from klienci where id_klienta=@id'";
MySqlCommand cmd = new MySqlCommand(szukaj_klienta_id, conn);
cmd.Parameters.Add("@id", MySqlDbType.VarChar, 50).Value = txtIdSzukaj.Text;
MySqlDataReader reader = cmd.ExecuteReader();
Dłuższe zapytania buduje się w ten sposób jak zamieściłem poniżej czy można jakoś w skróconej formie dodać więcej parametrów.
Na chwile obecną do testów wszędzie zamieściłem sobie typ VarChar zamiast Int32 w typach liczbowych, czy jeśli by tak zostało to duży błąd? Jaki będzie jego skutek?
string zapytanie = "INSERT INTO `klienci` (imie, nazwisko_nazwa, ulica, nr, miasto, kod, NIP, nr_tel, mail) VALUES (@imie,@nazwisko,@ulica,@nr,@miasto,@kod,@NIP,@nr_tel,@mail)";
MySqlCommand cmd = new MySqlCommand(zapytanie, mysql.conn);
cmd.Parameters.Add("@imie", MySqlDbType.VarChar, 25).Value = textBox_imie_rejestracja.Text;
cmd.Parameters.Add("@nazwisko", MySqlDbType.VarChar, 25).Value = textBox2.Text;
cmd.Parameters.Add("@ulica", MySqlDbType.VarChar, 25).Value = textBox3.Text;
cmd.Parameters.Add("@nr", MySqlDbType.VarChar, 25).Value = textBox4.Text;
cmd.Parameters.Add("@miasto", MySqlDbType.VarChar, 25).Value = textBox5.Text;
cmd.Parameters.Add("@kod", MySqlDbType.VarChar, 25).Value = maskedTextBox1.Text;
cmd.Parameters.Add("@NIP", MySqlDbType.VarChar, 25).Value = textBox7.Text;
cmd.Parameters.Add("@nr_tel", MySqlDbType.VarChar, 25).Value = textBox8.Text;
cmd.Parameters.Add("@mail", MySqlDbType.VarChar, 25).Value = textBox9.Text;
cmd.ExecuteNonQuery();
można krócej:
cmd.Parameters.Add("@imie", textBox_imie_rejestracja.Text);