2011-05-18 24 views
2

請閱讀完全第一示例代碼來解決這個特定的SQL注入孔

在這樣的回答:How to prevent SQL injection with dynamic tablenames?

佩卡·指出爲什麼這個代碼:

$clas=$_POST['clas']; 
$query="SELECT * FROM $clas "; 

不能被修復使用PDO或mysql-real_escape_string()

誰能請提供示例代碼如何解決這個問題這樣一個新手可以粘貼代碼
(後/它調整他的需要)並從SQL注入安全。

請不要解釋SQL注入,我都知道注射和PDO,我只需要示例代碼

回答

5

你可以使用白名單,以確保價值確實希望的一個表以這種方式訪問​​。

例子:

$allowed_tables = array('table1', 'table2'); 
$clas = $_POST['clas']; 
if (in_array($clas, $allowed_tables)) { 
    $query = "SELECT * FROM `$clas`"; 
} 

注意,構建SQL查詢直接從GET或POST參數通常是一個壞主意,反正,但白名單可以使它的安全。

+4

我認爲Pekka,在OP鏈接的另一個線程中接受的回答者,實際上暗示了這一點(或者更確切地說,限制爲一個列表,如SHOW TABLE查詢)。所以在這方面,這是更嚴格的,幾乎Pekka批准(tm) – horatio 2011-05-18 21:29:00

+0

我建議在'$ clas'附近添加反引號,以防萬一用戶想使用保留字作爲表名。 – Johan 2011-05-19 19:08:14

+0

@Johan補充,謝謝。 – 2011-05-19 19:11:39

-1

可以使用逃生:P

$clas = str_replace('`','\\`',$_POST['clas']); 
$query = "SELECT * FROM \`{$clas}\`"; 

所以,是一個版本非常糟糕的主意。

不同。

+1

-1對不起,不安全 – Johan 2011-05-19 06:18:00

+0

是安全的。檢查:http://dev.mysql.com/doc/refman/5.0/en/identifiers.html,更多解釋?:http://pastebin.com/MEUU82nM ..請在投票前檢查! – Exos 2011-05-19 17:13:16

+1

你很無能,對不起 – Johan 2011-05-19 17:46:26