Archiv ‘Web’

Freitag, 23. März 2018

AJAX-Requests auf ein Ziel mit einer anderen (Sub-)Domain

Kürzlich wollte ich mein Web-Projekt B eine AJAX-Schnittstelle von meinem Web-Projekt A ansprechen lassen, las in der Browser-Konsole aber folgende Fehlermeldung:

Quellübergreifende (Cross-Origin) Anfrage blockiert: Die Gleiche-Quelle-Regel verbietet das Lesen der externen Ressource auf https://domain.tld/ajax/stockquote/US0378331005. (Grund: CORS-Kopfzeile ‚Access-Control-Allow-Origin‘ fehlt).

Ich musste den PHP-Code in Web-Projekt A (d.h. dem Ziel) anpassen und dort im Header des AJAX-Scripts folgenden Parameter mitgeben:

...
header('Access-Control-Allow-Origin: https://projekt-b.domain.tld');
...

Tags: , , , , ,
Labels: Web

Keine Kommentare | neuen Kommentar verfassen

Mittwoch, 21. März 2018

YouTube und Vimeo Embed-Code auf meine Blog Artikel-Breite anpassen

YouTube

Seit YouTube die Möglichkeit nicht mehr offeriert, die gewünschte Breite oder Höhe von Videos im Embed-Code für Videos einzugeben, muss ich immer selber nachrechnen:

Der Embed-Code verwendet standardmässig 560 Pixel Breite und 315 Pixel Höhe.

Da die Artikel in meinem Blog nur 400 Pixel breit sind, muss ich den HTML-Code jedes Mal wie folgt anpassen: 400 Pixel Breite und 225 Pixel Höhe.

Vimeo

Bei Vimeo ist es ähnlich, die Dimensionen sind hier 640 Pixel Breite und 360 Pixel Höhe.

Für das Einfügen in meinen Blog muss ich die Dimensionen auf 400 Pixel Breite und 225 Pixel Höhe ändern.

Tags: , , ,
Labels: Web

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 11. März 2018

Ob die Post-Webmaster das reCAPTCHA-Upgrade hinkriegen?

Als ich Ende Februar einige versteigerte Artikel per Paketpost versendet habe und dafür über die Web-Site der Post die Tracking-Mitteilungen per E-Mail abonnieren wollte, grüssten mich anstelle der gewohnten Strassenschilder von reCAPTCHA, die vom menschlichen OCR entziffert werden müssen, einige Male folgende Fehlermeldung:

Ob die Post das Problem mittlerweile selber erkannt hat, weiss ich nicht. Zu aller Sicherheit halber habe ich aber soeben eine Twitter-Mitteilung an das Social Media-Team dort abgesetzt, damit sie es intern eskalieren können.

Mal schauen, ob die Meldung bis Monatsende den Weg durch die OEs des Unternehmens findet … sind wir gespannt!

Labels: Web

Keine Kommentare | neuen Kommentar verfassen

Samstag, 25. November 2017

Session Replay-Sites auf DNS-Ebene blocken

Vor ein paar Tagen publizierten Sicherheits-Forscher eine Untersuchung (deutsch) über eine Vielzahl von Web-Analyse-Services, welche jede Benutzereingabe auf einer Web-Site abfangen und an den Analyse-Server senden. Sozusagen ein web-site-spezifisches Keylogging.

Gefällt mir ganz und gar nicht.

Die Forscher stellten auch eine Datenbank ins Netz, welche auflistet, welche grössere Web-Site konkret welche Lösung im Einsatz haben.

Da ich seit einer Weile im internen Netzwerk bereits Ad-Sites auf DNS-Ebene blocke (mit der Folge, dass ich im Browser keine SPIEGEL-Artikel mehr lesen kann — Instapaper als funktionierender Workaround), habe ich die von den Forschern entdeckten Services zur offiziellen Block-Liste hinzugefügt.

Hier meine Konfiguration:

// Session Replay Prevention
// https://webtransparency.cs.princeton.edu/no_boundaries/session_replay_sites.html

// Already blocked by http://pgl.yoyo.org/adservers/:
// mouseflow.com
// hotjar.com
// userreplay.net

