这是一个100%安全的sql注入,并将word正确的任何输入?

laawzig2  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(307)

**结束。**此问题不符合堆栈溢出准则。它目前不接受答案。
**想改进这个问题吗?**更新问题,使其成为堆栈溢出的主题。

两年前关门了。
改进这个问题

$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();

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

2ledvvac

2ledvvac1#

是的,您的代码遵循防止sql注入的良好实践。使用参数是正确的方法。
唯一的建议是可选的,为了代码风格,而不是安全代码。你的也一样安全。

$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}%"]);

pdo允许您将查询参数作为数组参数传递给 execute() ,所以你不必使用 bindValue() .
而且,你不需要 PDO::PARAM_STR 的参数 bindValue() 至少对mysql来说不是。mysql的pdo驱动程序总是以字符串的形式传递参数。也许其他品牌的数据库也需要它。
您可以在一个多行字符串中编写sql查询(与java等一些语言不同)。你不需要使用 .= .
可以在双引号字符串中嵌入php变量。你不需要使用 '%'.$a.'%' ,您可以使用 "%{$a}%" . 我发现后者更具可读性,尤其是当您有多个变量要包含时。

相关问题