【问题标题】:Why does Google Chrome sometimes warn that a downloaded PDF can harm your computer?为什么谷歌浏览器有时会警告下载的 PDF 会损害您的计算机?
【发布时间】:2011-04-05 14:31:03
【问题描述】:

我们有一个网站,可以下载多个 PDF。 PDF 可能是静态的,也可能是动态生成的。它们是使用几种机制之一下载的(静态 URL、回发/重定向/元刷新/等)。对于某些 PDF 文件,Chrome 会毫无怨言地下载它们。对于其他人,它会警告用户“这种类型的文件可能会损害您的计算机。您确定要下载...”并且需要额外点击。

Chrome 使用什么信息来决定是否显示消息?显然,这不仅仅是文件是 PDF 的事实。

明确地说,我想在服务器端做一些事情(如果重要的话,我们使用 IIS/ASP.NET)来防止消息出现。我对让每个用户在浏览器中禁用消息的解决方案不感兴趣(如果可能的话)。

谢谢。

【问题讨论】:

    标签: google-chrome


    【解决方案1】:

    TL;DR:Chrome 具有多种用于确定文件安全性的客户端启发式方法。我不相信您可以做任何事情来确保文件被标记为“安全”,但我会指出一些可能会有所帮助的事情。


    大量的逻辑用于确定是否应显示该提示。令人高兴的是,Chromium 是开源的,因此您可以使用该逻辑。我对下载代码并不是非常熟悉,但最好的起点几乎肯定是ChromeDownloadManagerDelegate::IsDangerousFile。这最终会调用 download_util::GetFileDangerLeveldownload_util::IsExecutableMimeType,这似乎是对 mime 类型和路径进行检查的地方。

    根据快速阅读,我认为重定向至少是部分原因,因为它们与用户手势没有直接关系。在这种情况下,直接点击下载比点击某些东西“更安全”,并通过各种跟踪器和调度程序重定向,因为不能期望用户跟随。

    启发式算法还会考虑您之前是否访问过特定的 URL 或域;这也可能对某些显示为“安全”的文件产生影响,而其他文件则不是。

    【讨论】:

    • 我注意到此消息的某些原因可能是:1)文件名中的空格和 2)大写的扩展名。在我解决了这两个问题之后,警告就消失了(对于我的应用程序)。
    【解决方案2】:

    您可以尝试content-disposition: inline 而不是content-disposition: attachment(请参阅http://code.google.com/p/chromium/issues/detail?id=65895

    【讨论】:

    • 很好的发现。看起来自动打开行为实际上在 Chrome 13 中回归,并将在 Chrome 15 中修复:crbug.com/92345 这只会影响已将 PDF 文件设置为在某些特定程序中自动打开的用户,但这可能很适合 OP用例。
    【解决方案3】:

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

    我设法摆脱它:-)

    简介
    首先测试在控制台中打开 PDF。 我也尝试了超时,但它没有帮助,但它确实第一次给了我一个消息(这个站点正在尝试下载多个文件。你想允许这个吗?)。

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

    解决方案
    对我有用的是直接将其附加到点击事件。

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

    我想纯 javascript 导出与实际事件的工作方式不同,也许你可以先正确启动一个事件。我目前不尝试。

    附言我没有检查(设置/下载)“在下载前询问每个文件的保存位置”,但无论哪种方式都可以。


    仅仅因为这可能会有所帮助:
    我使用了 ReportViewer,它具有导出功能。如果我点击它,它工作正常,但是当我点击我的自定义 DIV 时我想导出:

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

    我尝试通过控制台调用它,但视觉上没有任何反应,除非您打开下载页面 (Ctrl-J):

    然后我尝试了前面提到的超时,但又出现了不希望的行为:

    然后我尝试将其附加到实际点击中,这实际上导致了以下两种不同的情况,我无法解释或将进一步调查。

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

    很奇怪

    希望


    我想知道你是否真的可以用事件来模拟这个。 我尝试过制作简单的 JS 事件,但没有成功。

    【讨论】:

    • 我知道这是旧的,但我猜如果有人尝试过,他们可以轻松地对您的图像进行去模糊处理以获得实际的地址和名称。
    【解决方案4】:

    我在 Chrome 中遇到了类似的问题。

    我的网站用一些数据填充了一个 pdf 文档并返回该 pdf 供用户保存。

    页面将生成的pdf文档作为附件返回:

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

    pdf 下载链接定义了 target="_blank" 属性:

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

    从链接中删除 target 属性也会删除用户点击该链接时的警告。

    【讨论】:

      【解决方案5】:

      我猜 Chrome 可能会在动态生成的 PDF 上警告您,虽然不完全确定。

      这样做的原因是,可以创建 PDF 以包含可执行代码,当打开它的阅读器中存在漏洞(缓冲区溢出或某些此类可利用漏洞)时,可执行代码可以执行。类似的 PDF 是由工具生成的,您可以在其中指定要嵌入的代码等,这就是我怀疑动态生成的文件导致该消息框的原因。

      【讨论】:

        【解决方案6】:

        我不确定,但我的猜测是:

        1. 服务器返回错误的文件内容类型(即“test/html”而不是“application/x-pdf”)。一些被黑网站试图向您发送屏幕空白 (*.scr) 告诉您“这是 pr0n!立即打开它!”。双击该文件会在您的计算机上安装病毒。

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

        【讨论】:

          【解决方案7】:

          实际上,如果您使用事件,如果您编写一个简单的链接 (),则总是会发生这种情况,您可以避免该检查,您可以获得自动下载

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-11-10
            • 2011-09-10
            • 2014-08-15
            • 1970-01-01
            • 1970-01-01
            • 2016-01-17
            • 2017-08-29
            • 2014-06-17
            相关资源
            最近更新 更多