2010-03-17 48 views
0

我開發了一個ASP.NET應用程序,它與Google Maps進行接口並從數據庫中檢索標記信息。標記信息被分成數據庫中的表格,其中表格的名稱反映了公司(例如CompanyA_MarkerData,CompanyB_MarkerData等)。爲了定期用新的標記數據更新地圖,我使用JavaScript中的setTimeout來定期調用我的'UpdateMarkers'JavaScript函數。 'UpdateMarkers'調用執行數據庫查詢的Web服務,並將標記列表返回給JavaScript,然後更新地圖。我的ASP.NET代碼有多安全?

我用這種方法的主要問題是我的web服務要求我傳遞公司的名稱,以便它知道數據庫中要訪問哪個表。正如您可以想象的那樣,這帶來了安全風險,因爲任何人都可以將不同的公司名稱傳遞給Web服務,並且能夠從其他公司以及他們自己的公司檢索數據。

爲了避免這個問題,我按照以下方式重建我的程序:當系統管理員爲我的應用程序創建用戶時,他們也可以爲該用戶分配一個公司ID。公司ID使用ASP.NET中的Profile對象存儲。我將Web服務代碼移動到具有共享函數的類中,以便只能在我的頁面中調用它們(但不能由任何人使用,例如使用Web服務)。這些函數仍然需要傳遞給它們的公司名稱。然而,JavaScript並沒有直接調用這些共享函數,而是會調用一組頁面方法(據我所知,這些方法並非公開的Web服務)。然後,這些頁面方法將使用Profile對象來檢索附加到當前登錄用戶的公司名稱,然後調用我的共享數據庫函數並將信息返回給JavaScript。

我認爲這第二種方法比第一種方法更安全,因爲我不允許客戶端向我的代碼傳遞不同的選項並檢索未經授權的數據。服務器端代碼計算出需要發送的參數。但是,我想知道是否有更好的方法來做到這一點,我錯過了?

感謝

--Amr

+0

剛剛意識到頁面方法需要在VB中聲明爲Shared,並且我無法從Shared函數訪問Profile對象。這在工作中會引發一個扳手... –

回答

1

所有你需要的是檢查服務器端是否允許用戶訪問數據爲那家公司的方法。

我假設你使用的是AJAX,因爲你說你正在使用Javascript從你自己的數據庫中檢索信息。因此,無論您調用哪個服務器端腳本/程序,都要將用戶驗證代碼放在那裏。

+0

謝謝 - 我不知道我可以從Web服務訪問Membership對象,但事實證明我可以。這是要走的路。 –