2012-04-05 8 views
2

Ich habe kürzlich damit begonnen, ein Bookmarklet zu erstellen, das die EXIF-Daten jedes Bildes auf einer Website anzeigt. Ich entschied mich für Nihilogics binary.js and exif.js Bibliotheken. Bei Bildern, die in derselben Domäne wie die übergeordnete Seite gehostet werden, funktioniert das Skript wunderbar. Aber da XHR zum Lesen der Binärdaten von Bildern verwendet wird und weil XHR auf Anfragen mit demselben Ursprung beschränkt ist, kann ich nicht auf die binären Daten von Cross-Site-gehosteten Bildern zugreifen.Lesen von EXIF-Daten von img in JavaScript (domänenübergreifend)

Gibt es eine Möglichkeit, die Binärdaten eines Bildes lokal (oder zumindest ohne XHR) zu laden, die EXIF-Daten erhalten?

Ich habe ein paar andere Richtungen erforscht, aber ich fürchte, dass ich, um zu bestimmen sie nicht gut genug, um zu verstehen, ob es eine Lösung gibt:

  • JSONP - Ich gehe davon aus keine Möglichkeit, es gibt binär zu bekommen Daten in eines dieser Dinge.
  • canvas tags - diese scheinen sehr unterschiedliche base64-Kodierungen zu erzeugen, was PHP tut, und ich vermute, dass die EXIF-Daten in der neuen Kodierung nicht mehr existieren.

Antwort

4

Javascript kann spezielle Operationen (wie auf der Leinwand) mit Bildern mit gleichem Ursprung und Cors-fähigen Bildern ausführen, da der Browser sicher davon ausgehen kann, dass diese in Ordnung auf den Server hochgeladen werden können. Aber dann wird es kompliziert ...

Ich kann nicht auf die Binärdaten von Cross-Site-gehostet Bilder zugreifen.

Ja, im Allgemeinen ist es sehr wichtig, dass Sie nicht können. Genauer gesagt, Sie können nicht mit einem Bookmarklet tun, was Sie wollen.

Sie können dies mit einer Leinwand nicht tun, weil die cors hier Regeln streng sind (for good reasons!)

Kurz gesagt, die Argumentation in der Regel ist so ziemlich genau das gleiche. Browser sind in einer einzigartigen Sicherheitsposition: Eine zufällige Seite im Internet kann Ihnen Dinge zeigen, die für Sie privat sind, wie das hypothetische Bild C: \ MyPhotos \ privateImage1.jpg, vorausgesetzt, dass es diesen Dateipfad erraten könnte.

Aber diese Webseite ist sicherlich nicht erlaubt, tun nichts mit dieser Datei außer Ihnen zu zeigen. Es kann die binäre Information (EXIF-Information oder Pixelinformation) nicht lesen. JavaScript ist nicht erlaubt zu wissen, wie das Bild aussieht oder fast alle Daten damit verbunden ist.

Wenn es in der Lage wäre, herauszufinden, eine zufällige Webseite wäre in der Lage, eine Reihe von Dateipfaden zu versuchen und vielleicht ein Bild auf Ihrer Festplatte zu finden, und dann die Binärdaten dieses Bildes auf einen Server hochladen, in der Tat stehlen Sie Ihr privates Bild.


Eine Browser-Erweiterung wäre für diese Aufgabe weitaus besser geeignet als ein (JavaScript) Bookmarklet.

+0

Aha! Ich kenne sicherlich die Risiken von XHR-Einschränkungen, aber ich hatte nicht an die lokalen Fotodaten Beispiele gedacht.Es macht durchaus Sinn, dass Bilder auch geschlossene Boxen sind. Ein bisschen enttäuschend, dass ich nicht erreichen kann, was ich als Bookmarklet war. –

0

Rein vom Kunden? Ich bezweifle das. Wie wäre es mit einem lokalen PHP-Skript, das so etwas wie exif_imagetype() ausführt? Diese Funktion funktioniert sowohl auf Remote als auch auf Bildern.