2013-02-11 96 views
0

人!準備好的語句中的動態參數

我有這個查詢從$_POST得到它的WHERE參數。事情是我想要動態獲取比較值,而不是爲每個值創建查詢。我現在擁有的是:

$what = $mysqli->real_escape_string($_POST['what']); 
........ 
$query = "SELECT * FROM list WHERE "; 
$query .= $what . " = ? LIMIT 0,10"; 
........ 
$stmt->bind_param('s', $what); 

我的第一個問題:安全性如何在實踐中這是什麼?是否有另一種更好的方式可以管理同一件事,因爲我無法綁定兩個參數?

我遇到的第二個問題是:我想將= ?更改爲LIKE %?%,但我無法正常工作。我嘗試使用CONCAT('%', ?, '%')(壞,我知道),但它仍然無法正常工作。 基本上我最終想達到的是:WHERE ? LIKE %?%。可能嗎?你能幫我一點嗎?

乾杯,亞歷克斯

+1

這是不安全的,使用白名單。 – MarcDefiant 2013-02-11 15:03:52

+0

即使你能避免SQL注入,你真的不能避免有人撬門查詢你的數據庫(因爲他們把不存在的列),而無需不斷地檢查你的表中存在的列 - 與肯定去建議的白名單。 – 2013-02-11 15:05:55

+0

與喜歡嘗試:'WHERE .. LIKE'然後'bind_param( 'S', '%測試%')' – bitWorking 2013-02-11 15:10:11

回答

0

mysql_real_escape_string或類似函數不會溢出反引號(`),因此您的應用程序易受SQL注入攻擊。

只需用你所有的列定義一個白名單,並檢查列是否在數組中。

要在LIKE %?%之後搜索,只需在搜索字詞的前面和後面追加一個%即可。爲了正確地逃避這件事,請參閱:Escaping MySQL wild cards

+0

所以白名單就是這樣,感謝您的答覆! – vulkoingim 2013-02-11 15:32:14

0

只是檢查$where嚴格的參數設置:

if (!in_array($where, array("table1", "table2"))) { 
    //do smth with wrong parameter 
} 

注意in_arrayO(N)複雜運行,以便更好地利用與表名關聯數組作爲鍵,如果你的設置的參數很大。

+0

會試試這個,謝謝! – vulkoingim 2013-02-11 15:34:42

-1

您可以像這樣做一個動態查詢,但您的網站將容易受到SQL注入。

-1

mysql_real_escape_string轉義反斜槓,但可以手動轉義它們。
將所有逃脫的東西移動到某種輔助庫中也是一個好主意。所以,你會得到你的數據在兩行:

$sql = "SELECT * FROM list WHERE ?n = ?s LIMIT 0,10"; 
$data = $db->getAll($sql, $_POST['what'], $_POST['where']);