0

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

$query = "SELECT $fieldName1, $fieldName2 from $tableName where $fieldName1 = $value";

如何使用 ZEND 方法逃避上述情况以避免 sql 注入?我尝试将它们全部添加为?并调用 quoteinto 但似乎这不适用于某些变量(如表名或字段名)

4

3 回答 3

2

采埃孚quoteIdentifier()专门为此目的:

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

在您的情况下,您可能(也)想要检查有效列名的白名单。

于 2013-04-02T09:18:31.300 回答
0

使用 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);
于 2013-04-02T08:44:57.590 回答
0

在 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();
}
于 2013-04-02T09:32:38.877 回答