Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.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 Mysqli编写的语句(SQL注入预防)_Php_Mysql_Sql_Code Injection - Fatal编程技术网

Php Mysqli编写的语句(SQL注入预防)

Php Mysqli编写的语句(SQL注入预防),php,mysql,sql,code-injection,Php,Mysql,Sql,Code Injection,在停止使用不推荐的mysql_*函数后,我切换到mysqli。但是,我注意到未准备好的语句对于SQL注入是不安全的。然后,我再次更改了代码 我使用的是以下函数,它检查数据库中是否存在变量$ID,并为该行打印title的值: function showPostTitle($ID, $mysqli) { $result = $mysqli -> query("SELECT ID, title FROM blog where ID = $ID"); $row = $result

在停止使用不推荐的mysql_*函数后,我切换到mysqli。但是,我注意到未准备好的语句对于SQL注入是不安全的。然后,我再次更改了代码

我使用的是以下函数,它检查数据库中是否存在变量$ID,并为该行打印title的值:

function showPostTitle($ID, $mysqli) {
    $result = $mysqli -> query("SELECT ID, title FROM blog where ID = $ID");
    $row = $result -> fetch_array(MYSQLI_BOTH);
    echo $row['title'];
}
我把它改成这样:

function showPostTitle($ID, $mysqli) {
    $stmt = $mysqli -> prepare("SELECT ID, title FROM blog WHERE ID = ?");
    $stmt -> bind_param("i", $ID);
    $stmt -> execute();
    $stmt -> bind_result($ID, $title);
    $stmt -> fetch();
    print_r($title);
    $stmt -> free_result();
}

我的问题是:这是实现准备好的语句的正确方法吗?另外,我现在安全了吗?非常感谢回答这个问题的人:)

看看这篇文章:

它使用PDO而不是MySQLi,MySQLi通过创建准备好的语句来解决同样的问题


对不起,没有回答你的问题,只是想提供一个资源让你考虑。

你的MySQL逻辑似乎很好,在你没有见过的情况下有一些例子。

但是,为什么在不使用ID时选择它?另外,当整个结果集中只返回一行时,您实际上不需要绑定结果,我假设在这种情况下会发生这种情况(ID是表中唯一的索引),请改用


使用mysqli prepare可以抵御所有常见的注入攻击,但不是0天风格的东西,它还没有到达驱动程序中。

谢谢,我会阅读一下,同时,我希望有人能检查我的代码并告诉我(除了SQL注入问题)它是否正确实现。谢谢你的建议。我还选择了$ID,但没有使用它,正如您所说:)我删除了它!使用PDO或mysqli真的只是一个意见问题吗?如果有任何计划从mySQL改变到其他东西?如果这个人离开mysql,让他们使用对他们来说更容易的东西。我认为PDO和mysqli在做我需要的事情时几乎是一样的。我错了吗?PDO更能证明未来,PDO允许您轻松地将mysql数据库换成另一种类型。这是主要的区别,但也有比mysqli多得多的选项,并且没有有助于实施oo风格的过程替代方案。此外,在PDO不支持的情况下,mysqli可能会被弃用。