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

私は2段階の検証を行っていました:

  1. ログインフォームを作成するときに、いくつかのフィルターと検証ツールを追加することができます[例:ユーザー名を有効なメールアドレスにし、パスワードを文字と数字のみにするルール]。フォームは、有効

  2. Zend_Auth_Dbまたは、doctrine_adapter 安全な内部で準備されたステートメントを使用するような他のDbベースのアダプタ:)

于 2010-12-08T10:39:01.377 に答える
0

SQL ステートメントがどのようにフォーマットされているかを確認する必要があります。SQL をパラメータ化"SELECT * FROM USER WHERE username=?"した場合、SQL インジェクションの問題は自動的に回避されます。しかし、自分で SQL を のよう"SELECT * FROM user WHERE username='+$username+"'"にフォーマットすると、SQL インジェクションに対して脆弱になる可能性があります。

于 2010-12-08T09:51:32.847 に答える