从我的前任那里接过一些代码,我发现了一个使用 Like 运算符的查询:
SELECT * FROM suppliers
WHERE supplier_name like '%'+name+%';
试图避免 SQL 注入问题并将其参数化,但我不太确定如何实现。有什么建议么 ?
请注意,我需要一个经典 ADO.NET 的解决方案——我真的没有资格将此代码切换到 LINQ 之类的东西。
从我的前任那里接过一些代码,我发现了一个使用 Like 运算符的查询:
SELECT * FROM suppliers
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 中,Native 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("'", "''").... 替换您的数据库可能具有的任何转义字符(单引号是最常见的)
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