如果我使用nodejs的http模塊來創建一個簡單的http服務器,那麼我需要做多少驗證/檢查?nodejs作爲http服務器有多健壯?
該模塊是否處理安全問題,如惡意請求和具有惡意標頭值的請求?模塊是否確保所有內容遵循http規範,還是必須進行大量檢查以確保我的服務器不易崩潰?
編輯:假設nodejs沒有做任何真正的驗證,我敢肯定的是這種情況。我需要做些什麼來確保我的服務器不易被破壞?
如果我使用nodejs的http模塊來創建一個簡單的http服務器,那麼我需要做多少驗證/檢查?nodejs作爲http服務器有多健壯?
該模塊是否處理安全問題,如惡意請求和具有惡意標頭值的請求?模塊是否確保所有內容遵循http規範,還是必須進行大量檢查以確保我的服務器不易崩潰?
編輯:假設nodejs沒有做任何真正的驗證,我敢肯定的是這種情況。我需要做些什麼來確保我的服務器不易被破壞?
什麼是惡意標頭值?節點是低層次的,所以很多東西都沒有被檢查。但你必須看看那些東西。但它不像有人可以發送「執行0xFA894224」什麼的。它可能具有的唯一孔之類的東西,允許惡意請求(例如,也許你可能會得到request.location: "\*\*\* CHINAAA \*\*\*"
,忘記發動套接字關閉事件,或拋出一個JavaScript錯誤,並優雅地終止。
您可以隨時檢查自己對這些或者使用try catch塊,process.on等等。當然,這並不是說可能沒有緩衝區溢出或某處存在某種東西,但是不太可能考慮節點構建在v8之上,並且許多庫純JavaScript
編輯: 如何阻止隨機崩潰:
process.on('uncaughtException',function() {
/* ignore error */
});
此外,雖然這會阻止99%的隨機崩潰,但99%的隨機崩潰是由JavaScript造成的,而不是由節點造成的。例如,你可能會做obj [request.location] = request.headers,如果某人設法以某種方式泄漏'\ _ \ _ proto \ _ \ _',可能會崩潰。 但是,這只是一般的JavaScript考慮因素。 –
爲了記錄'/ *忽略錯誤* /'是一個非常愚蠢的想法。如果你實現它,請用一些明智的錯誤處理來代替它。 – Raynos
NodeJS沒有被用作面向世界的HTTP服務器。但是,HTTP功能可以用來將請求代理到適當的Web服務器。
偏離主題,但Nginx真的擅長這樣做,因爲它擁有穩定的線程數量。
因此,使用nodejs服務器直接服務POST和GET請求通常是個壞主意? – shelman
我聽說的最常見的設置是使用Nginx作爲一個或多個node.js實例的網關。我認爲說它「沒有成爲......」,當它沒有完成時是不正確的。對我來說,這個項目的開發者似乎正在面向一個面向Web的應用服務器。 –
節點可以啓動更多節點進程,使用nginx並不有用。 –
[http module source](https://github.com/joyent/node/blob/master/lib/http.js) – Raynos
@Raynos:它看起來好像根本沒有任何驗證,只是將請求解析爲標題和正文。你同意嗎? – shelman
我對HTTP服務器安全/漏洞或黑客手段一無所知。所以我不能評論它應該驗證什麼。 – Raynos