Php 这是一个100%安全的SQL注入,并将word正确地用于任何输入?

Php 这是一个100%安全的SQL注入,并将word正确地用于任何输入?,php,mysql,sql,pdo,sql-injection,Php,Mysql,Sql,Pdo,Sql Injection,我想给用户搜索任何东西的能力。我应该过滤更多的字符吗?它是否100%安全,并能像在数据库中搜索文本片段时那样工作?是的,您的代码遵循防止SQL注入的良好实践。使用参数是正确的方法 出于代码风格的考虑,唯一的建议是可选的,而不是安全的代码。你的也一样安全 $a=$_GET["a"]; $b=$_GET["b"]; $a=str_replace("%", "\%", $a); $b=str_replace("%", "\%", $b); $sql="SELECT * FROM table "; $s

我想给用户搜索任何东西的能力。我应该过滤更多的字符吗?它是否100%安全,并能像在数据库中搜索文本片段时那样工作?

是的,您的代码遵循防止SQL注入的良好实践。使用参数是正确的方法

出于代码风格的考虑,唯一的建议是可选的,而不是安全的代码。你的也一样安全

$a=$_GET["a"];
$b=$_GET["b"];
$a=str_replace("%", "\%", $a);
$b=str_replace("%", "\%", $b);
$sql="SELECT * FROM table ";
$sql.="WHERE ColA LIKE :txtA AND ColB LIKE :txtB";
$query = $db->prepare($sql);
$query->bindValue(':txtA', '%'.$a.'%', PDO::PARAM_STR);
$query->bindValue(':txtB', '%'.$b.'%', PDO::PARAM_STR);
$query->execute();
PDO允许您将查询参数作为数组参数传递给
execute()
,因此不必使用
bindValue()

另外,您不需要
PDO::PARAM_STR
参数来
bindValue()
至少MySQL不需要。MySQL的PDO驱动程序总是以字符串形式传递参数。也许其他品牌的数据库也需要它

您可以在一个多行字符串中编写SQL查询(与Java等某些语言不同)。您不需要使用
=


可以在双引号字符串中嵌入PHP变量。您不需要使用
'%.$a.%'
,您可以使用
“%{$a}%”
。我发现后者更具可读性,尤其是当您有多个变量要包含时。

如果使用准备好的语句,则不需要进行筛选。这应该在代码审阅中发布。其中没有100%安全的内容。@MadhurBhaiya我需要它是否“像”,因为用户可以使用“%”,而我希望使用“%”tooI投票结束这个问题,因为我觉得它应该发布在我忘在这里的代码回顾中“\ux”。如果用户输入这个字符,那么一切都可以改变。谢谢。我将前两行更新为使用
preg\u replace()
,因此它将转义
字符。
$a=preg_replace('/[%_]/', '\\\\$0', $_GET["a"]);
$b=preg_replace('/[%_]/', '\\\\$0', $_GET["b"]);
$sql="
    SELECT * FROM table 
    WHERE ColA LIKE :txtA AND ColB LIKE :txtB";
$query = $db->prepare($sql);
$query->execute(['txtA'=>"%{$a}%", 'txtB'=>"%{$b}%"]);