2013-01-11 56 views
2

在Web應用程序,當然在很多情況下,我們將支持CRUD(創建,獵犬,更新,刪除)基本瞭解Verification

Basic程序員都會做類似波紋管(無驗證):

delete?room_id=12 
update?room_id=13 

顯示的room_id僅適用於屬於用戶/客戶端的房間。 首先認證只使用用戶和密碼。這是一個標準。

但我相信我們不應該相信用戶。壞的用戶可能會猜測不屬於他的room_id。像delete?room_id=199

我問我的程序員朋友,他們甚至從來沒有想過這個問題。所以爲了防止這種情況,我有一個基本的解決方案,總是通過user_id爲任何相關的對象。這樣在任何動作之前查詢is the room_id belong to the user。 如果這是唯一的解決方案,所以我必須修改我已經寫好的所有查詢。

問題是,這個基本問題有什麼好的或更好的解決方案嗎?

謝謝

+0

使用'$ _POST'變量 –

+0

@Art:$ _POST如何解決這個問題?基本問題是找到檢查的最佳方式是屬於用戶還是不屬於用戶。那不僅僅是一個對象,而且可能會反對。像房間,地址,襯衫等 – Ahmad

+1

你有任何包含user_id和room_id的數據庫嗎?和@Art Planteur,用戶可以發佈任何數據,它只是在一個隱藏的領域 – Color

回答

4

你的方法是一個很好的方法。對於你的程序員朋友沒有想過它,我並不感到驚訝;不幸的是安全性似乎是大多數程序員頭腦中最後一件事。

在一個很好的系統中,您將執行授權檢查幾乎所有執行的操作以查看此特定用戶是否被授權執行該操作。在整個應用程序中建立這種檢查的通常很好的做法,即使對於通常不在乎的事情,如果他們被授權或不會:有一天你可能會這樣做。

在您的情況下,該操作可能是檢索房間,更新房間或甚至刪除房間。

要順水推舟我有幾個建議:

  1. 充分利用非ROOM_ID如果猜測的可能。假設您已經使用int作爲主鍵,簡單的方法是在客戶端瀏覽器和應用程序之間傳遞時加密/解密。

  2. 確保在瀏覽器端沒有傳入用戶標識,而是從會話或通過其他某種機制拉取該標識。關鍵是你不想相信用戶將ID傳遞給你。

  3. 任何不是GET的操作都使用HTTP POST執行。換句話說,你不應該把ID放在查詢字符串中,而是作爲發佈數據。

+0

太好了,謝謝你的推薦。但我認爲加密和解密id會使應用程序變得更慢。 – Ahmad

+1

@ Ahmad,應用程序不會因爲幾次加密而變慢,同時使用加密和檢查數據庫比僅檢查數據庫更好 – Color

+0

@Ahmad:解密/加密ID的處理時間量對於指出你不會注意到它。 – NotMe

2

假設您在會話中使用時註冊了userid:session_register(「userid」);

那麼你可以做這個檢查,如果登錄用戶擁有的房間(因爲你已經告訴你有一個包含roomid和用戶ID在同一時間一個數據庫)

$connect = mysql_connect("$server", "$dbuser", "$dbpassword") 
    OR die(mysql_error()); 

$room = intval($_GET['room_id']); 
$user = mysql_real_escape_string($_SESSION['userid']); 

mysql_select_db("$databasename", $connect); 
$select = mysql_query("SELECT userid AS uid FROM table WHERE userid='$user' AND room='$room'"); 
$fetch = mysql_fetch_assoc($select); 
$found = $fetch['uid']; 

if ($found == $_SESSION['userid']){ 

// User owns this room let him delete 

} else { 

// FAIL, This user does not own this room 

} 

變化「表」(其表中的數據庫既包含此信息的),「用戶ID」在該表(用戶ID列名)和「房間」在該表(房間id字段名)

編輯: 另外,如果您的room_ids可能有任何字符,刪除intval();從$房間,並做一個real_escaping它,如果room_ids只有數字不會改變它

+0

嗨,謝謝你的回答和例子。你的答案和我的理論和實踐一樣。我在第一個問題中已經提到過,是在做任何動作之前檢查屬於當前用戶的任何對象。來自這個,這意味着我要修改我的所有查詢。在此示例之前添加檢查之前,請執行任何操作,對嗎? – Ahmad

+0

歡迎你,是的,你需要添加你的行動,我鍵入//用戶擁有這個房間,並添加一個警告/ /失敗警告用戶,他不擁有這個房間 – Color

+1

由於用戶ID已經是查詢條件,如果找到記錄,'$ found == $ _SESSION ['userid']'將始終爲真。 – Gumbo

2

永遠不要相信什麼您的客戶傳遞給你。每個請求必須在服務器一側進行驗證,並檢查是否允許登錄的用戶執行該操作。

每個文本輸入都必須在插入或查看時進行消毒。後者有更大的遺忘機會,因此爲XSS提供了一個領域。我建議對模板使用隱式消毒。

也儘量避免使用GET方法進行批評操作。攻擊者總是可以強制用戶訪問URL(iframe,發送給他縮短的鏈接)。您還應該添加特殊的生成令牌到刪除表單,以防止CSRF attacks