这种存储方法sql注入“安全”吗?

时间:2012-12-07 03:57:44

标签: php mysql sql mysqli

我刚从头开始编写自己的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;
    }

}

2 个答案:

答案 0 :(得分:5)

是的,这是安全的。

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

答案 1 :(得分:2)

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

请记住,正如您为SQL语句转义一样,在将其显示为HTML之前,您也应该努力逃避用户提供的数据,否则您最终会遇到各种问题,其中最糟糕的是{{3 }}

在任何情况下,XSS都可以更轻松地进行转义。 mysqli通常仅在PDO不可用时使用。

没有单一的魔术弹,但是你可以采取一些措施来防止你的应用被滥用,或者只是遭受尴尬的错误。但是,如果您正在编写自己的低级数据库接口代码而不是使用框架,那么这很难做到。你会花很多时间重新发明轮子。