这是我在这里发表的第一篇文章,而且我对编程世界也相对较新。 简而言之,在结束我的电子商务网站时,用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方法?
希望我没有混淆,谢谢你的任何建议。
答案 0 :(得分:3)
不,这不安全。 mysqli无法解析查询字符串中的内容(可能是易受攻击的)数据,也不能解析什么不是。
如果您希望转义数据,则需要单独绑定每个参数。
但是,绑定参数仅适用于数据。对于列名,您需要按照@Michael在评论中指出的方式应用白名单。没有办法自动转义列/表名。
这适用于所有数据库层,包括PDO。如果您为图层提供完整的查询字符串,则其中的数据不会被神奇地转义。
答案 1 :(得分:0)
嗯,这更像是一个术语问题。看,有
最有可能在“绑定”下你的意思是准备好的陈述。在这种情况下,答案可能会有所不同
但你采取占位符的想法,答案会改变:
当然,运行查询的方式仍然不安全
但是,没有(手动)绑定就可以获得完全安全的查询
因此,bind_param不是必需的。