// Specific subdomains used by some sites investigated
//zone "cdnssl.clicktale.net" { type master; notify no; file "/etc/bind/zones/null.dns"; };
//zone "cdn.clicktale.net" { type master; notify no; file "/etc/bind/zones/null.dns"; };
//zone "cdn.decibelinsight.net" { type master; notify no; file "/etc/bind/zones/null.dns"; };
//zone "cdn.inspectlet.com" { type master; notify no; file "/etc/bind/zones/null.dns"; };
//zone "wu-app.quantummetric.com" { type master; notify no; file "/etc/bind/zones/null.dns"; };
//zone "ws.sessioncam.com" { type master; notify no; file "/etc/bind/zones/null.dns"; };
//zone "cdn.userreplay.net" { type master; notify no; file "/etc/bind/zones/null.dns"; };
//zone "mc.yandex.ru" { type master; notify no; file "/etc/bind/zones/null.dns"; };

zone "clicktale.net" { type master; notify no; file "/etc/bind/zones/null.dns"; };
zone "fullstory.com" { type master; notify no; file "/etc/bind/zones/null.dns"; };
zone "decibelinsight.com" { type master; notify no; file "/etc/bind/zones/null.dns"; };
zone "inspectlet.com" { type master; notify no; file "/etc/bind/zones/null.dns"; };
zone "quantummetric.com" { type master; notify no; file "/etc/bind/zones/null.dns"; };
zone "sessioncam.com" { type master; notify no; file "/etc/bind/zones/null.dns"; };
zone "yandex.ru" { type master; notify no; file "/etc/bind/zones/null.dns"; };

Die gröbsten Missetäter sollten somit nicht mehr ins Haus kommen …

Tags: , , , , , , , , ,
Labels: IT, Linux, Web

Keine Kommentare | neuen Kommentar verfassen

Samstag, 11. November 2017

Das Alter von AutoScout24-Inseraten herausfinden (Low-Skill-Version)

In den letzten zwei Wochen waren Stephanie und ich auf der Suche nach einem Occasion-Auto als Ersatz für unseren altgedienten TOYOTA Yaris 1.3, den wir an einen Bekannten verkaufen dürfen.

Nach einer Probefahrt an einem Samstag bei einer Garage in der Region drängte uns der Verkäufer dazu, nicht zu Lange mit dem Kaufentscheid zuzuwarten. Die Nachfrage nach solchen Fahrzeugen sei gross und vielleicht könnte bereits jemand weiteres am Montag Interesse anmelden. Beim Sondierungsanruf des Garagisten am darauffolgenden Dienstag-Morgen hatte sich die Prophezeiung dann tatsächlich erfüllt: Ein zweiter Interessent hatte sich materialisiert, aber da wir zuerst angefragt hätten, hätten wir auch das Vorkaufsrecht. Wie anständig!

Verkäufer, die einem unter Zeitdruck setzen wollen, sind mir zunehmends suspekt. Nicht zuletzt, weil ich als Security Officer regelmässig mit Phishing-Mails zu tun habe, deren Autoren mit identischen psychologischen Tricks hantieren: „Alarm, bitte rasch handeln, sonst verlierst du nach 24 oder 48 Stunden Zugang zu deiner Apple ID“. Selbst Booking.com wendet solche Räubermethoden bei ihren Hotelangeboten an („Nur noch 1 Raum zu diesem Preis verfügbar“, „In den letzten 24 Stunden von 3 Personen gebucht“). Da muss man hart bleiben.

Im vorliegenden Fall hatte ich im Hinterkopf, dass ich das probegefahrene Auto vor Wochen bereits auf AutoScout24 gesehen hatte. Wieso also sollte ausgerechnet nun Eile bestehen, überhastete Kaufentscheide zu fällen?

Doch wie konnte ich meine Vermutung verifizieren? AutoScout24 hütet sich natürlich, solche Informationen in Autoanzeigen klar sichtbar anzupreisen. Die AutoScout-Kunden sind nicht wir (für uns ist der Service selbstverständlich kostenlos), sondern die Garagen, die Fahrzeuge verkaufen wollen und dafür AutoScout24 als Mittelmann einen „Wegzoll“ entrichten dürfen. Und wer zahlt befiehlt: Die Informations-Asymmetrie muss gewährleistet bleiben, denn man stelle sich vor, ein Käufer läuft in die Garage hinein und hat im Verhandlungspoker das Wissen in der Hinterhand, dass sein Traumfahrzeug ein Ladenhocker ist.

