sql >> データベース >  >> RDS >> Sqlserver

SQLステートメントでパラメーターを使用することを常に好むのはなぜですか?

    パラメータを使用すると、SQLインジェクション攻撃を防ぐのに役立ちます データベースをデスクトッププログラムやWebサイトなどのプログラムインターフェイスと組み合わせて使用​​する場合。

    この例では、ユーザーはtxtSalaryでステートメントを作成することにより、データベースでSQLコードを直接実行できます。 。

    たとえば、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をラップすることをお勧めします s using ステートメント。



    1. ニージャーク待機統計:CXPACKET

    2. GETUTCDATE()は、同じステートメントで2回使用された場合、同じ値を返しますか?

    3. PostgreSQLの文の最後の2つの単語を一致させるにはどうすればよいですか?

    4. PostgreSQLデータベースのデプロイメントを自動化する方法