php – 避免使用Zend_Db类进行MySQL注入

前端之家收集整理的这篇文章主要介绍了php – 避免使用Zend_Db类进行MySQL注入前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我目前使用Zend_Db来管理我的查询.
我已经编写了一些代码,可以像下面那样进行查询
$handle->select()->from('user_id')
                   ->where('first_name=?',$id)
                   ->where('last_name=?',$lname)

假设Zend_Db将会完成此操作,而不会对输入进行消毒. Zend是否做到这一点?

另一个问题:
Zend_Db是否清理insert(‘table’,$data)和更新查询

谢谢.

我在Zend Framework中编写了大量数据库参数和引用的代码,而我是该项目的团队负责人(最多为1.0).

我尽可能地鼓励最佳做法,但是我必须平衡使用.

请注意,您可以随时检查Zend_Db_Select对象的字符串值,以查看它如何决定引用.

print $select; // invokes __toString() method

此外,您可以使用Zend_Db_Profiler检查由Zend_Db代表您运行的sql.

$db->getProfiler()->setEnabled(true);
$db->update( ... );
print $db->getProfiler()->getLastQueryProfile()->getQuery(); 
print_r $db->getProfiler()->getLastQueryProfile()->getQueryParams(); 
$db->getProfiler()->setEnabled(false);

以下是您的具体问题的一些答案:

> Zend_Db_Select :: where(‘last_name =?’,$lname)

值适当引用.虽然 ”?”看起来像一个参数占位符,在这个方法中,这个参数被实际引用并被内插.所以这不是一个真正的查询参数.事实上,以下两个语句产生与上述用法完全相同的查询

$select->where( $db->quoteInto('last_name=?',$lname) );
$select->where( 'last_name=' . $db->quote($lname) );

但是,如果您传递一个类型为Zend_Db_Expr的对象的参数,那么它不会被引用.您负责sql注入风险,因为它被逐字插值,以支持表达式值:

$select->where('last_modified < ?',new Zend_Db_Expr('NOW()'))

该表达式中需要引用或分界的任何其他部分是您的责任.例如,如果您将任何PHP变量插入到表达式中,则安全是您的责任.如果列名称sql关键字,则需要使用quoteIdentifier()将它们自己定界.例:

$select->where($db->quoteIdentifier('order').'=?',$myVariable)

> Zend_Db_Adapter_Abstract :: insert(array(‘colname’=>’value’))

表名和列名称是分隔的,除非您关闭AUTO_QUOTE_IDENTIFIERS.

值被参数化为真查询参数(不插值).除非这个值是Zend_Db_Expr对象,否则这个对象将被逐字插值,所以你可以插入表达式或者NULL或者其他任何东西.
> Zend_Db_Adapter_Abstract :: update(array(‘colname’=>’value’),$where)

表名和列名称是分隔的,除非您关闭AUTO_QUOTE_IDENTIFIERS.

值被参数化,除非是Zend_Db_Expr对象,如在insert()方法中.

$where参数根本没有被过滤,所以你负责任何sql注入的风险.您可以使用quoteInto()方法来帮助引用更方便.

猜你在找的PHP相关文章