【问题标题】:Using prepared statements for MySQL query options with PDO对带有 PDO 的 MySQL 查询选项使用准备好的语句
【发布时间】:2012-11-09 16:39:04
【问题描述】:

我正在使用 PDO,并且有用户可以在搜索结果中选择的选项。一些示例是排序、结果数、页码等。我尝试使用准备好的语句来验证这些数据以防止 SQL 注入攻击,但变量从未传递到查询中。

我做错了什么?结果的排序依据和数量是 SELECT 菜单,页码是一个文本输入表单,他们可以在其中输入数字。

$query = "SELECT SQL_CALC_FOUND_ROWS * FROM people ORDER BY id :sortBy LIMIT $start, :total";
$result = $conn->prepare($query);
$result->bindValue(":sortBy", $sortBy, PDO::PARAM_STR);
$result->bindValue(":total", $total, PDO::PARAM_INT);

【问题讨论】:

  • 如何确定“变量从未传递到查询中”?
  • 你为什么要绑定一些,而不是全部?即$start.
  • 当我删除 bindValues 并在查询中输入 ASC 和 100 代替 :sortBy 和 :totalResults 时,它可以工作。
  • @Jason McCreary - 我这样做是因为 $start 是我在 PHP 代码中设置的变量,而另外两个是用户通过前端输入的值。
  • 我仍然鼓励您绑定所有动态参数。考虑未来。也许有一天$start 是一个传递值。

标签: php mysql pdo prepared-statement


【解决方案1】:

绑定参数用于您要传递到查询中的实际数据。您不能绑定实际的控制命令——MySQL 会将它们解释为数据,而不是命令。

您可以做的是检查您发送的内容,然后将“ASC”或“DESC”传递给查询。您没有将用户提供的信息传递给查询 - 相反,您用于确定要传递的一组预定义命令中的哪一个。没有注入风险。

【讨论】:

  • 这并不完全正确。你可以绑定任何你想要的东西。问题不在于你不能绑定,而是绑定的方式。
  • 我的观点是,如果你绑定表标识符之类的东西,MySQL 将无法识别它,并且你的查询将失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-12
  • 2010-12-19
相关资源
最近更新 更多