【发布时间】:2015-10-21 11:21:40
【问题描述】:
使用 MySQL 和 PHP,典型的 (PDO) 查询如下所示:
// prepare the query
$q = $DB->prepare("SELECT * FROM table_name WHERE property = :value");
// run the query
$q->execute(array(':value'=>$value));
这对于 SQL 注入是安全的,因为属性值与查询分开处理。
但是,如果我想使用相同的代码编写可能检索不同字段或不同分组的查询,则不能单独使用 prepare/execute 方法,因为不能对字段使用 PDO 参数 (see here)。
你能不能简单地使用 in_array() 来检查一个字段名,像这样:
// return false if the field is not recognised
if(! in_array($field_name, array('field1','field2','field3')) return false
// run the query
$q = $DB->query("SELECT * FROM table_name ORDER BY " . $field_name);
有没有更安全/更快捷的方法?
【问题讨论】:
-
它足够安全。有更好的解决方案,即当你有定义字段的实体/模型,但 in_array 没问题 ;)
标签: php mysql pdo sql-injection