【发布时间】:2019-01-27 06:40:52
【问题描述】:
我正在用 PHP 编写一个 DbAdapter。为了避免 sql 注入攻击,对于条件选择,我需要一种方法来检查我要运行的 SQL 查询的健全性。鉴于准备好的语句使实现非常复杂,在类的核心执行之前,有没有一种快速的方法来检查 sql 查询的健全性(特别是WHERE 子句,就像这里的情况一样)?例如,为恶意或可疑查询返回 false 的辅助方法就可以了。
我的班级代码:
require_once './config.php';
class DbAdapter
{
private $link;
/**
* DbAdapter constructor.
*/
public function __construct()
{
$this->link = new mysqli(DBHOST, DBUSER, DBPASS, DBNAME);
if ($this->link->connect_errno) {
die($this->link->connect_error);
}
}
/**
* @param $table
* @param array $columns
* @param string $condition
* @return bool|mysqli_result
*/
public function select($table, $columns = [], $condition = "")
{
$colsString = $this->extractCols($columns);
$whereString = $this->extractConditions($condition);
$sql = "SELECT $colsString FROM `$table` " . $whereString;
return $this->link->query($sql);
}
public function __destruct()
{
$this->link->close();
}
private function extractCols(array $columns)
{
if(!$columns) { return '*';}
else {
$str = "";
foreach($columns as $col) {
$str .= "$col,";
}
return trim($str, ',');
}
}
private function extractConditions(string $conditions)
{
if(!$conditions) {
return "";
}
else {
$where = "WHERE ";
foreach ($conditions as $key => $value){
$where .= "$key=" . $conditions[$key] . "&";
}
return trim($where, "&");
}
}
}
【问题讨论】:
标签: php sql sql-injection