2011-01-20 60 views
0

我們目前在我們的ASP.NET網站上提供了一個冗長的表單,它使用面向公衆的外觀WCF服務通過SSL將信息提交到我們的網絡,通過一些其他門面服務等。WCF/ASP.NET - 防止濫用,如DOS

我們遇到了一些與服務鏈宕機有關的問題,並且由於這個原因,一些用戶非常沮喪,他們完成了冗長的表單,只是在事實之後才發現服務沒有起來。因此,我們正在實施一種形式的ping功能,在表單啓動之前對服務執行ping操作,以確保服務已啓動。

如果在形式網頁的OnLoad期間簡單地調用Ping()方法,則可能會通過例如腳本持續對頁面發出HTTP GET請求的DOS攻擊。

我的問題是 - 從概念層面上,確保人與頁面互動並保持可用性的最佳方式是什麼?例如,調用Ping()之前的CAPTCHA被調用並且表單被啓動的方式太具侵入性,即使它可以有效地確保表單被正確使用。另一方面,僅僅允許Ping()發射OnLoad對於攻擊來說太冒險了。

我考慮過的一個選項是讓用戶可以使用一個按鈕,以便他們驗證服務的可用性並一次性啓用該表單。這至少是兩者之間的平衡。我要求您就如何最好地平衡這種方法提出意見。任何基於asp.net,c#或javascript/ajax的答案都可以。

最後 - 我也知道這種檢查服務可用性的方法存在缺陷,因爲不能保證服務在填寫表單時可用 - 但是已經決定使用這種方法,所以請保持你的答案的重點。

感謝您的幫助和提前輸入!

更新1:

在回答下面喬希的答案 - 我要澄清,提交的表單數據是敏感的,不能在服務器上本地供以後提交如果服務失敗緩存或存儲。這就是爲什麼讓用戶搶先註冊非常重要。我們在服務方面遇到的問題不是間歇性的,因此如果Ping()回來,那麼用戶幾分鐘後就不會遇到提交表單的問題。

更新2:

  • Ping()方法是目前服務器端C#方法,而不是的JavaScript。
  • 面向公衆的WCF服務是IP限制,只允許從公共網絡服務器

回答

3

請求你爲什麼不只是調用Ping()當按鈕被按下提交,如果服務沒有響應,那麼不要提交表單並顯示錯誤。

在jQuery中就像這樣。這assumses是Ping()返回true如果服務達,false否則:

$('#myformid').submit(function() { 
    var svcUp = Ping(); 

    if(!svcUp) 
     alert("Sorry, there was an error submitting, please try again."); 

    return svcUp; 
}); 

不幸的是具有低廉的通話成本,加工成本高會很容易受到DOS攻擊沒有某種類型的節流的任何面向公衆的Web服務。

值得慶幸的是WCF具有控制節流一些有用的設置,看看MaxConcurrentCallsMaxConcurrentInstancesMaxConcurrentSessions

+0

這個,但擴展它;請確保使用AJAX,以便用戶不會丟失任何數據,並且如果他們有Html5可用,請提供將其保存在本地,或者可能將其發送到備份服務器或SOMETHING。 – Kris 2011-01-20 19:55:21

+0

感謝喬希的投入。表單已經通過一些FaultExceptions處理了任何問題。他們已經得到一個用戶友好的錯誤消息。如果服務不可用,他們不希望首先填寫表單... – 2011-01-20 19:57:25

1

實在是對客戶端沒有很好的解決辦法,以防止DOS攻擊 - 我可以創建一個腳本使用你的Ping js方法,它會在循環中調用它一百萬次。您可以通過跟蹤每秒來自相同ip/session/user/otherclient端標識符的呼叫來阻止它在服務器端。如果每秒通話次數超過某個合理限制,您暫時禁止該客戶。

你可以看一下http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx - 向下滾動到「服務(DoS)攻擊的防止拒絕」爲例

1

打電話給你的頁面加載提交按鈕之前,功能和。如果您有任何正在使用的日誌記錄,則可以爲此特定的aspx頁面視圖插入日誌表幷包含訪問者的IP地址。設置一個門檻,如果知識產權提出的請求超過您正確使用的要求,則建立一些類型的人爲驗證項目。