Почему Google Chrome иногда предупреждает, что загруженный PDF может нанести вред вашему компьютеру?
У нас есть веб-сайт, который позволяет загружать несколько PDF файлов. PDF файлы могут быть статическими или динамически генерироваться. Они загружаются с использованием одного из нескольких механизмов (static-URL, post back/redirect/meta-refresh/etc.). Для некоторых PDF файлов Chrome загружает их без жалоб. Для других он предупреждает пользователя, что "этот тип файла может нанести вред вашему компьютеру. Вы действительно хотите скачать..." и требует дополнительного щелчка.
Какую информацию использует Chrome, чтобы решить, показывать ли сообщение? Очевидно, это не просто факт, что файл является PDF.
Чтобы быть ясным, я хочу сделать что-то на стороне сервера (мы используем IIS/ASP.NET, если это имеет значение), чтобы предотвратить появление сообщения. Меня не интересует решение, в котором каждый пользователь отключает сообщение в своем браузере (если это возможно).
Спасибо.
Ответы
Ответ 1
TL; DR: Chrome имеет множество эвристик на стороне клиента, используемых для определения безопасности файлов. Я не верю в то, что вы можете сделать, чтобы файл был помечен как "безопасный", но я укажу на некоторые вещи, которые могут помочь.
Хорошая логика переходит в определение того, следует ли показывать это приглашение. К счастью, Chromium является открытым исходным кодом, так что логика доступна для вас. Я не очень-то знаком с кодом загрузки, но лучшим местом для начала почти наверняка будет ChromeDownloadManagerDelegate:: IsDangerousFile. Это заканчивается тем, что вызывается download_util:: GetFileDangerLevel и download_util:: IsExecutableMimeType, которые, как представляется, содержат проверки против типов и путей mime.
Основываясь на быстром чтении, я бы предположил, что перенаправления, по крайней мере, являются частью причины, поскольку они напрямую не связаны с жестом пользователя. Нажатие непосредственно на загрузку является "более безопасным" в этом контексте, чем щелчок на чем-то, и перенаправление с помощью различных трекеров и диспетчеров, поскольку пользователь не может ожидать, что последует.
Эвристика также учитывает, были ли вы до определенного URL или домена раньше; что также может повлиять на определенные файлы, которые отображаются как "безопасные", а другие нет.
Ответ 2
Вы можете попробовать content-disposition: inline
вместо content-disposition: attachment
(см. http://code.google.com/p/chromium/issues/detail?id=65895)
Ответ 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
На самом деле, если вы используете события, это всегда произойдет, если вы программируете простую ссылку(), вы можете избежать этой проверки, и вы можете получить свою автоматическую загрузку