当我设置一个auth适配器时,为了防止sql注入,在将它提供给setIdentity和setCredential方法之前,是否需要过滤或处理用户输入?
这是我的代码。我使用$request->getPost('username')
中未经处理的帖子数据并将其直接输入setIdentity()和setCredential()。这是不安全的吗?我已经看到大多数博客示例在没有做任何其他事情的情况下这样做,但这可能是不好的做法。将数据添加到查询时,setIdentity()和setCredential()是否正确处理输入?
$request = $this->getRequest();
$adapter->setIdentity($request->getPost('username'))
$adapter->setCredential($request->getPost('password'));
答案 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)
我曾经有过两步验证:
当您构建登录表单时,您 可以添加一些过滤器和 验证者[例如:规则 用户名是有效的电子邮件 地址和密码 仅限字母和数字]和您的 表单不会传递用户输入 除非有效
Zend_Auth_Db
或任何其他基于Db的适配器(如doctrine_adapter
)在内部使用
准备好的声明是安全的:)