15

前任者からいくつかのコードを引き継いで、Like 演算子を使用するクエリを見つけました。

SELECT * FROM suppliers
WHERE supplier_name like '%'+name+%';

SQL インジェクションの問題を回避してこれをパラメータ化しようとしていますが、これがどのように達成されるかはよくわかりません。助言がありますか ?

注意してください、従来の ADO.NET のソリューションが必要です。このコードを LINQ のようなものに切り替えることはできません。

4

4 に答える 4

21

これを試して:

var query = "select * from foo where name like @searchterm";
using (var command = new SqlCommand(query, connection))
{
  command.Parameters.AddWithValue("@searchterm", String.Format("%{0}%", searchTerm));
  var result = command.ExecuteReader();
}

フレームワークは、引用の問題を自動的に処理します。

于 2008-10-23T03:52:17.773 に答える
8

クエリをパラメータ化するだけです。

SELECT * FROM suppliers WHERE supplier_name like '%' + @name + '%'

これで、"name" 変数を @name パラメーターに渡すことができ、クエリはインジェクション攻撃の危険なく実行されます。「'' OR true --」のようなものを渡しても、問題なく動作します。

于 2008-10-23T03:51:37.183 に答える
0

Entity Framework 6 では、ネイティブ SQL によって次のように実行できます。

List<Person> peopleList = contex.People.SqlQuery(
    @"SELECT * FROM [Person].[Person]
       WHERE [FirstName] LIKE N'%' + @p0 + '%' ", "ab").ToList();

または

List<Person> peopleList = contex.People.SqlQuery(
    @"SELECT * FROM [Person].[Person]
       WHERE [FirstName] LIKE N'%' + @name + '%' ",
    new SqlParameter("@name", "ab")).ToList();

また、LINQ to Entities を直接使用することもできます。

List<Person> peopleList1 = contex.People.Where(s => s.FirstName.Contains("ab")).ToList();
于 2017-11-16T16:40:25.850 に答える
-5

ショートアンサー:

1) name.Replace("'", "''").... データベースに含まれている可能性のあるエスケープ文字を置き換えます (一重引用符が最も一般的です)。

2) .net のような言語を使用している場合は、パラメーター化されたクエリを使用します。

sql="Insert into Employees (Firstname, Lastname, City, State, Zip, Phone, Email) Values ('" & frmFirstname.text & "', '" & frmLastName & "', '" & frmCity & "', '" & frmState & "', '" & frmZip & "', '" & frmPhone & "', '" & frmEmail & "')"

上記は以下に置き換えられます

Dim MySQL as string = "Insert into NewEmp (fname, LName, Address, City, State, Postalcode, Phone, Email) Values (@Firstname, @LastName, @Address, @City, @State, @Postalcode, @Phone, @Email)" 

With cmd.Parameters:
    .Add(New SQLParameter("@Firstname", frmFname.text))
    .Add(New SQLParameter("@LastName", frmLname.text))
    .Add(New SQLParameter("@Address", frmAddress.text))
    .Add(New SQLParameter("@City", frmCity.text))
    .Add(New SQLParameter("@state", frmState.text))
    .Add(New SQLParameter("@Postalcode", frmPostalCode.Text))
    .Add(New SQLParameter("@Phone", frmPhone.text))
    .Add(New SQLParameter("@email", frmemail.text))
end with

3) ユーザー ストアド プロシージャ

4) .net を使用している場合は、Linq to SQL を使用します。

于 2008-10-23T03:52:03.017 に答える