我正在從擴展mysql轉換到PDO,並在閱讀所有我可以從你和其他地方的大師,我有一些剩餘的疑慮。我想出了以下內容來解決典型查詢的sql注入問題。我只是想知道這是否足夠,或者可能是我在白名單上有些過度,然後再將其複製到我的所有應用程序中。PDO /準備聲明/白名單/設置字符集,是否足夠安全以防止注入
我不清楚我是否正確地使用了白名單,也就是說,如果我也應該以某種方式逃脫。
此外,我不知道是否應該將屬性設置爲false爲每個查詢或只爲腳本一次。
$link = new PDO("mysql:host=$hostname;dbname=$database;charset=utf8", $username, $password);
$link->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$arr_i=$arr_k='';
$m_act=$v_act='Y';
$table = array('prices', 'versions', 'models');
$allowedTables = array('prices', 'versions', 'models');
$field = array('model_id', 'version_id', 'price', 'models.active', 'versions.active');
$allowedFields = array('model_id', 'version_id', 'price', 'models.active', 'versions.active');
if(count(array_diff($field, $allowedFields))==0 AND count(array_diff($table, $allowedTables))==0){
$sql = "SELECT COUNT(DISTINCT `" . $field[0] . "`) as ctmod FROM `" . $table[0] . "`
INNER JOIN `" . $table[1] . "` USING (`" . $field[1] . "`)
INNER JOIN `" . $table[2] . "` USING (`" . $field[0] . "`)
WHERE `" . $field[2] . "` BETWEEN :arr_i AND :arr_k
AND " . $field[3] . " = :m_act
AND " . $field[4] . " = :v_act";
$stmt = $link->prepare($sql);
$stmt->bindParam(':arr_i', $arr_i, PDO::PARAM_INT);
$stmt->bindParam(':arr_k', $arr_k, PDO::PARAM_INT);
$stmt->bindParam(':m_act', $m_act, PDO::PARAM_STR);
$stmt->bindParam(':v_act', $v_act, PDO::PARAM_STR);
for ($i=0; $i < $ctpri; $i++){
$k=$i+1;
$arr_i=$arr_pri[$i]+1;
$arr_k=$arr_pri[$k];
$stmt->execute();
while ($r = $stmt->fetch(PDO::FETCH_ASSOC)) {
$ctmod[] = $r['ctmod'];
}
}
}
else{die();}
http://codereview.stackexchange.com/ – Mihai
所有這些亂七八糟的問題是什麼?爲什麼你不能直接在查詢中寫一個提交的名字? –