auth适配器中的SQL注入setIdentity()和setCredential()

时间:2010-12-08 09:41:36

标签: php zend-framework zend-auth

当我设置一个auth适配器时,为了防止sql注入,在将它提供给setIdentity和setCredential方法之前,是否需要过滤或处理用户输入?

这是我的代码。我使用$request->getPost('username')中未经处理的帖子数据并将其直接输入setIdentity()和setCredential()。这是不安全的吗?我已经看到大多数博客示例在没有做任何其他事情的情况下这样做,但这可能是不好的做法。将数据添加到查询时,setIdentity()和setCredential()是否正确处理输入?

$request = $this->getRequest();
$adapter->setIdentity($request->getPost('username'))
$adapter->setCredential($request->getPost('password'));

3 个答案:

答案 0 :(得分:3)

如果您查看AuthAdapterClass,您将看到用于构建查询的此方法:

protected function _authenticateCreateSelect() {
// other code
//..
$credentialExpression = new Zend_Db_Expr(
            '(CASE WHEN ' .
            $this->_zendDb->quoteInto(
                $this->_zendDb->quoteIdentifier($this->_credentialColumn, true)
                . ' = ' . $this->_credentialTreatment, $this->_credential
                )
            . ' THEN 1 ELSE 0 END) AS '
            . $this->_zendDb->quoteIdentifier(
                $this->_zendDb->foldCase('zend_auth_credential_match')
                )
            );
}

他们正在使用quoteInto所以我认为不需要额外的转义。

答案 1 :(得分:0)

您应该查看SQL语句的格式。如果你有像"SELECT * FROM USER WHERE username=?"这样的参数化SQL,那么你会自动避免SQL注入的问题。但是,如果您自己像"SELECT * FROM user WHERE username='+$username+"'"那样格式化SQL,那么您可能容易受到SQL注入的攻击。<​​/ p>

答案 2 :(得分:0)

我曾经有过两步验证:

  1. 当您构建登录表单时,您 可以添加一些过滤器和 验证者[例如:规则 用户名是有效的电子邮件 地址和密码 仅限字母和数字]和您的 表单不会传递用户输入 除非有效

  2. Zend_Auth_Db或任何其他基于Db的适配器(如doctrine_adapter)在内部使用 准备好的声明是安全的:)