2011-04-27 43 views
2

我使用jquery POST調用來獲取數據以顯示在我的網站的各個部分。如何防止惡意使用jQuery post handler?

通常,它們POST到一個單獨的'ajax_handler.php'頁面,該頁面讀取請求的參數並返回相關數據。典型的參數可能是'get_order_details',123

我怎麼能阻止用戶發佈到腳本來嘗試和檢索他們不應該能夠的數據?例如,我知道我可以驗證數據是否屬於當前登錄的用戶,但是如何阻止用戶猜測可能存在'get_some_info'的處理程序?

因爲用戶甚至可以直接從URL運行javascript,所以這似乎是一個主要的安全問題,因爲客戶端將有權訪問SESSION和COOKIE數據(否則我將使用它來保證安全)。

我想我可以先用隨機字符串命名我的每個處理程序標識符,但我寧願不要損害我的代碼的易讀性。

回答

3

使用隨機字符串命名處理程序是安全的,雖然它可能會降低某人的速度,但不會阻止它們。

最好的辦法是在每次訪問頁面時存儲會話或數據庫校驗和。然後發送相同的校驗和以及POST內容。通過AJAX或其他方式提交表單時,您會比較校驗和。如果它們不匹配,那麼你知道用戶不在適當的頁面上,並且正試圖通過其他方法訪問處理程序。

+0

我已閱讀過有關'auth令牌'的信息,但如果用戶通過地址欄運行javascript,auth令牌將以完全相同的方式傳遞/訪問,從而使其成爲冗餘。除非我誤解了某些東西? – cusimar9 2011-04-27 20:32:21

+0

這對你的用戶來說是一件糟糕的事情,而不是互聯網應該如何工作。這也是安全通過默默無聞,因爲用戶可以很容易地看到你提供每個請求的任何「校驗和」... – meagar 2011-04-27 20:57:26

+0

@ cusimar9 - 不,他們將不得不加載正確的頁面首先獲得令牌。沒錯,他們可以進入頁面,查看源代碼,獲取令牌,但是在那一點上,如果他們通過在地址欄中輸入請求來提交請求,那麼它們有什麼關係?這種方法可以防止他們「盜鏈」請求。爲了工作,您需要爲每個請求重新生成參數。因此,如果他們能夠訪問特定的數據庫ID,他們仍然可以獲得每個ID,但不能以自動方式獲取,至少他們每次都必須加載整個頁面。 – Cfreak 2011-04-27 22:10:43

1

對於每個用戶,您可以在數據庫中存儲他應該能夠查看哪些數據以及哪些數據不應該查看的數據。每次獲取請求時,例如get_order_details,都應該調用一個函數來進行安全檢查,以確保用戶已登錄,並且他可以訪問'get_order_details'方法或任何其他嘗試的方法訪問。

+0

我知道我可以驗證用戶,但是我正在討論不需要用戶登錄的功能 – cusimar9 2011-04-27 20:29:49

+0

@cusimar您可以爲您的站點的每個訪問者分配一個臨時用戶ID,並使用它來跟蹤哪些他已經加載的部分。每24小時在Cron上運行腳本以刪除24小時前創建的臨時帳戶。 – 2011-04-27 20:46:32

0

你想要做的是與互聯網如何工作的根本對立。您不能也不應該試圖限制用戶向您的服務提出請求的方式。這是一種非常過時和倒退的思維方式。不要試圖限制用戶使用你的服務的方式,要感謝他們首先使用你的服務。

您所能做的就是確保用戶已通過身份驗證並可以訪問他們要求的記錄。如果您使用的系統沒有身份驗證,並且您想阻止用戶「猜測」下一條記錄的ID,請不要使用順序ID。使用隨機生成的字符串作爲標識符。使它們足夠長,以至於用戶難以絆倒其他記錄。

相關問題