PHP:使用LIKE选择器时防止SQL注入
我有一个PHP脚本,它使用mysqli使用一个非常简单的搜索语句。声明如下:PHP:使用LIKE选择器时防止SQL注入,php,mysql,sql,mysqli,Php,Mysql,Sql,Mysqli,我有一个PHP脚本,它使用mysqli使用一个非常简单的搜索语句。声明如下: SELECT * FROM JobTracker WHERE JobName LIKE'%$jobName%' 现在我想阻止SQL注入,但我无法理解语法 我尝试过像“%”这样的和像“%”这样的和类似“%”+?+“%” 但都不管用。此SQL语句阻止注入的正确语法是什么 $jobName = real_escape_string($jobName); $stmt = mysqli->prepare("SELECT
SELECT * FROM JobTracker WHERE JobName LIKE'%$jobName%'
现在我想阻止SQL注入,但我无法理解语法
我尝试过像“%”这样的和像“%”这样的代码>和类似“%”+?+“%”代码>
但都不管用。此SQL语句阻止注入的正确语法是什么
$jobName = real_escape_string($jobName);
$stmt = mysqli->prepare("SELECT * FROM JobTracker WHERE JobName LIKE '%?%'");
$stmt->bind_param("s", $jobName);
$stmt->execute();
PDO语句对于防止SQL注入非常有用。您有两种选择:
- 在输入中应允许特殊字符
%
和\
作为通配符:
... LIKE CONCAT('%', ?, '%')
- 不允许使用通配符:
... LIKE ?
$jobName = '%'.str_replace(array("_","%"),array("\\_","\\%"),$jobName).'%';
在这里,请参阅关于SO=>的这篇文章,它不适用于LIKE选择器,因为我想使用“%”来获取包含字符串的值。除了防止SQL注入之外,您可能还想阻止拒绝服务机会。如果有人输入一个空白字符串,您将返回整个表。当您说它不工作时,您的意思是什么,语句是否正在运行,是否存在错误,或者您是否尝试输入SQL并接受它?致命错误:对非对象调用成员函数bind_param()。这就是它给我的错误。您运行的是什么版本的PHP?将?
放在引号中将是一个字符串,并且永远不会与绑定参数关联。这个(答案)可能应该添加到该选项中,因为OP声明它不适用于LIKE选择器,根据,如果不能使用通配符,也可以使用=
运算符。然后,您可以使用%
和\
作为它们的原始含义。对不起,我的意思是,如果您没有按照第二个示例将%
关联到输入。