2014-04-18 56 views
0

我正在構建一個嚴重依賴數據庫的Web應用程序。下面是查詢類型的例子我用了很多:如何在PHP中防止SQL注入變量表名稱

CREATE TABLE item$userenteredname$username 

基本上每次創建一個新的項目,則存儲信息,每添加一些時間的表。所以我需要表名保持不變。

我最近花了不少時間更新我的代碼以使用PDO。我知道如何準備語句和綁定值,但是不能用表名來完成。一直沒能找到一個正確的答案我的問題,這是澄清是...

我怎麼可以sanitize用戶輸入反對sql注入當我不能使用prepare或mysql_real_escape_string,因爲該變量是在表中名稱?

+2

這是一個愚蠢的設計。更好地花費一些時間創建適當的體系結構,而不是處理數千個表 – xzag

+2

如果您有超級變量表名稱,那麼您的數據庫設計是錯誤的。 – deceze

+0

去這個鏈接,你會得到主意http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php –

回答

0

我對這個用例的策略是刪除非字母數字字符。

$usereneteredname = preg_replace('/[^0-9a-zA-Z_]/', '', $usereneteredname); 
    $username = preg_replace('/[^0-9a-zA-Z_]/', '', $username); 

    // then "CREATE TABLE item$userenteredname$username" 

該策略被稱爲白名單。那preg_replace呼叫將取代任何不是0-9a-zA-Z_

進一步考慮:

您也不妨在輸出後的字符串長度驗證,並確保你是在一個字符串不是一個數組操作。