【发布时间】:2016-06-17 02:35:22
【问题描述】:
有以下代码
<?php
$age = get_age(); // a generated or random unsigned integer
$db->prepare("SELECT * FROM Customers WHERE name = :name AND age = :age");
$db->bindValue('name', $_POST['name']);
$db->bindValue('age', $age, PDO::PARAM_INT);
$db->execute();
我是否应该绑定“年龄”,即使它不是来自用户(即外部)?
如果我有一个固定的年龄,或者它是我以某种方式生成的,我应该这样做吗?
<?php
$age = get_age(); // <- Of course I made sure this is an unsigned integer
$db->prepare("SELECT * FROM Customers WHERE name = :name AND age = $age");
$db->bindValue('name', $_POST['name']);
$db->execute();
各有优缺点还是只是个人喜好?
【问题讨论】:
-
如果它是内部的,它可能是从其他一些攻击媒介从外部到达那里的。这就是 2 级 sql 注入的定时炸弹如何随着繁荣而变成 1 级。只是说。
-
从 PHP 中绑定任何值是一个很好的做法,并且尽可能不要将变量数据直接插入 SQL。这可以防止以后的代码更改发生意外。此外,在准备语句时,它已准备好进行多次快速执行,而无需每次执行开销。
-
@Drew 好的,但我只是直接输入年龄,我的意思是
AND age = 17。我应该这样做还是更好AND age = :age然后bindValue('age', 17, PDO::PARAM_INT)? -
我个人不会绑定,但我有兴趣了解@Drew 所说的“其他攻击向量”
-
就我个人而言,我总是绑定所有内容,然后我什至不必考虑 SQL 注入。任何时候您不绑定时,您都必须知道确切地该变量是如何到达那里的,除了在查询之前对脚本中的值进行硬编码之外,您可能必须遵循心理纸迹,以确保用户永远不会直接或间接地触摸它。另外值得一提的是,准备好的语句使您的查询可重用,因此如果您想将其从
17更改为56,您不必再次重新发送整个查询,只需重新发送值即可。
标签: php mysql pdo prepared-statement