2013-01-22 65 views
6

在節點中有很多關於文件上傳的文章,教程和問題,但主要是針對初學者,並且他們中沒有一個完全解釋瞭如何保護生產文件上傳。 我已經很努力地找到一個完整的答案,如何做到這一點,但它沒有成功。如何使用Express在Node中安全地上傳文件?

下面是我的發現的解釋。在上傳

  1. 限制文件大小:

    app.use(express.limit('4mb')); 
    
  2. 限制文件上傳到只有特定的路線: 我不能讓這種實際工作,但這裏是我曾嘗試:

    替換:

    app.use(express.bodyParser()); 
    

    app.use(express.json()); 
    app.use(express.urlencoded()); 
    

    和多中間件添加到每個上傳路線:

    app.post('/upload', express.multipart(), uploadController.uploadPhoto); 
    

    這部分不工作,但如果我離開express.bodyParser()上傳工作正常。那麼我做錯了什麼?

  3. 檢查上傳的文件類型上傳保存到磁盤之前:

    我想不出這部分,但是一個建議是,編寫使用強大的解析文件上傳自定義的中間件,並試圖調整文件之前它被保存(假設它是一個圖像)使用圖像魔法庫。建議這樣做會使圖像安全並確保它實際上是一個圖像(因爲如果圖像不是圖像,該過程會失敗)。

    這隻適用於圖像,所以它不是一個完整的解決方案。

    我該如何執行此操作?任何示例代碼?

還有什麼我缺少的上傳是安全的嗎?

+0

3將要走的路,假設2不工作。如果是這樣,那將是理想的解決方案。 –

+0

從我讀的2應該工作,我做錯了什麼?你也有任何如何做3的例子嗎?我試圖做到這一點,但沒有成功。我發現的大部分代碼都無法與新版本的快遞 –

+0

一起使用請問您可以使用2創建最小的項目,並可能在github上共享代碼。我會看看它。如果它不起作用,我會爲你建立3並分享。 –

回答

2

方法2實際工作。我遇到的問題是,

app.use(passport.session()); 

正在阻止它的工作。因此,如果您使用passport.js進行身份驗證,則可能是此問題。如果您使用這種方法,請確保在實際路線上添加安全性。


最後我使用這個插件

https://github.com/tih-ra/alleup

偉大的工程與圖片上傳,並自動將文件調整大小以多個版本,並上載他們到Amazon S3。使用此插件將與使用方法3一起內嵌,但文件首先會上載到tmp文件夾中,然後再刪除。

+0

我以爲你原來的問題是關於保護文件上傳的路徑。例如,假設某人發佈了一個文件附加到路徑'/ restricted-path'的多部分表單,那麼你會怎麼做? –

+0

以及該插件使用強大的處理文件上傳和工作表達多部分不應該使用,因此上傳不能張貼到任何路線。我有另一個問題,雖然passport.session()停止從觸發文件事件強大http://stackoverflow.com/questions/14479343/in-node-js-why-does-passport-session-stop-formidable-from-triggering - 文件 - 甚至所以我要麼解決這個問題,要麼弄清楚如何做數字2. –

+0

好吧,所以我想出了app.use(passport.session())是什麼使2號不起作用。我認爲這是與passport.session()相關的事情,需要在multipart之後調用,而不是之前。我仍然不確定如何通過路線基地 –

1

我正在使用multiparty上傳(和流式傳輸)文件。

var form = new multiparty.Form();

爲1:

form.on('progress', function (bytesReceived) { 
    if (262144000 < bytesReceived) { 
    abortConnection('filesizeexeeded'); 
    } 
}); 

實現自己的中止連接功能;例如: -

function abortConnection(reason) { 
    res.writeHead(413, { 'Connection': 'close' }); 
    return res.end(reason); 
} 

警告:瀏覽器將最有可能重試上傳(最多4次)。我正在使用websocket連接取消客戶端的上傳。

至2:(使用多方)

至3:我創建了一個gist,說明如何檢查使用mmmagic運行中的MIME類型。

如果您在與多方聯合使用的護照,你可能會發現這個有用:

https://github.com/jaredhanson/passport/pull/106#issuecomment-14188999

+0

似乎很好,但如何在使用multipaty時獲得文件流?很久以前我有這個問題,但我仍然無法找到答案。 –