Rolf B: Wie herausfinden ob Website Strg+c unterdrückt?

Beitrag lesen

Hallo Woody,

aaalso, auf der von Dir verlinkten Seite ist das kein Bug, das ist auch keine vorsätzliche Blockade von Copy. Neiiin, das ist ein Feature! Was ganz Tolles !1!!elf!!

Im rechten Seitenblock gibt es diese Anzeige mit "Contents" und "Notebook". C aktiviert dort den Contents-Reiter. N den Notebook Reiter. Allerdings gibt sich der Autor nicht die Mühe, zu prüfen, ob ein Modifikator dabei ist. D.h. Shift-N, Alt-N, Ctrl-N, AltGr+N, Meta+N - wird alles akzeptiert.

Wie habe ich das herausgefunden? Ich habe Chrome verwendet; im FF habe ich nicht herausgefunden, wie man die registrierten Eventhandler anzeigt.

  • Entwicklerwerkzeuge auf der Seite geöffnet
  • Ein Element gesucht, in dem Copy-geschützter Text steht (war bei mir das h1 Element)
  • im rechten Fenster die Event-Listener zum Element geöffnet (da wo "Styles", "Computed" etc steht)
  • a gugge da, es sind 5 keypress Handler und 5 keydown Handler, alle auf body registriert.
  • diese Listener der Reihe nach entfernt (Chrome hat eine praktische "Remove" Funktion)
  • Aha, der keydown Handler in Zeile 3 ist es.
  • Auf die Source-Referenz geklickt (course.bundle.min-ecc8089b.js:3)
  • Gekotzt
  • Unterm Source auf {} geklickt (pretty print)
  • ab Zeile 1007 steht nun
    var F = 78, $ = 67, J = 84, Q = "";
    if (w.bind("keydown", function(t) {
        if (!("INPUT" === t.target.tagName || "TEXTAREA" === t.target.tagName || e(t.target).attr("contenteditable") || e(t.target).closest("form").length > 0)) {
            switch (t.keyCode) {
            case J:
                var o = t.ctrlKey || t.shiftKey || t.altKey || t.metaKey;
                if (o)
                    return !0;
                if (!e("html").hasClass("member"))
                    return !0;
                I.trigger("theater.toggle"),
                Q = "player-theater-mode";
                break;
            case F:
                var r = e("#notes-tab");
                r.length && r.click(),
                Q = "N";
                break;
            case $:
                var a = e("#toc-tab");
                a.length && a.click(),
                Q = "C";
                break;
            default:
                return !0
            }
            return w.trigger("ga.event", {
                action: "keypress",
                label: Q,
                value: x
            }),
            !1
        }
    }),
  • Aha, also eine jQuery Seite. .bind() ist eine der vielen Möglichkeiten, Eventlistener zu registrieren.
  • Der erste IF soll wohl den Handler-Code überspringen, wenn man in einem input, textarea, contenteditable oder einem Form-Element ist. Schneller Test: Ein Wort in der Suchzeile oben kann man kopieren. Yup!
  • Der keyCode wird geprüft. Zuerst gegen J. Was ist J??? Siehe oben: var J=84. Guck in die Ascii-Tabelle: T (oder drücke ALT und dann 84 im Nummernblock). Dann wird genauer geprüft: Ist im Event-Objekt der Schalter für Ctrl, Shift, Alt oder Meta gesetzt? Dann: adios. T wird nur ohne Modifikator interpretiert. Dann wird geprüft, ob das <html> Element die Klasse "member" trägt. Wenn nicht, adios. Wie dumm. Eine Klasse ist schnell manipuliert. T aktiviert den Theater-Modus. Aber nur für Member. Aha. Test: Klasse non-member in member geändert, T gedrückt -> Videofenster wird breit. Yup!
  • Nächste keyCode-Prüfung erfolgt gegen Variable F. F=78, Alt+78 ist N. Hier wird kein Modifikator geprüft, sondern blindlings ein Klick auf #notes-tab simuliert. Das gleiche gilt für den KeyCode in Variable $, also 67, also C. Blinder Klick auf #toc-tab.

Angesichts der „ausgefeilten“ Nutzerbeschränkung des Theater Mode würde ich hier Hanlon's Razor anwenden wollen:

Geh nicht von Böswilligkeit aus, wenn Dummheit genügt

Statt im Browser-Menü rumzukrabbeln, kannst Du auf dieser Seite auch einfach die rechte Maustaste drücken und "Kopieren" auswählen.

Rolf

--
sumpsi - posui - clusi