1. ホーム
  2. sql

[解決済み] なぜSQL文では常にパラメータを使用するのが好ましいのか?

2022-08-29 23:43:09

疑問点

私はデータベースを扱うのにとても慣れていません。今私は書くことができます SELECT , UPDATE , DELETE そして INSERT コマンドを使用します。しかし、私は、私たちが書くことを好む多くのフォーラムを見たことがあります。

SELECT empSalary from employee where salary = @salary

...の代わりに

SELECT empSalary from employee where salary = txtSalary.Text

なぜいつもパラメータを使うのがいいのか、そしてどのように使えばいいのか。

最初の方法の使い方とメリットを知りたかったからです。SQLインジェクションという言葉も聞いたことがありますが、完全に理解しているわけではありません。SQLインジェクションが私の質問と関係があるのかどうかもわかりません。

どのように解決するのですか?

パラメータを使用することで SQLインジェクション攻撃 を防ぐことができます。

この例では、ユーザーがデータベース上で直接 SQL コードを実行することができます。 txtSalary .

例えば、次のように書くとします。 0 OR 1=1 と書いた場合、実行されるSQLは次のようになります。

 SELECT empSalary from employee where salary = 0 or 1=1

これにより、すべてのempSalariesが返されることになります。

さらに、ユーザはあなたのデータベースに対して、削除を含む、より悪いコマンドを実行することができます。 0; Drop Table employee :

SELECT empSalary from employee where salary = 0; Drop Table employee

テーブル employee は削除されるでしょう。


あなたの場合、.NETを使用しているようですね。パラメータを使用するのは、次のように簡単です。

string sql = "SELECT empSalary from employee where salary = @salary";

using (SqlConnection connection = new SqlConnection(/* connection info */))
using (SqlCommand command = new SqlCommand(sql, connection))
{
    var salaryParam = new SqlParameter("salary", SqlDbType.Money);
    salaryParam.Value = txtMoney.Text;

    command.Parameters.Add(salaryParam);
    var results = command.ExecuteReader();
}

Dim sql As String = "SELECT empSalary from employee where salary = @salary"
Using connection As New SqlConnection("connectionString")
    Using command As New SqlCommand(sql, connection)
        Dim salaryParam = New SqlParameter("salary", SqlDbType.Money)
        salaryParam.Value = txtMoney.Text

        command.Parameters.Add(salaryParam)

        Dim results = command.ExecuteReader()
    End Using
End Using

2016-4-25を編集します。

George Stockerさんのコメント通り、サンプルコードで AddWithValue . また、一般的には IDisposable の中に using ステートメントを使用します。