爲了避免SQL注入,我做了一些研究並基於this答案我開始使用MySQLi編寫的statemets。這一切都很順利,直到我根據用戶點擊的內容從前端發送的參數order by
和order type
。爲了更具體一些,我有一些表和一些標題,用戶可以安排數據考慮名稱,價格,日期等,他也可以選擇ASC
或DESC
。我將它存儲到一些隱藏的輸入類型中,所以我猜想他們可能會使用firebug
來更改它。正因爲如此,我需要確保他們不能將任何東西注入到我的數據庫中。PHP | MySQLi準備的語句 - 處理順序和順序類型參數
$stmt = $dbConnection->prepare('SELECT * FROM mytable WHERE 1 ORDER BY ? ?');
$stmt->bind_param('ss', $_GET['order_by'], $_GET['order_type']);
看來我得到一個錯誤。我做了一些研究,有人說沒有解決方案,另一個人說唯一的解決方案是硬編碼,另一個人說,我必須退出使用準備好的語句,並嘗試mysql_real_escape_string
,但在我回答有人說:
如果您使用的是最新的PHP版本,下面列出的mysql_real_escape_string 選項將不再可用
所以我gueess這是不是也是這樣。所以我的問題仍然存在,接下來我應該做什麼?有這個問題的解決方案嗎?
您只能使用參數的值,您不能用它們來替換表和列的名稱。 – Barmar
'mysql_real_escape_string'不可用的原因是因爲'mysql'擴展名不見了。但是如果你使用'mysqli',它有'mysqli_real_escape_string'。但這對此沒有用處,因爲它用於轉義字符串而不是列名。 – Barmar