2

我刚刚从头开始编写自己的 php 注册脚本,由于我是新手,所以我想问一下我使用的方法是否可以防止 sql 注入?

这是我如何与我的 sql 数据库交换数据的示例:

public function StoreUser($name, $email, $password, $devid) {

    $mysqli = new mysqli("host", "user", "pass", "data");
    if ($mysqli->connect_errno) {
        echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
    }

    $unique_id = uniqid('', true);
    $hash = $this->hashSSHA($password);

    $add_user = $mysqli->prepare("INSERT INTO `users` SET `unique_id`=?, `name`=?, `email`=?, `encrypted_password`=?, `salt`=?, `devid`=?, `created_at`=?");
    $add_user->bind_param("sssssss",$unique_id,$name,$email,$hash["encrypted"],$hash["salt"],$devid,date("H:i:s"));
    if ($add_user->execute()) {
        $add_user->close();
        $mysqli->close();
        return true;
    } 
    else {
        $add_user->close();
        $mysqli->close();
        return false;
    }

}
4

2 回答 2

5

是的,它是安全的。

您正在使用从根本上将数据与命令分开的参数化查询,从而使您免受一阶 SQL 注入攻击。

于 2012-12-07T04:00:57.567 回答
2

使用适当的 SQL 占位符是确保应用程序安全的重要第一步。在这种情况下,您不必担心任何 SQL 注入错误,如果您对任何所有用户提供的数据使用占位符有纪律,则应该为您完成转义,但可能存在其他问题。

请记住,就像您为 SQL 语句转义一样,您同样应该在将用户提供的数据显示为 HTML 之前谨慎地转义它,否则您最终可能会遇到各种问题,其中最糟糕的是XSS

无论如何,PDO使转义变得容易得多。mysqli通常仅在 PDO 不可用时使用。

没有单一的灵丹妙药,但是您可以采取许多措施来防止您的应用程序被滥用,或者只是遭受令人尴尬的错误。但是,如果您正在编写自己的低级数据库接口代码而不是使用框架,这可能很难做到。您将花费大量时间重新发明轮子。

于 2012-12-07T04:04:35.440 回答