0

当我设置身份验证适配器时,为了防止 sql 注入,我是否需要在将用户输入提供给 setIdentity 和 setCredential 方法之前对其进行过滤或处理?

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

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

3 回答 3

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,所以我认为不需要额外的转义。

于 2010-12-08T12:40:27.470 回答
0

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

于 2010-12-08T09:51:32.847 回答
0

我曾经有两步验证:

  1. 当你建立一个登录表单时,你可以添加一些过滤器和验证器[例如:用户名是有效的电子邮件地址和密码只有字母和数字的规则]并且你的表单不会通过用户输入,除非它有效的

  2. Zend_Auth_Db或任何其他基于 Db 的适配器,例如doctrine_adapter 使用内部准备的安全语句:)

于 2010-12-08T10:39:01.377 回答