【发布时间】:2013-08-27 21:11:25
【问题描述】:
我正在学习如何避免 SQL 注入,但我有点困惑。
在使用 bind_param 时,我不明白目的。在手册页上,我找到了这个例子:
$stmt = mysqli_prepare($link, "INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt, 'sssd', $code, $language, $official, $percent);
$code = 'DEU';
$language = 'Bavarian';
$official = "F";
$percent = 11.2;
现在,假设这 4 个变量是用户输入的,我不明白这如何防止 SQL 注入。据我了解,他们仍然可以在其中输入任何他们想要的内容。
我也无法在其中找到'sssd' 的解释。它有什么作用?这就是让它更安全的原因吗?
最后一个问题:我在另一个问题上读到 mysqli_real_escape_string 已被弃用,但手册中并没有这么说。它是如何被弃用的?由于某种原因,它不能再转义特殊字符了吗?
注意:这个问题解释了 bind_param 的作用,但我仍然不明白为什么它更安全或更受保护。 Bind_param explanation
【问题讨论】:
-
sssd转换为字符串、字符串、字符串、双精度。By my understanding, they can still input whatever they want in there.正确。但是这四个变量中没有解析任何 SQL。 -
在您发送的链接上,您忘记阅读php.net/manual/en/mysqli-stmt.bind-param.php,详细信息在
types A string that contains one or more characters which specify the types for the corresponding bind variables: -
@DaveChen "没有解析 SQL" 这意味着他们仍然可以插入 SQL,只是不会被读取为 SQL,对吗?这是否意味着如果我没有表单验证,他们可以将 SQL 命令输入到我的数据库/字段中,但这并不重要,因为 SQL 没有被解析?
-
没错。数据逻辑和查询逻辑是分开的。
-
区别在于
select * from users where id=$id是用外部数据构建的,而select * from users where id=?不是。
标签: php sql mysqli sql-injection bindparam