当前位置: 首页 > 面试题库 >

避免使用Zend_Db类进行MySQL注入

吕鸿文
2023-03-14
问题内容

我目前使用Zend_Db来管理查询。我已经编写了执行以下查询的代码:

$handle->select()->from('user_id')
                   ->where('first_name=?', $id)
                   ->where('last_name=?', $lname)

假设Zend_Db可以,我在不清理输入的情况下完成了此操作。Zend会这样做吗?

另一个问题:Zend_Db是否清除insert('table', $data)update查询?

谢谢。


问题答案:

当我是该项目的团队负责人(直到1.0版)时,我在Zend Framework中编写了很多用于数据库参数和引用的代码。

我尽力鼓励最佳做法,但必须在易用性之间取得平衡。

请注意,您始终可以检查Zend_Db_Select对象的字符串值,以了解其决定引用的方式。

print $select; // invokes __toString() method

您也可以使用Zend_Db_Profiler来检查由代表您运行的SQL Zend_Db

$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) );

但是,如果传递的参数是类型为object的对象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()方法使报价更加方便。



 类似资料:
  • 问题内容: 我是JavaEE的新手,并试图通过检查数据库来学习制作一个简单的登录页面。这是代码示例: 它应该容易受到SQL注入的侵害吧?我可以通过在ASP.NET中使用参数化查询来做到这一点,如下所示: 有没有办法像这样在Java中使用参数化查询?谁能以参数化形式使用该查询来避免SQL注入? 谢谢 问题答案: 是的,你可以做到这一点;例如:

  • 什么是SQL注入 SQL注入攻击(SQL Injection),简称注入攻击,是Web开发中最常见的一种安全漏洞。可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作,甚至有可能获取数据库乃至系统用户最高权限。 而造成SQL注入的原因是因为程序没有有效过滤用户的输入,使攻击者成功的向服务器提交恶意的SQL查询代码,程序在接收后错误的将攻击者的输入作为查询语句的

  • 问题内容: 在下面的示例代码中,表名称是一个输入参数。在这种情况下,如何避免使用进行SQL注入。下面是示例代码,我尝试使用它来避免它,但是它不起作用。谁能告诉我如何纠正它? 输出:打印消息: 所有输入参数将完全替换,并删除一行。请让我知道如何处理这种情况。 问题答案: 您可以将表名包含在 但是,如果使用两部分命名约定,例如,则必须添加其他解析,因为这将导致: 无效的对象名称[dbo.tablena

  • componentWillMount() 在组件将要挂载时被立即调用. 这个调用发生在render()函数执行之前, 所以如果在componentWillMount里面设置了state, 这个设置的state是不会触发重新渲染的. 同样我们也需要注意不要在componentWillMount()中引入其他可能会导致问题的代码. 如果你有类似的需求, 请在componentDidMount里面完成.

  • 问题内容: 如何避免使用HttpClient 4.1.1进行循环重定向。当我得到这样的错误:- 这是我的代码… 问题答案: 您可以将ClientPNames.ALLOW_CIRCULAR_REDIRECTS设置为true,这将允许重定向到同一位置。 在这里查看更多信息

  • 问题内容: 我有这样的代码: 实例化B可以按预期工作,但是实例化C无限递归并导致堆栈溢出。我该如何解决? 问题答案: 实例化C调用时,仍然是C,因此super()调用将其带回B。 调用super()时,请直接使用类名。因此,在B中,请致电,而不是(最好在C中使用)。在Python 3中,您可以仅使用不带参数的super()来实现同一目的