mysqli准备语句没有绑定参数仍然安全吗?

pit*_*123 5 php mysql mysqli

这是我在这里的第一篇文章,而且我对编程世界也相对较新.简而言之,在结束我的电子商务网站时,用php,mysql和javascript/jquery开发,我发现我构建所有查询的方式(使用mysql_connect)可能导致mysql注入和许多其他讨厌的东西.

试图将所有内容"转换"为更安全的mysqli-prepared语句,我编写了一个包含从数据库中检索信息所需的所有方法的类,但是我不确定我正在制作的方式查询.

一些代码:类构造函数

class Database {

    private $DBH;

    public function __construct() {
        $this->DBH = new mysqli(WEB_SERVER, WEB_USER, WEB_PASS, WEB_NAME);
        if ($this->DBH->connect_errno) {
            return "Failed to connect to MySQL: (" . $this->DBH->connect_errno . ") " . $this->DBH->connect_error;
            exit();
        }
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

...和一个查询示例:

public function get_record_by_param($record, $param, $value) {
    $stmt = $this->getDBH()->stmt_init();

    $query = "SELECT * ";
    $query .= "FROM {$record} ";
    $query .= "WHERE {$param} = {$value} LIMIT 1";

    if($stmt->prepare($query)){
        return $this->execute_simpleAssoc($stmt);
    } else {
    return "Prepare failed: (" . $this->getDBH()->errno . ") " . $this->getDBH()->error;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用这样的查询仍然安全吗?或者我是否一定需要使用bind_param方法?

希望我没有混淆,谢谢你的任何建议.

Pek*_*ica 3

不,这不安全。mysqli 无法解析查询字符串中的数据(可能存在漏洞)和数据。

如果您希望转义数据,则需要单独绑定每个参数。

然而,绑定参数仅适用于数据。对于列名称,您将需要应用白名单,正如 @Michael 在他的评论中指出的那样。无法自动转义列/表名称。

这适用于所有数据库层,包括 PDO。如果您向图层提供完整的查询字符串,其中的数据将不会神奇地转义。