使用Like运算符在使用Like运算符的SQL查询中避免SQL注入?
-
04-07-2019 - |
题
接管我前任的一些代码,我找到了一个使用Like运算符的查询:
SELECT * FROM供应商 供应商名称如'%'+名称+%';
尝试避免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参数,查询将在没有任何注入攻击危险的情况下执行。即使你传递的内容如“''或者是真的 - ”它仍然可以正常工作。
在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();
Short Anwser:
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