SQL 在 PHP Phalcon 中注入

SQL injection in PHP Phalcon

我刚刚学习 SQL 注入并尝试注入我的基于 PHP 的代码(使用 PHP Phalcon 框架)。我尝试在我的登录中进行 SQL 注入。但是,当我尝试进行注入时,我无法做到,我不知道这是由于我的代码已经从 SQL 注入中变得健壮还是我以错误的方式进行了注入。

我的登录部分包含电子邮件和密码。对于电子邮件部分,我插入 test@test.com' or 1=1 并插入一些随机密码。

但是,有一条错误消息显示如下:

Scanning error before ' LIMIT :APL0:' when parsing: SELECT [Test\Models\Login].* FROM [TEST\Models\Login] WHERE email='test@test.com' or 1=1 --' LIMIT :APL0: (119)

这是验证登录码:

public function verifyLogin ($email, $password) {
    $records = $this->findFirst("email='$email'");
    if ($records && sha1($password)==$records->password) {
        return ($records->id);
    }
    return (false);
}

如何知道是我的注入错误还是代码已经健壮了?如果注入仍然错误,如何解决?

无论是否是 Phalcon,您编写代码的方式都容易 SQL 注入。我不确定您是否真的想要在上面的脚本中执行SQL注入,或者您正在尝试找出防止它的方法。

如果是后者,你可以随时绑定你的参数:

public function verifyLogin ($email, $password) {
    $record = $this->findFirst(
        'conditions' => 'email = :email:',
        'bind'       => [
            'email' => $email,
         ],
    );

    if ($record && sha1($password) == $records->password) {
        return ($records->id);
    }

    return false;
}

以上代码使用了绑定参数,这是 PDO 的一个特性,可以更好地防止 SQL 注入。