Wenn uns AutoScout24 also nicht direkt weiterhelfen will, helfen wir uns halt selber. Nach einer Debug-Session an einem dunklen Winterabend hatte ich die Lösung, die im Grunde naheliegend ist: Die Bilder der Autos, und zwar sowohl das Speicherdatum, als auch die im Bild eingebetteten EXIF-Daten.

Wer die Web-Site bereits einmal auseinandergenommen hat, weiss, dass die Bilder nicht als Originale ausgeliefert werden, sondern über ein Script, welchem man in den Parametern den Pfad, die Bilddimensionen und JPEG-Qualität mitgeben kann. Das schaut dann etwa so aus:


https://cas01.autoscout24.ch/toyota-verso-s-kompaktvan–minivan-2015-occasion/?1024×2048/3/90/custom/434/5101434/0.jpg

Die Bausteine lassen sich teilweise entschlüsseln (und beim Fehlen ist auf Grund eines Web-Entwicklers, dem OWASP wohl kein Begriff ist, auch mit hilfreichen Fehlermeldungen zu rechnen):

  • ?1024x2048 = Auflösung in Pixeln
  • /3 = „Quality Format“
  • /90 = Qualität (ein spontaner Test mit „95“ hat nicht funktioniert; d.h. die Werte sind hartkodiert)
  • /custom/434/5101434/0.jpg = Der absolute Pfad der Bilddatei auf dem NFS-Share, wobei ich den Wert 434 nicht deuten kann. Bei 434 handelt es sich um die letzten drei Zahlen der ID. AutoScout24 verwendet diese Zahl, um die Bilder strukturiert in Unterordner abzulegen, um nicht in einem einzigen Verzeichnis Millionen von Photos liegen zu haben. 5101434 ist die ID des Inserats.
    Die ID zählt übrigens stetig hoch. Kennt man also eine ID und ein Publikationsdatum vor diesem Inserat und eine ID und ein Publikationsdatum nach diesem Inserat, kann man den Veröffentlichungszeitpunkt eingrenzen und interpolieren.

Dieses Script stellt zwei Dinge sicher: Einerseits liefert der Web-Server als Erstellungsdatum des Bildes das Datum und die aktuelle Uhrzeit des Aufrufs mit. Andererseits entfernt das Script jegliche EXIF-Daten, welche viele verschiedene Informationen enthalten können, bspw. die GPS-Koordinaten, das Kameramodel, aber natürlich auch das Aufnahmedatum.

Gibt es eine Möglichkeit, auf die Originalbilder zuzugreifen? Selbstverständlich gibt es das, wird aber nirgends verwendet und ist schon gar nicht dokumentiert. Für das Photo, welches ich oben referenziert habe, lautet die URL:


https://cas01.autoscout24.ch/custom/434/5101434/0.jpg

Man benötigt also die Basis-URL https://cas01.autoscout24.ch sowie den String, der an den URLs öffentlich zugänglicher Photos hängt. Hier: /custom/434/5101434/0.jpg.

Lädt man dieses Photo nun unter macOS im Terminal mit wget herunter, liefert der Web-Server das ursprüngliche Speicherdatum mit. Das ursprüngliche Speicherdatum ist identisch mit dem Zeitpunkt, an welchem das Inserat aufgeschaltet wurde:

$ wget "https://cas01.autoscout24.ch/custom/434/5101434/0.jpg"
--2017-11-11 16:51:45--  https://cas01.autoscout24.ch/custom/434/5101434/0.jpg
Auflösen des Hostnamens cas01.autoscout24.ch… 91.208.180.147
Verbindungsaufbau zu cas01.autoscout24.ch|91.208.180.147|:443 … verbunden.
HTTP-Anforderung gesendet, auf Antwort wird gewartet … 200 OK
Länge: 542433 (530K) [image/jpeg]
Wird in »0.jpg« gespeichert.

0.jpg               100%[===================>] 529,72K  --.-KB/s    in 0,1s    

2017-11-11 16:51:47 (4,95 MB/s) - »0.jpg« gespeichert [542433/542433]

Das Upload-Datum der Datei lautet 31. August 2017, 08:50 Uhr morgens:

$ ls -l
total 1064
-rw-r--r--  1 user  staff  542433 31 Aug 08:50 0.jpg

Das ist realistisch — der 31. August war ein Donnerstag und 8:50 Uhr liegt innerhalb der Bürozeiten.

Und was sagt jhead, mit welchem man EXIF-Informationen auslesen kann?

