30 votes

Pourquoi Google Chrome avertit-il parfois qu'un PDF téléchargé peut endommager votre ordinateur?

Nous avons un site web qui permet de faire plusieurs fichiers Pdf à télécharger. Les fichiers Pdf peuvent être statiques ou générés dynamiquement. Ils sont téléchargés à l'aide de plusieurs mécanismes (statique-URL, post arrière/redirect/meta-refresh/etc.). Pour certains fichiers PDF, Chrome télécharge sans plainte. Pour d'autres, il avertit l'utilisateur que "Ce type de fichier peut endommager votre ordinateur. Êtes-vous sûr que vous voulez télécharger ..." et exige un supplément de clic.

Quelles sont les informations Chrome à l'aide de décider si l'on doit afficher le message? Évidemment, ce n'est pas simplement le fait que le fichier est un PDF.

Pour être clair, je veux faire quelque chose sur le côté serveur (nous utilisons IIS/ASP.NET, si c'est important) pour empêcher le message d'impression. Je ne suis pas intéressé par une solution qui a chaque utilisateur de désactiver le message dans leur navigateur (si c'est encore possible).

Je vous remercie.

22voto

Mike West Points 3124

TL;DR: google Chrome dispose d'une variété de méthodes heuristiques utilisées pour déterminer un fichier de sécurité. Je ne crois pas qu'il n'y a rien que vous pouvez faire pour s'assurer qu'un fichier est marqué comme "sûr", mais je vais le point sur certaines choses qui pourraient vous aider.


Une bonne quantité de la logique va dans la détermination de si oui ou non qui invite doit être indiqué. Heureusement, le Chrome est open source, de sorte que la logique est disponible pour vous de parcourir. Je ne suis pas incroyablement familier avec le code de téléchargement, mais le meilleur endroit pour commencer serait presque certainement être ChromeDownloadManagerDelegate::IsDangerousFile. Qui finit par appeler à l' download_util::GetFileDangerLevel et download_util::IsExecutableMimeType qui semblent être des endroits où les vérifications sur les types mime et les chemins d'accès direct.

Basé sur une lecture rapide, j'imagine que les redirections sont au moins une partie de la cause, que ceux qui ne sont pas directement liées à une action de l'utilisateur. En cliquant directement sur le téléchargement est "plus sûr" dans ce contexte que de cliquer sur quelque chose, et en étant redirigé à travers une variété d'outils de suivi et des répartiteurs, en tant que l'utilisateur ne peut pas s'attendre à suivre.

L'heuristique prend également en compte le fait que vous avez été à une URL spécifique ou un domaine avant; ce qui pourrait avoir un impact sur certains fichiers apparition comme "sûr" et d'autres pas.

3voto

gpothier Points 322

Vous pouvez essayer content-disposition: inline au lieu de content-disposition: attachment (voir http://code.google.com/p/chromium/issues/detail?id=65895 )

2voto

EricG Points 1723

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

J'ai réussi à me débarrasser de lui :-)

Intro
Au premier abord testé l'ouverture du fichier PDF dans la Console. J'ai aussi essayé un délai d'attente qui n'a pas aider, mais elle m'a donné un msg la 1ère fois (Ce site est d'essayer de télécharger plusieurs fichiers. Voulez-vous cela?).

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

Solution
Ce qui fonctionne pour moi est de directement de l'attacher à un événement de clic.

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

Je suppose que javascript et les exportations ne sont pas les mêmes que les événements réels, peut-être vous pourriez lancer correctement un événement, tout d'abord.. je suis en train de ne pas essayer.

p.s. Je n'ai PAS vérifié (paramètres/downloads) Demander où enregistrer chaque fichier avant de le télécharger', mais de toute façon il va bien.


Tout simplement parce que cela pourrait être utile:
J'ai utilisé ReportViewer et il avait une fonction d'exportation. Si je clique dessus, il fonctionne très bien, mais j'ai voulu exporter quand j'ai cliqué sur mon custom DIV:

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

J'ai essayé de l'appeler via la console et rien n'a été visuellement passe, sauf si vous ouvrez la page des téléchargements (Ctrl-J):

pure js invocation

Ensuite, j'ai essayé avec le délai d'attente avant mentionnés, mais encore une fois les comportements indésirables: pure JS with timeout

Ensuite, j'ai essayé de l'attacher à un clic, ce qui en fait entraîné dans les 2 situations différentes, que je ne peux pas l'expliquer ou de le étudierons plus loin.

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

Bizarre weird

Désiré success


Et je me demandais si on pouvait simuler ce avec les événements. J'ai essayé de faire simple JS événement, mais il ne fonctionne pas.

2voto

Marko Points 31

J'ai rencontré un problème similaire dans Chrome.

Mon site a rempli un document pdf avec quelques données et a renvoyé ce pdf pour que l'utilisateur l'enregistre.

La page a renvoyé le document pdf généré en pièce jointe:

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

Le lien pour le téléchargement du pdf avait un attribut target = "_ blank" défini:

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

La suppression de l'attribut cible du lien a également supprimé l'avertissement lorsque les utilisateurs ont cliqué sur ledit lien.

0voto

Tony The Lion Points 28208

Je suppose que Chrome est probablement avertissement vous sur le générées dynamiquement les fichiers PDF, bien que pas tout à fait sûr.

La raison en est que les fichiers PDF peuvent être créés à contenir du code exécutable qui peut être exécuté quand il y a un trou (débordement de tampon ou de certaines de ces exploitable trou) dans le lecteur de l'ouvrir. Les fichiers PDF sont générés par les outils, où vous spécifiez ce code pour intégrer etc, et c'est là mon soupçon vient du fait que l'dynamiquement les fichiers générés sont à l'origine de ce message.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X