2009-11-26 66 views
2

是否有一種「聰明」的方式來停止ASP.NET中的直接頁面調用? (頁面功能,而不是頁面本身)停止直接頁面調用到Ajax頁面

通過聰明,我的意思是不必在頁面之間添加哈希以停止直接調用AJAX頁面。簡而言之,這會阻止用戶以合法的方式訪問Ajax頁面,而不會從您的某個網站頁面發送。我知道沒有什麼不可能突破,我只是想看看還有哪些其他有趣的方法。

如果沒有,有沒有什麼辦法可以做到這一點,而不使用會話/ cookies?

+0

不可能阻止用戶直接訪問頁面,但仍然允許瀏覽器訪問它。惡意用戶總是可以欺騙瀏覽器正在做的事情。你試圖通過停止直接頁面調用來防止什麼? – 2009-12-07 06:38:50

+0

頁面功能,而不是頁面本身。加大難度並不是不可能的,這與加密完全相同。你讓生活變得如此艱難,以至於更多的努力掙脫,而不是值得。我已經在做一些事情,但這就是爲什麼我在問其他技巧。我將快速編輯以顯示「頁面功能」。 – 2009-12-07 07:22:08

回答

4

看一看這個問題:Differentiating Between an AJAX Call/Browser Request

從上述問題的最佳答案是檢查請求,通過或自定義標題。

最終,您的Web服務器正在接收客戶端向您發送的請求(包括標頭) - 所有可能被欺騙的數據。如果用戶被確定,那麼任何請求都可能看起來像一個AJAX請求。

我不能想到一個優雅的方法來防止這種情況(有不雅的方法,可能是非完美的方法,因此您提供了某種請求計數器在ajax和非ajax請求之間的散列)。

請問爲什麼你的應用程序對被直接調用的「ajax」頁面非常敏感?你可以圍繞這個設計嗎?

+0

謝謝catchdave。我之所以接受MikeB的理由是爲了完全說明這是如何完成的。似乎阻止人們做這件事的方式並不多,我懷疑這種做法,但這至少是另一種威懾力。 – 2009-12-08 05:05:25

2

您可以檢查請求標頭以查看該調用是否由AJAX啓動通常,您應該發現x-requested-with具有值XMLHttpRequest。或者在ASP.NET AJAX的情況下,檢查ScriptMAnager.IsInAsyncPostBack == true是否爲真。但是,我不確定是否首先防止請求。

+0

你不能欺騙那個頭文件嗎? – 2009-11-26 09:43:59

+0

是的。 http://stackoverflow.com/questions/623299/can-the-x-requested-with-http-header-be-spoofed – 2009-11-26 11:28:29

+0

想到了,嘿嘿。但感謝您的答案。 – 2009-11-26 11:34:54

1

我不認爲有沒有辦法不使用會話。即使您使用Http標頭,對於有人使用完全相同的標頭創建請求也是微不足道的。

對ASP.NET Ajax請求使用會話很簡單。您可能會遇到一些問題,例如session expiration,但您應該能夠找到解決方案。

通過會話,您將能夠保證只有登錄用戶才能訪問Ajax服務。在處理Ajax請求時,只需測試是否存在與其相關的有效會話。當然,登錄的用戶將能夠直接訪問該服務。沒有辦法避免這種情況。

如果您擔心登錄的用戶可能會嘗試直接聯繫服務以竊取數據,則可以爲服務添加時間限制。例如,不允許用戶每次訪問服務的時間超過一分鐘(或者應用程序正常工作所需的任何其他速率)。

看看谷歌和亞馬遜在爲他們的網絡服務做些什麼。他們允許你直接與他們聯繫(甚至提供API來做到這一點),但是他們會限制你可以提出多少請求。

1

你看過頭認證?如果您只希望您的應用程序能夠對某些頁面進行ajax調用,則可以要求對這些頁面進行身份驗證......不確定是否可以幫助您?

Basic Access Authentication

或更安全的

Digest Access Authentication

另一種選擇是將某種標識符追加到URL查詢字符串在應用程序中請求頁面之前,並且有某種身份驗證方法在服務器端。

1

我在PHP中通過在包含在任何地方的文件中聲明一個變量,然後檢查該變量是否設置在ajax調用文件中來完成此操作。

這樣,您不能直接調用該文件,因爲該變量永遠不會被定義。

+0

我認爲你誤解了這個問題。 你的建議是阻止某人直接直接瀏覽到一個通過HTTP可見的文件,但是隻有在包含它時才需要處理的文件(作爲一種旁觀方式 - 更好的方法是簡單地將「包含」文件放在Web服務器範圍之外全部一起)。 這裏的問題是要求如何阻止某人通過瀏覽器中的標準方法查看頁面,而不是通過AJAX調用請求相同的URL(即:XmlHttpRequest等)。 – catchdave 2009-12-07 06:10:46

+0

這就是我正在談論的。您無法查看檢查直接在包含文件中聲明的變量的文件。嘗試一下。做一個索引,聲明變量。包含另一個文件。檢查包含的文件中是否存在該變量。 – 2009-12-07 15:08:52

+0

當然不是(假設register_globals已關閉)。但是在那種情況下,同一個文件將無法通過AJAX直接調用(這是提問者希望能夠做到的)。 – catchdave 2009-12-07 22:07:18

1

這是「不平凡」的方式,因此它不是太優雅。

我能想到的唯一真正的想法是跟蹤每一個環節。 (就像所有的事情都是一個回傳,然後是一個response.redirect)。通過這種方式,您可以保留一個static List<>或IP地址(以及可能的瀏覽器ID等),以表明哪些頁面被允許從該訪問者那裏訪問..以及爲了讓他們等待的時間從現在開始直到3天。

我建議重新考慮你的設計,以確保這確實是需要的。並且還要注意IP等可能被欺騙。

此外,如果你遵循這條路線,一定要閱讀有關什麼時候靜態變量處置等。當他們使用該站點10分鐘時,你不會希望那些惱人的「你的會話已過期」消息。