【发布时间】:2014-01-10 13:13:23
【问题描述】:
从客户端接收到的数据正在使用准备好的语句(查询)进行保存。例如:
if ($stmt = $mysqli->prepare("INSERT INTO table_1 VALUES (?, ?, ?);"))
{
$stmt->bind_param(/* data */);
$stmt->execute();
// ...
}
如果稍后我想要处理客户的数据,我是否必须再次使用准备好的语句?仅使用经典查询是否有风险?例如:
if ($stmt = $mysqli->prepare("SELECT * FROM table_2 WHERE something = ?;")
{
$stmt->bind_param("s", /* Selected value from the `table_1` */ );
$stmt->execute();
// ...
}
【问题讨论】:
-
如果没有用户交互,则不必使用prepare语句。
-
在第一个示例中是用户交互,但在第二个示例中,我只是在处理来自客户端的已保存数据......所以保存的数据是否足够安全?而且我不必使用准备好的语句/清理数据?我理解对了吗?
-
您旁边的其他人是否可以访问数据?如果是,则应使用 prepare 语句,否则不必。
-
如果用户输入构成查询的一部分,您应该使用准备好的语句。除非您正确清理用户输入,否则可以制作恶意 SELECT 查询来执行删除表等额外操作。准备好的语句是最安全的方法。
-
@Anam,您的建议确实不够。 SQL 注入利用我们在后续查询中重用存储在数据库中的数据这一事实并不少见——这是一种间接攻击。只需使用参数!没有充分的理由不这样做。
标签: php mysql pdo mysqli prepared-statement