2013-10-23 50 views
0

我正在使用nodejs,並且我的站點的一部分將只是簡單地提供文件,基本上在包含公共文件的某個目錄上使用fs.readFile。例如,當您請求mydomain.com:1234/hello/info.html時,我的腳本將請求文件publicfiles/hello/info.html並將結果發送給客戶端。但是,我知道如果攻擊者輸入mydomain.com:1234/../evilurl/userpasswords.txt nodejs將嘗試獲取publicfiles/../evilurl/userpasswords.txt,這與evilurl/userpasswords.txt確實相同,換句話說,他們可以訪問publicfiles目錄中的文件並訪問「安全」信息。我知道我可以通過簡單地確保req.url不包含..來防止這種情況發生,但是用戶可以通過其他方式訪問錯誤的文件嗎?他們可以使用某種轉義序列而不是..這意味着同樣的事情嗎?另外,我不想爲此使用快遞。如果有專門爲此的圖書館,我很好,但我不想要一個像明確的巨大框架。確保安全url nodejs

+0

Express不是一個「龐大的框架」。你應該使用它。或者只是使用https://npmjs.org/package/st – SLaks

+0

@SLaks我想你是對的。我的意思是,express只是一個路由框架。噢,它也有請求管理。就這些。沒有等待,它也可以處理意見。只有三個主要特點。就這些。不,等等,它也碰巧也有會話管理。你明白了。 – Markasoftware

+1

@Markasoftware不清楚「*請求管理*」是什麼意思。中間件?如果是這樣,那麼大部分是完全選擇加入的。你必須明確地使用()' - 包括'session()'管理。而且,Express不支持觀點;它在視圖引擎上提供了一個輕便的通用包裝。而且,如果你不想使用視圖引擎,那麼不要。你可以'write()'/'end()','send()'或'sendfile()'。 –

回答

1

我也主張使用現成的包來提供靜態內容。我甚至會說你應該使用httpd/ngnix來爲你的靜態內容提供服務。

這就是說,你可以使用path.resolve()。根據您的基地目錄publicfiles/解析請求路徑,並確保結果以publicfiles/作爲前綴。如果沒有,那麼這是一個不好的要求。

+0

感謝您對path.resolve的建議,我已經能夠使其工作。如果你可以提供一些示例代碼和文檔鏈接,那會更好,但這沒問題。謝謝!另外,我不想使用Apache/httpd,因爲我也有一些項目使用節點進行靜態文件服務。 – Markasoftware