3

最初に、似ているトピックをいくつか見つけましたが、すべての質問に完全に答えているわけではありません。

次のようなコードを使用する場合の最初の質問:

MySqlCommand cmd = new MySqlCommand("SELECT `productnummer`, `NAAM`, `TYPE` `OMSCHRIJVING`, `Product-ID`, `Barcode` FROM `orders`.`producten` where (`productnummer` like(@variable) or `naam` like @variable or `type` like @variable or `omschrijving` like @variable or `product-id` like @variable or `barcode` like @variable) "and `uit assortiment` = 0");
cmd.Parameters.Add(new MySqlParameter("@variable", '%' + textBox1.Text + '%'));

% which を使用して sql 変数を定義できる場合、パラメーターを安全に使用するにはどうすればよいでしょうか (私が知る限り、SQL 構文です)。これは、ユーザーが % または * または何かを自分で入力すると、それが機能するという意味ではありませんか?

私の2番目の質問:

MySqlCommand cmd = new MySqlCommand("SELECT `user-id` FROM `orders`.`werknemers` WHERE username = @username and `password` = @password");
            cmd.Parameters.Add(new MySqlParameter("@username", username));
            cmd.Parameters.Add(new MySqlParameter("@password", password));

ユーザー名とパスワードを含むテーブルを持つデータベースがある場合(明らかにパスワードのハッシュ)。私のアプリケーションには、ユーザーがユーザー名とパスワードを入力するテキストボックスがあります。パスワードはハッシュされ、このデータは上記のようにデータベースに送信されます。データベースがユーザーIDを返す場合、私はこのユーザーが存在することを知っており、ユーザーIDを使用してさらに通信できます。明らかに何かが間違って入力されていない場合

これはこれを行う安全な方法ですか?またはより良い方法はありますか?

C# でデータベースと通信するための最も安全な方法は何ですか?

4

1 に答える 1

1

クエリの安全性における根本的な問題を調べる必要があります。パラメーター化されていないクエリは、エンドユーザーが文字列としてプラグインしたデータがプログラミング言語のコード (つまり、SQL のコード) として再解釈されるため、脅威をもたらします。パラメーター化されたクエリはそれを防ぎます。解釈はクエリパラメーターの宣言で終わります。値としてそのパラメーターにプラグインされるものはすべて、通常の文字シーケンスとして解釈されます。SQL インタープリターにはなりません (SQL の機能を使用するという重大な間違いを犯した場合を除きますexec。これは、エンドユーザーが入力したものに近いデータに対して行うべきではありません)。

パスワードのハッシュに関する限り、いいえ、コードが行うことは安全ではありません。ハッシュがソルト化されていないため、オフライン攻撃に対して無防備です。しかし、これは別の回答の主題です

于 2013-10-11T13:14:09.140 に答える