Подтвердить что ты не робот

Почему Google Chrome иногда предупреждает, что загруженный PDF может нанести вред вашему компьютеру?

У нас есть веб-сайт, который позволяет загружать несколько PDF файлов. PDF файлы могут быть статическими или динамически генерироваться. Они загружаются с использованием одного из нескольких механизмов (static-URL, post back/redirect/meta-refresh/etc.). Для некоторых PDF файлов Chrome загружает их без жалоб. Для других он предупреждает пользователя, что "этот тип файла может нанести вред вашему компьютеру. Вы действительно хотите скачать..." и требует дополнительного щелчка.

Какую информацию использует Chrome, чтобы решить, показывать ли сообщение? Очевидно, это не просто факт, что файл является PDF.

Чтобы быть ясным, я хочу сделать что-то на стороне сервера (мы используем IIS/ASP.NET, если это имеет значение), чтобы предотвратить появление сообщения. Меня не интересует решение, в котором каждый пользователь отключает сообщение в своем браузере (если это возможно).

Спасибо.

4b9b3361

Ответ 1

TL; DR: Chrome имеет множество эвристик на стороне клиента, используемых для определения безопасности файлов. Я не верю в то, что вы можете сделать, чтобы файл был помечен как "безопасный", но я укажу на некоторые вещи, которые могут помочь.


Хорошая логика переходит в определение того, следует ли показывать это приглашение. К счастью, Chromium является открытым исходным кодом, так что логика доступна для вас. Я не очень-то знаком с кодом загрузки, но лучшим местом для начала почти наверняка будет ChromeDownloadManagerDelegate:: IsDangerousFile. Это заканчивается тем, что вызывается download_util:: GetFileDangerLevel и download_util:: IsExecutableMimeType, которые, как представляется, содержат проверки против типов и путей mime.

Основываясь на быстром чтении, я бы предположил, что перенаправления, по крайней мере, являются частью причины, поскольку они напрямую не связаны с жестом пользователя. Нажатие непосредственно на загрузку является "более безопасным" в этом контексте, чем щелчок на чем-то, и перенаправление с помощью различных трекеров и диспетчеров, поскольку пользователь не может ожидать, что последует.

Эвристика также учитывает, были ли вы до определенного URL или домена раньше; что также может повлиять на определенные файлы, которые отображаются как "безопасные", а другие нет.

Ответ 3

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

Мне удалось избавиться от него: -)

Введение
Сначала было проверено открытие PDF файла в консоли. Я также пробовал тайм-аут, который не помог, но он дал мне сообщение в первый раз (этот сайт пытается загрузить несколько файлов. Вы хотите разрешить это?).

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 weird

Желаемая success


И мне интересно, сможете ли вы реально имитировать это с помощью событий. Я попытался сделать простое событие 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

Я не знаю точно, но мои догадки:

  • Сервер возвращает неверный тип содержимого для файла (т.е. "test/html" вместо "application/x-pdf" ). Некоторые взломанные сайты пытаются отправить вам экранные бланки (*.scr), говорящие вам: "Это pr0n! Откройте его прямо сейчас!". Двойной щелчок по файлу будет устанавливать вирус на вашем компьютере.

  • PDF файлы содержат JavaScript, возможно, зашифрованный JavaScript.

Ответ 7

На самом деле, если вы используете события, это всегда произойдет, если вы программируете простую ссылку(), вы можете избежать этой проверки, и вы можете получить свою автоматическую загрузку