我通常使用準備好的陳述句,但在特定頁面上我使用的是動態查詢,我找不到防止 SQL 注入的可靠方法。
if(isset($_GET['sub_cat'])){
if($_GET['sub_cat'] != '')
$conditions[] = 'ad_sub_cat='.$_GET['sub_cat'].'';
}
if(isset($_GET['ad_brand'])){
if($_GET['ad_brand'] != '')
$conditions[] = "`ad_brand` LIKE CONCAT('%','".$_GET['ad_brand']."','%') ";
}
if(isset($_GET['min_range'])){
if($_GET['min_range'] != '')
$conditions[] = 'ad_price >='.$_GET['min_range'].'';
}
if(isset($_GET['max_range'])){
if($_GET['max_range'] != '')
$conditions[] = 'ad_price <='.$_GET['max_range'].'';
}
if(isset($_GET['for_r_s'])){
if($_GET['for_r_s'] != '')
$conditions[] = 'for_r_s ='.$_GET['for_r_s'].'';
}
$query = "SELECT posts.ID, posts.ad_title, posts.ad_price, posts.ad_location, posts.ad_sub_cat FROM `posts` WHERE ". implode(' AND ', $conditions) ."";
uj5u.com熱心網友回復:
您可以像處理任何其他查詢一樣防止 SQL 注入:通過將應該始終基于硬編碼值的查詢與資料分開。唯一的區別是您需要有條件地構建查詢和資料引數串列。
所以而不是:
if(isset($_GET['sub_cat'])){
if($_GET['sub_cat'] != '')
$conditions[] = 'ad_sub_cat='.$_GET['sub_cat'].'';
}
你應該寫:
if(isset($_GET['sub_cat'])){
if($_GET['sub_cat'] != '') {
$sql_conditions[] = 'ad_sub_cat=:sub_cat';
$parameters['sub_cat'] = $_GET['sub_cat'];
}
}
或者,如果使用位置引數而不是命名引數:
if(isset($_GET['sub_cat'])){
if($_GET['sub_cat'] != '') {
$sql_conditions[] = 'ad_sub_cat=?';
$parameters[] = $_GET['sub_cat'];
}
}
依此類推,適用于您的所有條件。
然后最后,您從中構建您的 SQL $sql_conditions- 它根本沒有用戶輸入,因此不會被注入 - 并傳遞$parameters給 PDO/mysqli 以執行查詢。
uj5u.com熱心網友回復:
mysqli_real_escape_string在將引數添加到查詢字串之前使用。例如:
if(isset($_GET['sub_cat']) && $_GET['sub_cat'] != ''){
$sub_cat = mysqli_real_escape_string($connection, $_GET['sub_cat']);
$conditions[] = 'ad_sub_cat='.$sub_cat.'';
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/351110.html
下一篇:三張表,一張外鍵參考其他兩張表
