2011-04-05 151 views
30

我們有一個網站,可以下載幾個PDF文件。 PDF可能是靜態的,或者是動態生成的。它們使用幾種機制之一(靜態URL,回發/重定向/元刷新/等)下載。對於某些PDF文件,Chrome無需投訴即可下載。對於其他用戶,它會警告用戶「此類文件可能會損害您的計算機,確定要下載...」並需要額外點擊。爲什麼Google Chrome有時會警告下載的PDF可能會損害您的計算機?

Chrome使用什麼信息來決定是否顯示消息?顯然,這不僅僅是文件是PDF的事實。要清楚,我想在服務器端(我們使用IIS/ASP.NET,如果它很重要)做一些事情來防止消息出現。我對每個用戶在其瀏覽器中禁用消息的解決方案都不感興趣(如果甚至可能的話)。

謝謝。

回答

22

TL; DR:Chrome提供了各種用於確定文件的安全客戶端啓發式的。我不相信有任何事情可以做確保文件標記爲「安全」,但我會指出一些可能有所幫助的事情。


大量的邏輯進入確定是否應該顯示該提示。令人高興的是,Chromium是開源的,所以你可以閱讀邏輯。我對下載代碼並不是非常熟悉,但最好的開始的地方肯定是ChromeDownloadManagerDelegate::IsDangerousFile。最終呼籲download_util::GetFileDangerLeveldownload_util::IsExecutableMimeType這似乎是針對MIME類型和路徑生存的檢查。

基於快速閱讀,我可以想象重定向至少是原因的一部分,因爲這些與用戶手勢沒有直接關係。在這種情況下,直接點擊下載比點擊某些內容更「安全」,並且通過各種跟蹤器和調度程序重定向,因爲用戶不能期望跟隨。

啓發式功能還會考慮您之前是否曾訪問特定的URL或域;這也可能對某些顯示爲「安全」的文件產生影響,而其他文件則不會。

+0

我注意到這個消息的一些原因可能是:1)文件名中的空格和2)大寫的擴展名。在我解決了這兩個問題後,警告消失了(針對我的申請)。 – SyntaxRules 2013-10-02 16:03:45

0

我猜測Chrome可能會在動態生成的PDF文件中警告您,儘管不能完全確定。

原因是可以創建PDF以包含可執行代碼,這些代碼可以在打開閱讀器時發生漏洞(緩衝區溢出或某些此類可利用漏洞)時執行。 PDF就像是由工具生成的,其中指定要嵌入的代碼等,這就是我的懷疑來自動態生成的文件導致該消息框的地方。

0

我不知道肯定,但我的猜測是:

  1. 服務器的文件(即「測試/ HTML」,而不是「應用程序/ x-PDF」)返回錯誤的內容類型。一些被黑網站試圖向你發送屏幕消隱(* .scr),告訴你「這是pr0n!立即打開!」。雙擊該文件將在您的計算機上安裝病毒。

  2. PDF包含JavaScript,可能是加密的JavaScript。

3

你可以嘗試content-disposition: inline而不是content-disposition: attachment(見http://code.google.com/p/chromium/issues/detail?id=65895

+0

很好找。它看起來像Chrome 13中的自動打開行爲實際上已經倒退,並且將在Chrome 15中修復:http://crbug.com/92345這隻會影響已設置PDF文件的用戶在某些特定程序中自動打開,但這可能很適合OP的用例。 – 2011-09-18 08:06:27

2

http://productforums.google.com/d/msg/chrome/h0nzjkvxTZU/nciM-x97fEAJ

我設法擺脫它:-)

介紹
在第一次測試中打開控制檯中的PDF。 我也嘗試了一個暫時沒有幫助的超時,但是它第一次給了我一個msg(這個網站試圖下載多個文件,你想允許這個嗎?)。

setTimeout(function(){ /* export */ }, 0); 

解決方案
什麼是對我的工作是直接將其連接到一個點擊事件。

document.getElementById("expButton").addEventListener("click", function() { /* exp.. */ }); 

我猜純JavaScript出口不工作一樣真實事件,也許你可以正常啓動時,首先..我目前不要嘗試。

p.s.我沒有檢查(設置/下載)'在下載之前詢問每個文件的保存位置',但是無論如何它沒有問題。


只是因爲這可能會有所幫助:
我用的ReportViewer,它有一個導出功能。如果我點擊它,它工作正常,但我想出口當我點擊我的自定義DIV:

Sys.Application._components.ReportViewerRoot.exportReport(format) 

我試圖通過控制檯來調用它並沒有在視覺上發生的事情,除非你打開下載頁面(按Ctrl-J ):

pure js invocation

然後,我之前提到的超時嘗試過,但同樣不希望的行爲: pure JS with timeout

然後我試圖將其連接到一個實際的點擊,這實際上導致了以下兩種不同的情況,我無法解釋或進一步調查。

document.getElementById("myDIV").addEventListener(
    "click", 
    function() { 
     Sys.Application._components.ReportViewerRoot.exportReport("PDF"); 
    } 
); 

奇怪 weird

期望 success


我想知道,如果你能實際上事件模擬此。 我試圖做出簡單的JS事件,但它沒有奏效。

+0

我知道這是舊的,但我猜如果有人試圖他們可以輕鬆地去模糊你的圖像,以獲得實際的地址和名稱。 – sricks 2015-04-17 19:51:29

-4

其實,如果你使用這個事件總是會,如果你PROGRAMM一個簡單的鏈接(),您可以避開檢查的情況發生,你可以得到你的自動下載

2

我在Chrome過類似的問題就來了。

我的網站用一些數據填充了一個pdf文檔,並返回該pdf供用戶保存。

返回的頁面生成的PDF文檔作爲附件:

Response.ContentType = "application/pdf"; 
Response.AppendHeader("Content-Disposition", "attachment; filename=" + aOutputFileName); 
Response.TransmitFile(aFilePath); 
Response.End(); 

目標= 「_空白」屬性中定義的鏈接,該PDF下載:

<a href="CreatePdf.aspx" target="_blank">Your pdf</a> 

卸下目標屬性從鏈接中也刪除了用戶點擊該鏈接時的警告。

+0

刪除'target =「_ blank」'實際上解決了我的問題:) – 2013-11-05 01:56:58

相關問題