2015-06-22 88 views
1

我試圖以防止SQL注入(標準網站)的方式爲MySQL設置PHP查詢。PHP:調整SELECT注入SQL注入後while循環無法正常工作

我有一對夫婦INSERT查詢哪裏改變這個工作很好,但以下SELECT我不斷收到一個錯誤,因爲更新,它看起來像while循環不與我所做的更改工作(它的工作原理不需要像舊代碼那樣使用語句)。

有人能告訴我我在做什麼錯嗎?

新PHP:

$stmt = $conn->prepare("SELECT ? FROM TranslationsMain WHERE location LIKE '%calendar weekday%' ORDER BY sortOrder, ?"); 
$stmt->bind_param('s', $selectedLang); 
$stmt->execute(); 
$result = $stmt->get_result(); 
while($arrCalWeekdays = $result->fetch_assoc()){ 
    $calWeekdays[] = $arrCalWeekdays; 
} 
$conn->close(); 

老PHP(變更部分):

$sql = "SELECT " . $selectedLang . " FROM TranslationsMain WHERE location LIKE '%calendar weekday%' ORDER BY sortOrder, " . $selectedLang; 
$result = $conn->query($sql); 
while($arrCalWeekdays = $result->fetch_assoc()){ 
    $calWeekdays[] = $arrCalWeekdays; 
} 
$conn->close(); 

錯誤消息:

Fatal error: Call to a member function fetch_assoc() on a non-object in /homepages/21/d580042014/htdocs/myform.php on line 21

很多感謝提前。

+0

請參閱http://stackoverflow.com/questions/11312737/can-i-parameterize-the-table-name-in-a-prepared-statement關於*你不能做什麼*準備好的陳述。 –

+0

'$ selectedLang'的值從哪裏來?它是用戶定義的嗎? – Gumbo

回答

5

您不能綁定列名和表名,只能綁定數據。您需要指定表格,然後綁定您的'%calendar weekday%'

$stmt = $conn->prepare("SELECT " . $selectLang . " FROM `TranslationsMain` WHERE `location` LIKE ? ORDER BY `sortOrder`, " . $selectedLang); 
$stmt->bind_param('s', $calendar_weekday); 

如果你想使用動態表/列名應執行這些項目的最小的白名單。您可以通過詢問數據庫哪些列對於給定數據庫表有效來構建動態白名單。例如:

SELECT `COLUMN_NAME` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA` = `database_name` 
AND `TABLE_NAME` = `table_name` 

可以將所有這些信息在數組中,然後檢查,以確保在查詢中使用的表/列名的數組。應該對錶名和列名額外考慮,確保這些名稱沒有使用密鑰/保留字。

最後,在調用動態查詢的值時,在驗證的表/列名稱周圍使用反引號。這將涵蓋對密鑰/保留字列表的任何可能更改並提供額外的保護層。

+1

簡單而有效的答案。 *方式去山姆* –

+0

感謝您的!你能告訴我我剛剛做什麼嗎?另外,對於簡單的選擇,這樣選擇的列只能定義不同的語言/翻譯,我甚至不得不將其設置爲注射預防? – TaneMahuta

+1

綁定變量是防止SQL注入的原因,因爲這是任何嘗試注入的來源。我更新了我的回答@TaneMahuta –