作为一个新手,我遵循了PHP MySQL教程,建议使用常规的MySQL php函数。但是,由于有人告诉我PDO是更好的选择,因此我一直在将代码转换为PDO。我只是遇到了以下问题:
$query = $uspdb->prepare("SELECT post_id, is_approved, reports FROM ? WHERE id=? AND ?");
$query->bindValue(1, $table, PDO::PARAM_INT);
$query->bindValue(2, $id, PDO::PARAM_INT);
$query->bindValue(3, checkPermission("comment_moderation"),PDO::PARAM_BOOL);
$query->execute;
$result = $query->fetch(PDO::FETCH_ASSOC);
第一行引发以下PDO异常:
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? WHERE id=? AND ?' at line 1
这是为什么?我不知道语法有什么问题。我正在阅读的教程告诉我,我应该使用bindValue或execute(array(stuff))添加参数,而不是“。$ id”。之类的东西,因为它比较安全,但这出于任何原因都行不通。
不幸的是,准备好的语句只能表示数据文字。(在模拟准备的情况下)。因此,开发人员必须自己照顾标识符-PDO对此无济于事。
为了使动态标识符安全,必须遵循2条严格的规则:
格式化之后,可以安全地将$ table变量插入查询中。因此,代码将是:
$field = "`".str_replace("`","``",$field)."`";
$sql = "SELECT * FROM t ORDER BY $field";
但是,尽管这种格式足以满足ORDER BY之类的要求,但在大多数其他情况下,仍有可能进行另一种注入:让用户选择他们可以看到的表或字段,我们可能会揭示一些敏感信息,例如密码或其他个人数据。因此,始终最好根据允许值列表检查动态标识符。这是一个简单的示例:
$allowed = array("name","price","qty");
$key = array_search($_GET['field'], $allowed));
if ($key === false) {
throw new Exception('Wrong field name');
}
$field = $allowed[$key];
$query = "SELECT $field FROM t"; //value is safe
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句