2017-10-06 71 views
0

我有一個表單,允許用戶使用的文件類型的輸入選擇一個文件:我需要清理的輸入文件標記創建ruby文件路徑

<input type="file" name="file" id="file" style="display: none;" multiple> 

當表單發送它張貼這些參數:

"file"=> 
    #<ActionDispatch::Http::UploadedFile:0x00000003e44cd0 
    @content_type="application/octet-stream", 
    @headers="Content-Disposition: form-data; name=\"file\"; filename=\"invalid-test\"\r\nContent-Type: application/octet-stream\r\n", 
    @original_filename="invalid-test", 
    @tempfile=#<File:/tmp/RackMultipart20171006-26097-17004vm>> 

我的程序然後複製臨時文件並在應用程序中的文件夾中創建一個副本。複製的文件被格式化以供其他進程使用。這個處理一切正常。這樣做的代碼如下

# The @myfile filename (excluding the path) has been sanitised earlier in the process. 
temporary_file = params[:file].tempfile.path 
input_file  = Rails.root.to_s + "/some_path/" + @myfile.filename 
FileUtils.cp temporary_file, input_file 

已經針對它運行的舉報,其中多達我已經使用了@ tempfile.path作爲安全風險的所有地方的應用司閘員掃描。我已經閱讀了關於在導軌導向的風險:

http://guides.rubyonrails.org/security.html#redirection-and-files

哪個說的文件名應進行消毒。根據指南,我正在使用@original_filename上的sanitiser來確保它是安全的。我認爲我不需要爲這條道路做任何事情。文件params不指定路徑,只指定文件名或路徑和文件名。我可以使用創建路徑和文件名

params[:file].tempfile.path - params[:file].tempfile.original_filename 

使用計算加上清理過的文件名創建文件和路徑名稱。

我不相信這是一個問題,因爲應用程序只是簡單地獲取臨時文件並複製副本。所有未來的處理都在該文件上完成。它使用的文件名將被清理,路徑由應用程序設置以供將來處理。最糟糕的情況是我的流程複製了錯誤的文件。

簡而言之,我是否需要擔心試圖淨化路徑以及文件名?

回答

1

不,您不需要清理路徑。當瀏覽器使用文件輸入標籤提交表單時,它將觸發一個如下所示的多部分表單請求:https://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2

請注意,多部分數據僅指定filename

Web服務器只接收來自該文件的多部分形式POST請求的文件名。臨時文件保存到的路徑可通過服務器或語言配置進行配置。消毒文件名是所有需要它是用戶輸入。

+0

感謝您澄清這一點和鏈接迭戈。我有點懷疑這將是一個沒有。 –