2011-04-05 4 views
30

Tenemos un sitio web que permite descargar varios archivos PDF. Los archivos PDF pueden ser estáticos o generados dinámicamente. Se descargan usando uno de varios mecanismos (static-URL, postback/redirect/meta-refresh/etc.). Para ciertos archivos PDF, Chrome los descarga sin quejarse. Para otros, advierte al usuario que "Este tipo de archivo puede dañar su computadora. ¿Está seguro de que desea descargar ...?" Y requiere un clic adicional.¿Por qué Google Chrome algunas veces advierte que un PDF descargado puede dañar su computadora?

¿Qué información utiliza Chrome para decidir si mostrar el mensaje? Obviamente, no es simplemente el hecho de que el archivo es un PDF.

Para ser claro, quiero hacer algo en el lado del servidor (utilizamos IIS/ASP.NET, si es que importa) para evitar que el mensaje aparezca. No estoy interesado en una solución que haga que cada usuario desactive el mensaje en su navegador (si eso es posible).

Gracias.

Respuesta

22

TL; DR: Chrome tiene una variedad de heurística del lado del cliente que se utilizan para determinar la seguridad de un archivo. No creo que haya nada que pueda hacer para asegurar que un archivo está marcado como "seguro", pero señalaré algunas cosas que podrían ayudar.


Una buena cantidad de la lógica entra en la determinación de si o no que símbolo debe ser mostrado. Afortunadamente, Chromium es de código abierto, por lo que la lógica está disponible para que puedas leer detenidamente. No estoy muy familiarizado con el código de descarga, pero el mejor lugar para comenzar sería casi seguro ChromeDownloadManagerDelegate::IsDangerousFile. Eso termina llamando a download_util::GetFileDangerLevel y download_util::IsExecutableMimeType que parecen ser donde viven las comprobaciones contra los tipos de mimo y las rutas.

Basado en una lectura rápida, me imagino que los redireccionamientos son al menos parte de la causa, ya que no están directamente relacionados con un gesto del usuario. Hacer clic directamente en la descarga es "más seguro" en este contexto que hacer clic en algo, y ser redireccionado a través de una variedad de rastreadores y despachadores, ya que no se puede esperar que el usuario siga la conversación.

La heurística también tiene en cuenta si has estado en una URL o dominio en particular anteriormente; eso también podría tener un impacto en ciertos archivos que aparecen como "seguros" y otros no.

+0

He notado que algunas razones para este mensaje pueden ser: 1) espacios en los nombres de los archivos y 2) la extensión que se escribe en mayúscula. Después de solucionar esos dos problemas, la advertencia desapareció (para mi aplicación). – SyntaxRules

0

Supongo que es probable que Chrome le advierta sobre los PDF generados dinámicamente, aunque no del todo seguro.

La razón de esto es que los PDF pueden crearse para contener código ejecutable que se puede ejecutar cuando hay un agujero (desbordamiento del búfer o algún agujero explotable) en el lector que lo abre. Los archivos PDF así son generados por herramientas, donde se especifica qué código insertar, etc., y de ahí proviene mi sospecha de que los archivos generados dinámicamente están causando ese cuadro de mensaje.

0

No sé con seguridad, pero mis conjeturas son:

  1. El servidor devuelve el tipo de contenido incorrecto para el archivo (es decir, "prueba/html" en lugar de "application/x-pdf") . Algunos sitios pirateados intentan enviarte separadores de pantalla (* .scr) diciéndote "¡esto está abierto! ¡Ábrelo ahora mismo!". Al hacer doble clic en el archivo se instalará un virus en su computadora.

  2. Los archivos PDF contienen JavaScript, posiblemente JavaScript encriptado.

3

Usted podría intentar content-disposition: inline en lugar de content-disposition: attachment (ver http://code.google.com/p/chromium/issues/detail?id=65895)

+0

Buen descubrimiento. Parece que el comportamiento de apertura automática realmente retrocedió en Chrome 13, y se solucionará en Chrome 15: http://crbug.com/92345 Esto solo afecta a los usuarios que han configurado archivos PDF para que se abran automáticamente en algún programa específico, pero eso bien podría adaptarse al caso de uso del OP. –

2

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

me las arreglé para deshacerse de él :-)

Intro
En probó por primera vez abrir el PDF en la consola. También probé un tiempo de espera que no ayudó, pero me dio un mensaje la primera vez (Este sitio está intentando descargar varios archivos. ¿Desea permitir esto?).

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

Solución
lo que funciona para mí consiste en conectar directamente a un evento de clic.

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

supongo exportaciones puro JavaScript no funcionan igual que los eventos reales, tal vez se podría iniciar correctamente un evento, primero .. No estoy actualmente a intentarlo.

p.s. NO he verificado (configuraciones/descargas) 'Preguntar dónde guardar cada archivo antes de descargar', pero de cualquier manera está bien.


El hecho de que esto podría ser útil:
Solía ​​ReportViewer y tenía una función de exportación. Si hago clic en él trabaja muy bien, pero yo quería exportar cuando hace clic en mi costumbre DIV:

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

traté de invocar a través de la consola y no pasaba nada visualmente, a menos que abra la página de descargas (Ctrl-J):

pure js invocation

Luego he probado con el tiempo de espera antes mencionado, pero el comportamiento no deseado de nuevo: pure JS with timeout

Luego trató de adjuntarlo a un clic real, que en realidad resultó en las siguientes 2 situaciones diferentes, que no puedo explicar o investigaré más a fondo.

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

extraño weird

Deseada success


Y me pregunto si en realidad se podría simular esto con los eventos. He intentado hacer el evento JS simple, pero no funcionó.

+0

Sé que esto es viejo, pero supongo que si alguien lo intenta, podrían fácilmente difuminar sus imágenes para obtener las direcciones y los nombres reales. – sricks

-4

En realidad, si usted utiliza eventos este siempre va a pasar si Programm un enlace sencillo() se puede evitar que el registro y se puede obtener su descarga automática

2

me encontré con un problema similar en Chrome.

Mi sitio llenó un documento pdf con algunos datos y devolvió ese pdf para que el usuario lo guardara.

la página devuelta al documento pdf generado como un archivo adjunto:

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

El enlace para la descarga pdf había un target = "_ blank" atributo definido:

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

Extracción de la el atributo de destino del enlace también eliminó la advertencia cuando los usuarios hicieron clic en dicho enlace.

+0

Eliminar el 'target =" _ blank "' en realidad resolvió mi problema :) –

Cuestiones relacionadas