一般來說,當你實現一個基本的SOAP Web服務時,你將服務暴露給世界,無論好壞。您在代碼中必須考慮的主要問題是驗證輸入。天真地接受字符串可能會非常有害。如果有任何值可能是您無法處理的數字,請查找它並且不要繼續。如果你接受字符串,確保你徹底清理它們(尋找和非常懷疑分號,並逃脫你看到的每一個「特殊字符」)。
對於在SQL查詢中使用unsanitized字符串的天真服務的常見攻擊可能看起來像「ABC」; drop database master;「。如果你的代碼注入到SQL查詢中而沒有注意到僞造的查詢終止和惡意腳本,你可能在第二天清理你的桌面。解決方案非常簡單;轉義單引號,用ASCII或Unicode表示法替換分號,您可以將其翻譯回來(或簡單地將其除去),並且服務調用將它視爲垃圾。
這提出了第二點;即使它們是你的代碼,你的Web服務也應該成爲你係統其他部分非常懷疑的主題。 Web服務應該使用DB身份驗證,它提供儘可能少的權限來完成他們的工作。如果您的服務使用管理員或DBO登錄,則幾乎肯定是錯誤的;上面的查詢,如果它通過,實際上會被執行,並且您的主數據庫不再能夠使您的數據庫服務器無法運行。如果你的服務使用了一個非常嚴格地將權限控制在服務所需要的權限的登錄名,那麼SQL Server會陷入困境,但是這比失去你的主數據庫要好得多。
另外,要非常小心異常處理。通過SOAP返回的形式很差的異常,就像一個有效的結果一樣,可能包含機密信息,鼓勵攻擊者嘗試讓您的服務拋出一個異常,其中包含有關服務背後實現的有用信息。 SQL/ADO例外對攻擊者特別有用,因爲它們提供了可能被利用來造成麻煩的數據結構信息。尋找可能會導致無法控制的異常的事情,並在CLR或其他層比代碼更深的層次之前優雅地處理這種情況。捕獲所有異常在其他地方通常是不好的做法,但是在某些情況下,帶有一些消毒功能的「catch-and-release」可能是一個好主意,而通常指示異常陷阱的非常通用的500錯誤重定向在webosphere中是很常見的做法。如果您想要或必須在代碼中拋出異常,請仔細製作它,並且不要包含任何您不希望世界知道的信息。
從建築的角度來看,想想你的服務就像牆上的電源插座。插頭是讓你想要的東西(電源)離開牆壁的唯一途徑。你知道有J-box,導管,開關等,但是如果沒有很多(文字)黑客攻擊,你就無法訪問它們。按照這個比喻,你的端點應該被設置爲在指定的已知端口上進行監聽,而系統的其他部分應該看起來像從外面看到的牆;所有其他港口應該關閉。
Web服務威脅我的狗一次.. – 2010-09-01 16:12:10