$ jhead 0.jpg 
File name    : 0.jpg
File size    : 542433 bytes
File date    : 2017:08:31 08:50:08
Resolution   : 2048 x 1365
JPEG Quality : 89

Das sind leider keine EXIF-Informationen: AutoScout entfernt diese offenbar aus den Originalen, die sie im oben genannten Pfad ablegen.

Und so hatte ich mich in diesem konkreten Fall selber beruhigt, dass keine Hüst-und-Hott-Aktion nötig sein würde. Die Wahrscheinlichkeit, dass das als Schnäppchen angepriesene Auto zwei Monate lang herumstand und sich urplötzlich am selben Wochenende zwei Parteien dafür interessieren würden, war doch äusserst gering und wohl die Erfindung eines provisionsgetriebenen Verkäufers.

NB: Finde ich die Zeit, werde ich in einem zukünftigen Artikel beschreiben, wie die High-Skill-Version ausschaut. Kurzzusammenfassung: iOS-App, mitmproxy und JSON. So findet man alle möglichen Meta-Informationen zu einem Inserat, die man als Endbenutzer selbst in der App, aber auch auf der Web-Site nie zu Gesicht bekommt respektive nur in gefilterter/formatierter Version.

Tags: , , , , , ,
Labels: Web

31 Kommentare | neuen Kommentar verfassen

Freitag, 20. Oktober 2017

Interaktive Windkarte Europas

Als Stephanie das letzte Wochenende in Dublin unterwegs war, habe ich mit folgender Web-Site den herannahenden Hurrikan „Ophelia“ im Auge behalten (denkt ihr auch immer daran, wenn ihr diesen Namen hört?):

Windy.com

Schick gemacht!

Tags: , , , , , , , ,
Labels: Web

Keine Kommentare | neuen Kommentar verfassen

Montag, 8. Mai 2017

Die nervende WAF von Cyon deaktivieren

Gut gemeint, funktioniert aber nicht: Die Cyon WAF (Web Application Firewall).

Gerade eben kämpfte ich massiv mit meinem Server bei Cyon, deren WAF und meiner WordPress-Installation: Den Artikel tftp funktioniert über NAT nicht wollte der Server partout nicht speichern und gab stattdessen einen HTTP 403 zurück. Wahrscheinlich enthielt das Web-Formular zu viele „gefährlich“ tönende Befehle.

Das Problem behebt man ganz einfach, indem man die .htaccess der WordPress-Installation um folgende Zeilen ergänzt:

...
<IfModule mod_security2.c>
SecFilterEngine Off
SecFilterScanPOST Off
</IfModule>
...

Tags: , , , , , ,
Labels: Web

Keine Kommentare | neuen Kommentar verfassen

Donnerstag, 4. Mai 2017

Preisreferenzen von gebrauchten Geräte für meine AlleKleinanzeigen-Suchen

Vor einigen Tagen bin ich auf die Meta-Suchmaschne AlleKleinanzeigen.ch gestossen. Mit dieser Suchmaschine kann man die gängigsten Schweizer Angebots-Plattformen für Kleinanzeigen wie Ricardo.ch, Tutti und Anibis durchsuchen. Man findet so innert Sekunden heraus, ob ein gebrauchter Artikel irgendwo in der Schweiz verfügbar ist oder nicht — und zu welchen Preisen.

Das Beste: Man kann sich eine Suche nach bestimmten Wörter auch per E-Mail abonnieren — das bedeutet, dass auf einer der durchsuchten Plattformen ein neuer Artikel online gestellt und von AlleKleinanzeigen.ch indexiert wurde, eine E-Mail an den Abonnenten ausgelöst wird. Völlig kostenlos, selbstverständlich.

Ab sofort kann ich die Suche nach Geräten und Gegenständen automatisieren, welche ich nicht sofort benötige, sondern erst dann, wenn mir ein preislich ansprechendes Schnäppchen vor die Flinte läuft.

Damit ich aber sicher bin, ein Schnäppchen zu machen, musste ich mir zuerst einmal herausschreiben, was der Neupreis eines Geräts beträgt. Dieser Blog-Post hilft mir dafür als Langzeitgedächtnis.

KitchenAid Mixer Artisan KSM150

