2013-02-02 70 views
0

可能重複:
How to prevent SQL injection in PHP?Mysql的真實逃生繩等問題

考慮這個片段中,

*mysqltest.php* 

$user_id= $_GET['user_id']; 
$user_id= mysql_real_escape_string($user_id); 
$query = "SELECT * FROM people WHERE uid=".$user_id; 
echo $query; 
//then execution .. 

現在,當我們把這個腳本「mysqltest。 php?user_id = 56或1「

查詢結果爲 SELECT * FROM people WHERE uid = 56 or 1並且導致注射成功。

那麼我們應該如何保護自己在這種情況下列的數值類型?
在沒有使用pdo或預處理語句的情況下,是否還有其他解決方法?

+0

is_numeric($ USER_ID)的preg_match( 「/^[0-9] + $ /」,$ USER_ID) – 2013-02-02 12:05:16

+0

HTTP:/ /stackoverflow.com/a/2995163/285587 –

+0

您是否正在尋找一種在調用數據庫調用之前驗證數據的方法? – Tadeck

回答

0

還有no mysql_real_escape_string的「其他問題」。

大多數人混淆這個功能,認爲它的目的是通過「cleaninig」以某種方式防止他們注入任何「用戶輸入」。
這肯定是錯的。
mysql_real_escape_string用於格式化字符串,使其適用於SQL查詢。就這樣。作爲副作用,它也使得注射成爲不可能。

所以,每一個打算將字符串添加到查詢動態的時候,他們必須遵循字符串格式化規則,數據源的不管:

  • 用引號括起來的數據
  • 特殊字符轉義在它

,因爲它們是沒用一個沒有其他。

雖然將數字視爲字符串是對的。
因此,對於給定的例子,你的貓把你的數據作爲一個字符串,因爲它是在被刪除的答案

$user_id= $_GET['user_id']; 
$user_id= mysql_real_escape_string($user_id); 
$query = "SELECT * FROM people WHERE uid='$user_id'"; 

唯一的例外是,必須是唯一的整數LIMIT子句參數建議。
在這種情況下,唯一的解決辦法是將數據轉換爲所需的格式手動

$user_id= $_GET['user_id']; 
$user_id= intval($user_id); 
$query = "SELECT * FROM people WHERE uid=$user_id"; 

但請記住,還有其他的情況下,這需要不同的治療

還有一點要補充。
手動格式化數據是無聊的。
好多了,讓一些代碼來爲你做它,使代碼短期和安全

+1

這正是我給出的答案,它立即被低估了兩次。 :) – insertusernamehere

+0

@insertusernamehere:如果答案沒有提供intval($ user_id);他可能也會收到一些downvote – 2013-02-02 12:17:30

+0

我寫了「* [...]如果你不把它轉換爲整數*」,並且正在編輯帖子以在PHP網站上提供一個到'intval'的鏈接。 – insertusernamehere