Zend framework 在ZEND中引用原始sql以避免sql注入

Zend framework 在ZEND中引用原始sql以避免sql注入,zend-framework,sql-injection,Zend Framework,Sql Injection,长话短说,我有一个管理部分,用户可以从多个下拉列表中选择表和字段,这些表和字段必须是查询才能获得一些值。因此,ZEND中的查询是通过连接字符串来执行的 $query = "SELECT $fieldName1, $fieldName2 from $tableName where $fieldName1 = $value"; 如何使用ZEND方法避免上述sql注入?我试着把它们都添加为?调用quoteinto,但似乎这对某些变量(如表名或字段名)不起作用。使用quoteinto()或Zend_d

长话短说,我有一个管理部分,用户可以从多个下拉列表中选择表和字段,这些表和字段必须是查询才能获得一些值。因此,ZEND中的查询是通过连接字符串来执行的

$query = "SELECT $fieldName1, $fieldName2 from $tableName where $fieldName1 = $value";
如何使用ZEND方法避免上述sql注入?我试着把它们都添加为?调用quoteinto,但似乎这对某些变量(如表名或字段名)不起作用。

使用quoteinto()或Zend_db_Select::where()作为值,对于表名和列名,我只需去掉任何非字母字符,然后在SQL中使用它们之前将它们用`引号括起来

例如:

// Strip non alpha and quote
$fieldName1 = '`' .  preg_replace('/[^A-Za-z]/', '', $fieldName1) . '`';
$tableName = '`' . preg_replace('/[^A-Za-z]/', '', $tableName) . '`';
// ....

// Build the SQL using Zend Db Select
$db->select()->from($tableName, array($fieldName1, $fieldName2))
                ->where($fieldName1 . ' = ?', $value);

ZF有专门用于此目的的
quoteIdentifier()

$query = "SELECT ".$db->quoteIdentifier($fieldName1).","...

在您的情况下,您可能(还)希望对照有效列名的白名单进行检查。

在SafeMysql中,您可以将其简化为

$sql  = "SELECT ?n, ?n from ?n where ?n = ?s";
$data = $db->getAll($sql,$fieldName1,$fieldName2, $tableName, $fieldName1, $value);
虽然我知道您不会将ZF更改为SafeMysql

然而,有一件重要的事情应该手动完成:
我怀疑你想让用户浏览用户表或财务表或其他什么。 因此,必须根据允许的表数组验证传递的表名

$allowed = ('test1','test2');
if (!in_array($tableName, $allowed)) {
    throw new _403();
}