Das günstigste Angebot im Mai 2017 war ein oranger tangerine KitchenAid Artisan KSM150 (5KSM150PSETG) bei Venova für 420 CHF. Im Februar 2017 fand ich beim selben Shop sogar ein identisches Gerät in der äusserst hässlichen Farbe „Terracotta“ — für 380 CHF, also noch einmal 40 Stutz günstiger.

Somit ist klar, dass ein solches gebrauchtes Gerät unter 400 CHF kosten sollte, damit es sich lohnt, auf die zweijährige Garantie zu verzichten.

KitchenAid Mixer Classic K45

Die günstigste Variante bei einem renommierten Online-Shop (Galaxus) kostet 377 CHF.

Mir ist übrigens aufgefallen, dass KitchenAids jeweils vor Weihnachten mit „Aktionen“ angepriesen werden — Coop bewarb im Dezember 2016 beispielsweise ein ähnliches Set für 799 CHF. Was ich mir deshalb gemerkt habe: Gerade bei diesen Küchengeräten ist es ratsam, die Marktsituation ausreichend abzuklären, sonst zahlt man locker einige hundert Franken drauf.

Sonos Play:1, Play:3 und Play:5

Für einen DINK-Haushalt würde es eigentlich zum guten Ton gehören, diesen mit Lautsprechern von Sonos ausgestattet zu haben. Wie man dabei vorgeht, hat mein Lieblings-Gadget-Blogger vowe in einem Artikel „How to get started with SONOS“ beschrieben. Sonos hat den Weg noch nicht zu uns gefunden, weil die Dinger schlichtweg zu teuer sind.

Vielleicht ändert sich das ja bald, sobald ich ein paar Schnäppchen erstanden habe. Dazu müssen diese folgende Preise stark unterschreiten:

Toppreise-Suche nach Sonos (nach günstigstem Betrag geordnet)

  • Play:1 (Single) für 214.95 CHF (microspot)
  • Play:1 (Bundle) für 409 CHF (digitec), sprich für 204.50 CHF/Stück
  • Play:3 296 CHF (microspot)
    Am 4. Mai gab es auch eine „wiederaufbereitete“ Version für 269 CHF
  • Play:5 (zweite Generation) 517 CHF (microspot)

Tags: , , , , , , , , , , , ,
Labels: Schweiz, Shopping, Web

Keine Kommentare | neuen Kommentar verfassen

Freitag, 28. April 2017

Unterstützt mein Hoster DNSSEC?

Verisign liefert ein Tool, mit welchem man unter Eingabe eines Domain-Namens testen kann, ob der Betreiber des Nameservers der Domain DNSSEC unterstützt:

DNSSEC Analyzer

Antwort in meinem Fall für Cyon (April 2017): Leider nein.

Tags: , , ,
Labels: Web

1 Kommentar | neuen Kommentar verfassen

Sonntag, 5. März 2017

Ärgernis: Passwortfelder, welche kein Copy & Paste zulassen

Wer nur ein Quäntchen Sicherheitsbewusstsein besitzt, setzt heute Passwortmanager ein und verwendet für jeden Web-Service ein einzigartiges Passwort. Die besten Passwortmanager klinken sich mittlerweile auch mittels Erweiterungen in die Web-Browser ein und erlauben es so, Login-Formulare auf Knopfdruck auszufüllen, ohne dass man noch manuell Copy & Paste machen muss.

Ich verwende 1Password.

Leider scheint diese Technologie noch nicht bei allen Web-Entwicklern angekommen zu sein. Immer wieder stosse ich in meinem Alltag auf Web-Sites, bei denen minderbelichteter, selbsternannter „Security-Spezialist“ entschieden hat, dass Copy & Paste in eine Passwort-Feld ganz, ganz, ganz pöhse ist und deshalb unterbunden werden muss.

Was für mich bedeutet, dass ich das kryptische, 16-stellige Passwort von Hand abtippen muss. Oder aber ich mache mir das Safari Web-Developer-Menu und die JavaScript-Konsole zu nutze und setze das Passwort-Feld halt mit JavaScript-Befehlen (in der Konsole funktioniert Copy & Paste problemlos):

Zuerst finde ich die DOM ID des Passwort-Feldes heraus …

… dann wechsle ich in die Konsole und setze den Passwort-Wert:

Anschliessend klicke ich in der Web-Ansicht auf „Login“. Et voilà!

Tags: , , , , , ,
Labels: Web

2 Kommentare | neuen Kommentar verfassen