2013-04-15 64 views
0

我知道這個問題已經被問了一百萬次,但是在SQL語句中運行一個變量之前驗證查詢字符串的今天(2013年)標準是什麼?運行MySQL之前在PHP中驗證變量?

例如,如果我通過$ _GET [ '身份證']接收來自URL變量 「ID」:

$id = $_GET['id']; 

...我應該怎麼運行前做:

SELECT * FROM users WHERE id="$id" 

這就夠了:

$id = mysql_real_escape_string($_GET['id']); 

...對於這個具體的例子?

+2

沒有更多的mysql_ *請 – alwaysLearn

+0

我認爲這種先進的先進的現代方法是使用ORM。 – akluth

+0

@akluth,沒有ORM神奇地爲你做驗證或篩選。他們可能有幫助的功能,但你需要明確地請求他們。 –

回答

1

你或許應該從過時mysql_切換到mysqli在這裏你可以充分利用mysql::prepare()它允許您使用佔位符:

$stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?"); 
$stmt->bind_param("s", $city); 
$stmt->execute(); 

哪些是安全的,因爲SQL可以得到的。

但是mysql_real_escape_string()足以防止SQL注入(只要您將字符串括在引號中)。

1

這是無關緊要的,因爲ID在大多數傳統的情形是一個整數。你必須使用:

$id = (int)$_GET['id']; 

的標準方法時下正在使用parametized查詢其在庫MySQLi和PDO的庫代表/預處理語句。

任何人工驗證,你需要明智地考慮你希望收到這個變量是什麼。

由於在這種情況下,你只希望整數,沒有別的。你不需要通過ID - >1 UNION SELECT ...發送這仍然是一個有效的字符串,並且mysql_real_escape_string不會做任何事情。

1

在這種情況下最簡單的驗證只是強制爲整數。

<?php 

$id = (int) $_GET['id']; 

$sql = "SELECT * FROM users WHERE id=$id"; 

然後你不需要在你的SQL表達式的變量周圍加引號。事實上,有些情況下,在數字文字中使用引號會擾亂SQL優化器,所以我總是很困惑爲什麼有這麼多人會陷入這種習慣。

如果你想進入更復雜的驗證,在PHP's filter extension閱讀起來。

最後,在SQL中使用變量的更好(更簡單,更快速,更安全)的方式是使用查詢參數。但是,PHP已棄用的mysql_*函數不支持查詢參數,因此您應該瞭解mysqliPDO