[英]php mysqli binding parameter:No data supplied for parameters in prepared statement
[英]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.