Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 防止盲目SQL注入_Php_Mysql_Sql Injection - Fatal编程技术网

Php 防止盲目SQL注入

Php 防止盲目SQL注入,php,mysql,sql-injection,Php,Mysql,Sql Injection,我们在网页上扫描了漏洞。在下面的查询中,我们收到了一个关键的盲SQL注入。我正在使用准备好的声明。我还可以做些什么来防止SQL注入攻击?请让我知道。下面是我的示例代码。我感谢你的建议 $first_name = $_POST["first-name"]; $middle_name = $_POST["middle-name"]; $last_name = $_POST["last-name"]; $qry = $pdo_conn->prepare('INSERT INTO table1(

我们在网页上扫描了漏洞。在下面的查询中,我们收到了一个关键的盲SQL注入。我正在使用准备好的声明。我还可以做些什么来防止SQL注入攻击?请让我知道。下面是我的示例代码。我感谢你的建议

$first_name = $_POST["first-name"];
$middle_name = $_POST["middle-name"];
$last_name = $_POST["last-name"];

$qry = $pdo_conn->prepare('INSERT INTO table1(first_name, last_name, middle_initial) VALUES (?, ?, ?)');
$qry->execute(array($first_name, $last_name, $middle_name));

您也可以这样做:

$qry = $pdo_conn->prepare('INSERT INTO table1(first_name, last_name, middle_initial) VALUES (?, ?, ?)');

 $qry->bindParam(1,$first_name);
 $qry->bindParam(2,$middle_name);
 $qry->bindParam(3,$last_name);

$first_name = strip_tags(mysqli_real_escape_string($qry,$_POST["first-name"]));
$middle_name = strip_tags(mysqli_real_escape_string($qry,$_POST["middle-name"]));
$last_name = strip_tags(mysqli_real_escape_string($qry,$_POST["last-name"]));

$qry->execute();

有关盲sql注入的更多帮助,请参阅:和

我不熟悉盲sql注入的概念,但据我所知,它的工作原理与通常的sql代码注入一样,因为我们都知道,只有结果的解释不同

由于您使用的是准备好的语句,所有可能有害的SQL代码都将被转义,我不担心这个警告,可能是误报。免责声明:我不是律师安全顾问。

如果这是您在此处发布的真实代码,则不存在注入漏洞。既不是盲的也不是任何其他类型的

此代码无需改进


您需要找到一个更好的扫描仪,它不会引起错误警报。

您是否也有触发盲目SQL注入的POST数据?您如何知道查询是罪魁祸首?你确定这不是假阳性吗?@RandomSeed-应该是安全的,我非常担心一份事先准备好的声明可能不再有效safe@RaymondNijland:是的,但是,除非您手动禁用模拟,否则mysql_*函数将被弃用为关闭PHP 5.5。?。strip_标记strip html标记和php标记不能防止SQL注入…是的,你是对的,但这并不意味着我们不能从5.1开始使用它,而在5.5之前,我们不能使用它。对于我们的同类信息,折旧并不意味着过时,折旧可能并不意味着过时,但有时事物会因为过时而被弃用,这就是这里的情况。mysql_u已经被PDO和mysqli_混合bindParam和mysql_real_escape_string所取代,不过这很愚蠢。如果mysql\u real\u escape\u string在该代码中执行任何操作,则会导致双重转义,这绝对是不可取的。在将数据插入数据库之前,您要做的最后一件事是对数据进行转义。确实,它仍然应该是二阶SQL注入。@RaymondNijland是有意义的。对这段代码可能容易受到二阶攻击。这段代码怎么会容易受到二阶攻击?@YourCommonSense也许我应该换一句话:这段代码不阻止插入可以在其他地方用于二阶注入的数据。由于PDO::ATTR_EMULATE_PREPARES,我想知道默认值是什么?我在PHP源代码中发现它没有签名模拟(u)准备:1,;PDO MYSQL驱动程序始终使用模拟的C位字段。。。这让我有点担心,为什么会这样。。也许PDO正在默认客户端上呈现prepare语句,但也可能不安全。。我强烈建议使用->setAttributePDO::ATTR\u EMULATE\u PREPARES,false;始终定义charsetEmulation模式根本不重要。