簡體   English   中英

mysqli准備語句沒有綁定參數仍然安全嗎?

[英]mysqli prepared statement without binding parameters still secure?

這是我在這里的第一篇文章,而且我對編程世界也相對較新。 簡而言之,在結束我的電子商務網站時,用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();
        }
    }
    ...
}

...和一個查詢示例:

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;
    }
}

使用這樣的查詢仍然安全嗎? 或者我是否一定需要使用bind_param方法?

希望我沒有混淆,謝謝你的任何建議。

不,這不安全。 mysqli無法解析查詢字符串中的內容(可能是易受攻擊的)數據,也不能解析什么。

如果您希望轉義數據,則需要單獨綁定每個參數。

但是,綁定參數僅適用於數據 對於列名,您需要按照@Michael在評論中指出的方式應用白名單。 無法自動轉義列/表名稱。

這適用於所有數據庫層,包括PDO。 如果您為圖層提供完整的查詢字符串,則其中的數據將不會被神奇地轉義。

好吧,這更像是一個術語問題。 看,有

  • 占位符的一般概念,用於表示查詢中的數據
  • 准備好的語句,它是占位符的子集
  • 綁定事物,屬於預處理語句,但可以省略

最有可能在“約束”下你的意思是准備好的陳述。 答案可能會有所不同。
但你采取占位符的想法,答案將改變:
當然,運行查詢的方式仍然不安全。
但是,沒有(手動)綁定就可以獲得完全安全的查詢。
因此,bind_param不是必需的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM