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

时间:2013-04-01 15:11:06

标签: zend-framework sql-injection

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

来执行的
$query = "SELECT $fieldName1, $fieldName2 from $tableName where $fieldName1 = $value";

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

不起作用

3 个答案:

答案 0 :(得分:2)

ZF专门为此目的quoteIdentifier()

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

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

答案 1 :(得分: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);

答案 2 :(得分: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();
}