パラメータを使用するLike Operatorを使用したSQLクエリでのSQLインジェクションの回避
-
04-07-2019 - |
質問
前任者からいくつかのコードを引き継ぐと、Like演算子を使用するクエリが見つかりました:
選択*サプライヤーから WHERE Supplier_name like '%' + name +% ';
SQLインジェクションの問題を回避し、これをパラメーター化しようとしていますが、これがどのように達成されるかはよくわかりません。何か提案はありますか?
注、古典的なADO.NETのソリューションが必要です-このコードをLINQのようなものに切り替えるための準備は本当にありません。
解決
これを試してください:
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();
}
フレームワークは、クォートの問題を自動的に処理します。
他のヒント
クエリをパラメータ化するだけです:
SELECT * FROM suppliers WHERE supplier_name like '%' + @name + '%'
これで、「名前」を渡すことができます。変数を@nameパラメータに入力すると、クエリはインジェクション攻撃の危険なしに実行されます。 " '' OR true-"のようなものを渡しても引き続き正常に動作します。
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();
ショートアンサー:
1)name.Replace(&quot; '&quot ;,&quot;' '&quot;)....データベースに含まれる可能性のあるエスケープ文字を置き換えます(単一引用符が最も一般的です)
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を使用します
所属していません StackOverflow