多个 MySQLi 准备语句和漏洞(评价我的代码)

Posted

技术标签:

【中文标题】多个 MySQLi 准备语句和漏洞(评价我的代码)【英文标题】:Multiple MySQLi Prepared Statements and Vulnerability (Rate my code) 【发布时间】:2012-07-17 12:53:38 【问题描述】:

关于 mysqli 在 php 中准备的语句的超长问题。开始。

使用 MySQLi 准备好的语句是否完全不受 SQL 注入的影响?例如,请参阅下面的代码,我是否认为可以直接从用户那里使用 $_POST 变量而无需任何注入保护?出于这个问题的目的,请忽略验证数据以确保它是我的数据库的正确格式(无论如何我总是这样做),我在这里更关注安全性。

$mysqli=new mysqli($host, $user, $password, $database);

$stmt=$mysqli->stmt_init();
$stmt->prepare('INSERT INTO `tablename` (`column`) VALUES (?)');

$stmt->bind_param('s', $_POST['value']);
$stmt->execute();

$stmt->close();
$mysqli->close();

我的代码也正确吗?这只是我第二次或第三次使用 MySQLi 类编写准备好的语句。虽然它有效,但我想知道我是否正确地做所有事情?该脚本的任何部分都可以被视为不好的做法吗?

最后,我将如何处理使用相同数据库连接的多个准备好的语句?我是否只是在 $stmt 上使用 close() 方法,然后初始化另一个 $stmt 类?

谢谢!

【问题讨论】:

【参考方案1】:

参数 binding 对 SQL 注入是安全的。你不需要担心那部分。将用户输入与您的 SQL 语句连接是不安全的。

【讨论】:

所以我上面的例子是安全的,因为它是绑定的。而像 mysqli_query("INSERT INTO tablename (column) VALUES ($_POST['value']);") 这样的东西会不安全,因为它是连接的? 是的。如果输入正确转义,连接也可以是安全的。但是,作为设计问题,准备好的语句和参数绑定不需要额外的预防措施。 太棒了,谢谢 :) 对我的代码有什么建议吗?它看起来是否正确且构造正确?

以上是关于多个 MySQLi 准备语句和漏洞(评价我的代码)的主要内容,如果未能解决你的问题,请参考以下文章

mysqli:它可以在一个语句中准备多个查询吗?

mysqli:它可以在一个语句中准备多个查询吗?

mysqli 准备好的语句和 mysqli_real_escape_string

动态 mysqli 准备语句失败

mysqli使用IN运算符和另一个占位符准备语句

mysqli 使用 select * 和准备好的语句和查询