T-Rex: Externen Link erkennen

Moin,

da gibt es die Möglichkeit, dass der User einen Link eingibt. Bei externen Links möchte ich eine kleine Grafik anzeigen, die symbolisiert, dass dieser Link nach außen führt.
Problem wie erkenne ich externe links?

Ich habe schon ganz grob 3 Merkmale.
1. der Link enthält ein http am Anfang
2. der Link enthält ein www
3. der Link hat am Anfang kein Slash

Ich denke damit decke ich schon recht viel ab. Die Merkmale sind jedoch ungenau.
1. Der User könnte mittels http auf die eigene Domain verlinken. Dann wäre es ein interner link mit http.
2- Das www ist nicht zwingend, somit kein zuverlässiger Indikator.
3. Externe Links könnten mit // anfangen.

Gibt es eventuell einen Regulären Ausdruck, der mir sagt ob es externe Links sind?

Gruß
Kürbislasagne Portionierer
T-Rex

  1. Hi,

    Moin,

    da gibt es die Möglichkeit, dass der User einen Link eingibt. Bei externen Links möchte ich eine kleine Grafik anzeigen, die symbolisiert, dass dieser Link nach außen führt.
    Problem wie erkenne ich externe links?

    Ich habe schon ganz grob 3 Merkmale.

    1. der Link enthält ein http am Anfang

    Gegenbeispiel: mailto:, ftp:, ...
    Außerdem: http://deinserver.test/andereSeite.html

    1. der Link enthält ein www

    Gegenbeispiel: http://google.de/

    1. der Link hat am Anfang kein Slash

    Gegenbeispiel: bla.html (also im gleichen Verzeichnis)

    Ich denke damit decke ich schon recht viel ab. Die Merkmale sind jedoch ungenau.

    EXTREM ungenau.

    1. Der User könnte mittels http auf die eigene Domain verlinken. Dann wäre es ein interner link mit http.

    Oder ein anderes Protokoll verwenden.

    2- Das www ist nicht zwingend, somit kein zuverlässiger Indikator.

    Richtig.

    1. Externe Links könnten mit // anfangen.

    Und interne ohne.

    Gibt es eventuell einen Regulären Ausdruck, der mir sagt ob es externe Links sind?

    Du müßtest einen absoluten Link daraus machen, und dann prüfen, ob die Domain dieselbe ist.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
    1. Du müßtest einen absoluten Link daraus machen, und dann prüfen, ob die Domain dieselbe ist.

      Ok wie mache ich das am besten?

      Gruß
      Mad Rex

      1. Hi T-Rex ;)

        Ok wie mache ich das am besten?

        Vorausgesetzt das Überprüfen der Nutzereingabe ist der einzige Weg - vielleicht hilft dir der folgende Gedanke weiter (Denkfehler vorbehalten):

        Es wurde ja schon angesprochen, dass jeder nicht-interne Link ein externer Link ist. Es genügt also auszuschließen, dass es sich um einen internen Link handelt. Ich denke wir sind schon soweit mit diesem Thema, dass sich PHP um die Linkauswertung kümmern soll.

        Interne Links liegen entweder im gleichen Verzeichnis (Anfang ohne Slash), in einem darüberliegenden Verzeichnis (Anfang besteht ausschließlich aus Slash-Punkt-Kombinationen) oder bilden die absolute URL auf die interne Seite ab. Alles andere sind entweder externe Links oder Links mit anderer Bedeutung (z.B. mailto - das möchtest du wahrscheinlich nicht als externen Link markieren, sondern ggf. als E-Mail-Addresse).

        Den zweiten Fall zu überprüfen ist einfach: du kannst durch RegExp prüfen, ob am Anfang des Links ein Slash steht gefolgt von einem Zeichen, das kein Slash ist. Wenn ja - ist es ein interner Link.

        Nun zu Fall eins:

        Du checkst zunächst über RegExp, ob der eingegebene Link vorne mit einem Protokollnamen beginnt - falls ja können wir einen internen Link nach Fall eins ausschließen. Dann genügt direkt die Überprüfung auf Fall drei (sofern dir der Protokollname passt - ich würde z.B. falls es tatsächlich um einen Link geht nur http:// und https:// akzeptieren).

        Falls der Link nicht mit Protokollnamen beginnt, untersuchen wir auf Verwendung einer gültigen URL mit Top-Level-Domain. Betrachtest du den Teil des Links vor dem ersten Slash (oder den ganzen Link, sollte kein Slash vorhanden sein) - ich bezeichne das mal als $a - und suchst darin den ersten Punkt von rechts. Wird kein Punkt in $a gefunden, ist es ein interner Link. Wird einer gefunden, so betrachte den Teil von $a zwischen Punkt und String-Ende - ich nenne das mal $b. Jetzt gleichst du $b mit einer Liste aller möglichen Top-Level-Domains ab (vielleicht hat jemand an dieser Stelle eine elegantere Idee...?) - falls keine Übereinstimmung ist der Link intern (denn externe Links verfügen über eine Top-Level-Domain), falls Übereinstimmung prüfe auf Fall drei.

        Zuletzt zu Fall drei:

        Wir prüfen zunächst wieder, ob ein Protokollname vorne am Link dran hängt und falls ja, machen wir diesen zu Überprüfungszwecken weg. Danach werfen wir alles ab dem ersten Slash weg. Dann werfen wir alles weg, was links von dem zweiten Punkt von rechts steht, weg (hier kommts drauf an, was für dich "intern" bedeutet. Wenn intern nur bedeutet innerhalb der Domain, passt das so. Falls intern nur die Subdomain betrifft, musst du halt einen Punkt weiter gehen). Das was übrig bleibt (also TLD und Domain) vergleichen wir mit deiner eigenen Domain. Falls Übereinstimmung, ist der Link intern. Falls nicht, ist er extern.

        Alles was bisher nicht als intern erkannt wurde, ist extern.

        Disclaimer: Meine Idee oben versteht sich nicht als Königsweg, vielleicht gibt es eine mir nicht bekannte, viel elegantere Lösung. Es ist vielmehr eine Verfeinerung der "einfachen" Kriterien, die du bisher einsetzt - wie bisher bei dir rein auf der Basis der Nutzereingabe ohne irgendeine Form des Lookup. Meiner Meinung nach deckt meine Idee dann aber doch einen großen Teil der möglichen Eingaben ab. Man kann das ganze noch weiter verfeinern - z.B. indem man an gegebener Stelle überprüft, ob die übergebene Addresse vielleicht gar keine Domain hat, sondern auf eine IP hört, die entweder die eigene oder eine externe sein kann. Die Frage ist immer, wie viel Aufwand man für eine reine "Komfortfunktion" (wie ich es verstanden habe) investieren möchte.

        Hoffe, eventuell weitergeholfen zu haben (hatte das Problem selbst auch schon),

        RIDER

        --

        Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
        1. @@Camping_RIDER:

          nuqneH

          Du checkst zunächst über RegExp, ob der eingegebene Link vorne mit einem Protokollnamen beginnt

          Und wie soll das gehen? Whitelist? Da stehen sicher nicht alle möglichen Protokolle drin.

          ich würde z.B. falls es tatsächlich um einen Link geht nur http:// und https:// akzeptieren

          Ach so. Vorher erwähntest du noch mailto etc.

          Jetzt gleichst du $b mit einer Liste aller möglichen Top-Level-Domains ab

          Geht nicht. Es kommen ständig neue TLDs hinzu.

          Qapla'

          --
          „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
          1. N'Abend Gunnar ;)

            Und wie soll das gehen? Whitelist? Da stehen sicher nicht alle möglichen Protokolle drin.

            Ach so. Vorher erwähntest du noch mailto etc.

            Es ging ja darum, externe Links zu markieren. Je nachdem, was das Ding nachher leisten soll, möchte ich ja nur bestimmte Protokolle detektieren, bzw. dann je nachdem auch anders behandeln. Es ist daher nich unbedingt nötig ALLE Protokolle durchlaufen zu lassen. Sollen nur Weblinks detektiert werden (das habe ich hier implizit dann auch angenommen) reichen HTTP und HTTPS. Mailto und andere Protokolle könnten auch detektiert und dann anders behandelt werden (anderes Icon etc).

            Jetzt gleichst du $b mit einer Liste aller möglichen Top-Level-Domains ab

            Geht nicht. Es kommen ständig neue TLDs hinzu.

            So in etwa hatte ich das befürchtet... Deshalb auch die extra-Nachfrage nach einer eleganteren Lösung. Anderer Vorschlag für diese Stelle in meiner Vorgehensweise:

            Man könnte ja an dieser Stelle auch die PHP-Funktion gethostbyname benutzen (siehe Funktionsbeschreibung bei PHP.net) und im Fall einer nicht-erfolgreichen Anfrage darauf schließen, dass der Link intern ist, da der erste Link-Teil offensichtlich kein gültiger DNS-auflösbarer Name ist. Im Fall der erfolgreichen Anfrage könnte dann auch direkt auf die eigene Server-IP überprüft werden. Nachteil hier: Performance-Einbuße durch den zeitaufwändigen DNS-Lookup. Ob das tragbar ist oder nicht, muss jeder für sich entscheiden; das kommt sicher auch darauf an, wie oft eine solche Funktion tatsächlich verwendet wird. Sollte das angewandt werden, bitte den Kommentar von "Ome Ko" (war bei mir der erste) auf der verlinkten Seite beachten.

            Vielleicht wäre diese Funktion auch etwas, das schon das gesamte Prozedere ein Stück weit ersetzen kann. Ich müsste ja nur eine geeignete Stelle im Link auswählen, die im Fall eines externen Links die externe Domain enthalten würde (also z.B. entferne evtl. vorhandenes Protokoll im Link und picke alles vor dem ersten Slash oder Linkende) und diesen einmal durch den DNS-Lookup jagen. Just Brainstorming...

            Grüße und Dank für die Anmerkungen,

            RIDER

            --

            Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
        2. Danke für deine Gedanken.

          Wie wärs, wenn man den User einfach zwingen muss ein Protokoll anzugeben? Dann muss am Anfang ein http stehen. Wenn das nicht da, ist der Link per default falsch. Wenn es da steht muss ich nur noch auf die Domain prüfen.

          Ist die Idee gut?

          Gruß
          Hintertürennutzer
          T-Rex

          1. @@T-Rex:

            nuqneH

            Wie wärs, wenn man den User einfach zwingen muss ein Protokoll anzugeben? Dann muss am Anfang ein http stehen. Wenn das nicht da, ist der Link per default falsch. Wenn es da steht muss ich nur noch auf die Domain prüfen.

            Ist die Idee gut?

            Nein, IMHO.

            Ich würde den Nutzer eher zwingen, absolute IRIs anzugeben, also immer mit Domain, mit oder ohne Protokoll.

            Qapla'

            --
            „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
            1. Ich würde den Nutzer eher zwingen, absolute IRIs anzugeben, also immer mit Domain, mit oder ohne Protokoll.

              Dann kommt wieder das Problem wie man herausfindet ob es sich um eine Domain handelt?
              Vielleicht ein Punkt im ersten Teilstring vor dem Slash?

              Gruß
              Domain suchender
              T-Rex

              1. Hallo,

                Ich würde den Nutzer eher zwingen, absolute IRIs anzugeben, also immer mit Domain, mit oder ohne Protokoll.

                die Angabe ohne Protokoll-Präfix und ohne führenden Slash ist zwar allgemein üblich, aber technisch nicht ganz korrekt, was dazu führt, dass sie nicht eindeutig als das erkannt werden kann, was sie sein will.

                Dann kommt wieder das Problem wie man herausfindet ob es sich um eine Domain handelt?

                Genau, das erfordert eine gewisse Heuristik. Denn in einer Angaber wie "example.org/image.png" ist example.org zwar *sehr wahrscheinlich* als Domainname (Hostname) gemeint, es könnte aber theoretisch auch ein Verzeichnis auf dem lokalen Server sein, also "./example.org". Ein weiterer Stolperstein ist, dass manche Leute das häufige Präfix "www." ebenfalls weglassen, wenn sie eine Webadresse irgendwo angeben, denn "das ist ja sowieso klar".

                Vielleicht ein Punkt im ersten Teilstring vor dem Slash?

                Der ist ein weiteres kleines Indiz, aber auch kein sicheres. Ja, Benutzereingaben fehlertolerant erkennen, korrekt als das erkennen, als was sie gemeint sind, ist eine echte Herausforderung.

                So long,
                 Martin

                --
                F: Was sagt der große Keks zum kleinen Keks?
                A: Du kannst dich jetzt verkrümeln.
                Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
            2. Ich würde den Nutzer eher zwingen, absolute IRIs anzugeben, also immer mit Domain, mit oder ohne Protokoll.

              Warum kein Protokoll?

              Gruß
              nach bohrender
              T-Rex

            3. Moin,

              Ich würde den Nutzer eher zwingen, absolute IRIs anzugeben, also immer mit Domain, mit oder ohne Protokoll.

              Hm, an und für sich keine schlechte Idee. Damit geht aber die Möglichkeit, Links zu setzen, für die man gar keine Domain angeben kann - soll heißen: Links mit IP-Addressen -, gänzlich verloren.

              Beispiel: Ich war Teil einer Spielergemeinschaft und wir hatten damals nen Rootserver und ne extern gehostete Homepage. Die Homepage hatte unsere Domain, der Hoster bot aber keine Möglichkeit, eine Subdomain o.ä. mit einer IP-Addresse zu verlinken. Auf dem Rootserver (also in räumlicher Nähe zu den Gameservern) lagen die recht populären, öffentlichen Spielerstatistiken auf einem Apache, der dementsprechend nur per IP verlinkbar war.

              Das nur als kleines Beispiel dafür, dass auch IP-Links durchaus manchmal nötig sind. Siehe auch mein Plädoyer für zwingende Protokollangabe...

              Grüße,

              RIDER

              --
              Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
              ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
              1. Hallo,

                Ich würde den Nutzer eher zwingen, absolute IRIs anzugeben, also immer mit Domain, mit oder ohne Protokoll.
                Hm, an und für sich keine schlechte Idee. Damit geht aber die Möglichkeit, Links zu setzen, für die man gar keine Domain angeben kann - soll heißen: Links mit IP-Addressen -, gänzlich verloren.

                wieso das? In dem Fall steht die IP-Adresse anstelle der Domain und kann wie ein Domainname behandelt werden - ein Domainname, dessen Namensteile eben "zufällig" nur aus Ziffern bestehen (IP v4 angenommen). Ansonsten besteht hinsichtlich der Plausibilitätskontrolle kein Unterschied.

                Ciao,
                 Martin

                --
                Alle wollen unser bestes.
                Aber das kriegen sie nicht.
                Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                1. Aloha ;)

                  wieso das? In dem Fall steht die IP-Adresse anstelle der Domain und kann wie ein Domainname behandelt werden - ein Domainname, dessen Namensteile eben "zufällig" nur aus Ziffern bestehen (IP v4 angenommen). Ansonsten besteht hinsichtlich der Plausibilitätskontrolle kein Unterschied.

                  Hm, das kommt dann aber stark darauf an, wie genau ich die Plausibilitätskontrolle durchführe. Wenn ich nur einen Punkt suche, um auf Domain zu prüfen, stimmt das - das ist aber eine sehr schwache Methode. Man bedenke eine Nutzereingabe wie "index.php/pfad/zur/unterseite". Das ist sicher keine Domain, sondern ein relativer Pfad, aber wenn ich deinen Vorschlag zur Prüfung richtig verstanden habe, würde es als Domain erkannt (oder ein anderes Beispiel: auch Ordnernamen mit Punkt sind denkbar).

                  Ich denke, dass eine vollständige, zeichen-basierte Prüfung auf Domainnamen nicht möglich ist, höchstens über eine Art DNS-Lookup wie an anderer Stelle vorgeschlagen, das ist aber alles andere als performant und würde das Problem der Unterscheidung zwischen "111.111.111.111/unterseite/von/absoluter/ip-url" und "111.111.111.111/relativer/pfad/unter/ordner/mit/zahlen/und/punkten" bei existierendem Host 111.111.111.111 auch nicht lösen. Imho sind nur über eine Protokollangabe Missverständnisse ausgeschlossen...

                  Grüße,

                  RIDER

                  --
                  Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
                  ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
                  1. @@Camping_RIDER:

                    nuqneH

                    Ich denke, dass eine vollständige, zeichen-basierte Prüfung auf Domainnamen nicht möglich ist

                    Yep.

                    Imho sind nur über eine Protokollangabe Missverständnisse ausgeschlossen...

                    Nö. Auch durch Verzicht auf relative Angaben, wie bereits gesagt.

                    Ich sehe für relative Adressen auch keinen Usecase. Wie du selbst schriebst, kopiert man sich Adressen von Deeplinks meist aus der Adresszeile des Browsers und hat damit den absoluten IRI.

                    Qapla'

                    --
                    „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
          2. Hi T-Rex ;)

            Wie wärs, wenn man den User einfach zwingen muss ein Protokoll anzugeben? Dann muss am Anfang ein http stehen. Wenn das nicht da, ist der Link per default falsch. Wenn es da steht muss ich nur noch auf die Domain prüfen.

            Ist die Idee gut?

            Im Gegensatz zu Gunnar finde ich die Idee eigentlich ganz gut. Wie an anderer Stelle schon erwähnt wurde, ist es bei fehlender Protokollangabe nie vollständig sicher möglich, das Eingegebene richtig zuuordnen - von daher: wieso sollte die Seite dem user die Bequemlichkeit gönnen, Links ohne Protokoll zu posten, wenn dadurch eine Quelle für Fehlinterpretationen geöffnet wird, die im Ernstfall dazu führt, dass der user gerade NICHT das bekommt, was er gerne im Ergebnis hätte.

            Noch ein weiterer Gedanke: Wenn es nur darum geht, Usereingaben zu checken, so ist es in meinen Augen keine schlimme Sache, durch zwingende Protokollangabe Links auf Orte im selben Verzeichnis zu blockieren (so wie es auch bei Gunnars Vorschlag der Fall wäre). Wer kommt schon als externer User und verlinkt Inhalte vom selben Webangebot über einen relativen Link? Wenn man schon auf eine interne Seite verlinkt, dann doch normalerweise per copy+paste der absoluten Addresse...

            Das ist in meinen Augen auch nochmal ein Argument für verpflichtende Protokollangabe... Man bedenke einmal: Ich gehe als User auf eine Seite und möchte dort einen Link posten - egal ob intern oder extern. Also was tue ich? Ich öffne in einem neuen Tab die Seite, die ich als Link posten möchte und kopiere die vollständige Url aus der Addresszeile - inklusive Protokoll. In den allerseltensten Fällen weiß ich die Addresse so genau und sicher auswendig, dass ich sie direkt aus dem Kopf ins Formularfeld tippe... und wenn ich in diesen seltenen Fällen dann von der Seite nach dem ersten Abschicken noch einmal aufgefordert werde, vor meine Linkaddresse noch das http (oder https oder mailto oder ...) zu setzen, werde ich davon doch sicher nicht stark beeinträchtigt....

            Summa summarum: Zwingende Protokollangabe erleichtert dir die Arbeit immens (außerdem kannst du dann auch direkt die Unterscheidung ob E-Mailaddresse, Http-Link oder ftp vornehmen falls du das willst) und führt beim User nur zu marginalem Mehraufwand. Zusätzlich wird Missverständnissen vorgebeugt. In meinen Augen eine gute Sache.

            Grüße,

            RIDER

            --
            Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
            ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
            1. Tach!

              Wie wärs, wenn man den User einfach zwingen muss ein Protokoll anzugeben? Dann muss am Anfang ein http stehen. Wenn das nicht da, ist der Link per default falsch. Wenn es da steht muss ich nur noch auf die Domain prüfen.
              Ist die Idee gut?

              Es gibt da den Fall, dass Seiten mit http und https aufgerufen werden können. Und bei eingebundenen Ressourcen ist es günstig, sie mit demselben Protokoll aufzurufen, weil sonst einige Browser steiken. Kommt nun beides zusammen muss der Link zur Ressource beides können. Deshalb lässt man das Protokoll weg und der Browser nimmt das der einbettenden Seite.

              Im Gegensatz zu Gunnar finde ich die Idee eigentlich ganz gut. Wie an anderer Stelle schon erwähnt wurde, ist es bei fehlender Protokollangabe nie vollständig sicher möglich, das Eingegebene richtig zuuordnen - von daher: wieso sollte die Seite dem user die Bequemlichkeit gönnen, Links ohne Protokoll zu posten, wenn dadurch eine Quelle für Fehlinterpretationen geöffnet wird, die im Ernstfall dazu führt, dass der user gerade NICHT das bekommt, was er gerne im Ergebnis hätte.

              Meine obige Antwort ist die Theorie. Die Frage ist nun, wie die Praxis aussieht. Was ist der Anwendungsfall (oder auch mehrere)? Wenn das Einbetten keine Rolle spielt, dann kann man das außer Betracht lassen. Ebenso könnte man in die Abschätzung einfließen lassen, dass es relativ unbekannt ist, Verweise ohne Protokollangabe notieren zu können. Und es ist auch recht unüblich, sie aus Versehen wegzulassen, die Slashes aber hinzuschreiben. Ich denke, man kann davon ausgehen, dass das in den meisten Fällen jemand ganz bewusst so geschrieben hat.

              Wie auch immer, es ist recht einfach, die gegebene URL mit Javascript und relativ zum aktuellen Dokument parsen zu lassen und dann zum Zwecke der Prüfung ordentlich zusammenzusetzen: https://gist.github.com/jlong/2428561 (Kommt auch mit URLs ohne Protokoll zurecht.)

              Summa summarum: Zwingende Protokollangabe erleichtert dir die Arbeit immens (außerdem kannst du dann auch direkt die Unterscheidung ob E-Mailaddresse, Http-Link oder ftp vornehmen falls du das willst) und führt beim User nur zu marginalem Mehraufwand. Zusätzlich wird Missverständnissen vorgebeugt. In meinen Augen eine gute Sache.

              Ich bin dafür, mit dem geringstmöglichen Aufwand das bestmögliche Ergebnis zu erzielen. Das wäre für mich, die URL gemäß dem verlinkten Vorgehen zu interpretieren und keine weiteren Annahmen zu Fehleingaben zu treffen oder großartige Prüfungen und Fehlerkorrekturen einzubauen. Das ist den Aufwand vermutlich nicht wert. Wenn sich im Lauf der Zeit herausstellt, dass es beliebte Fehlermuster gibt, kann man sich immer noch dazu etwas einfallen lassen.

              dedlfix.

            2. @@Camping_RIDER:

              nuqneH

              wieso sollte die Seite dem user die Bequemlichkeit gönnen, Links ohne Protokoll zu posten,

              Weil Nutzer es so gewohnt sind. In die Adresszeile des Browsers gibt man™ auch Adressen ohne Protokoll ein.

              wenn dadurch eine Quelle für Fehlinterpretationen geöffnet wird,

              Ein Programmierer/Webentwickler sollte niemals seine Probleme auf die Nutzer abwälzen.

              die im Ernstfall dazu führt, dass der user gerade NICHT das bekommt, was er gerne im Ergebnis hätte.

              Ja, das koann man kaum ausschließen. Aufgabe des Entwicklers ist es, diese Fälle zu minimieren. Ohne für Nutzer unbequeme Restriktionen.

              Qapla'

              --
              „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
              1. Hi Gunnar ;)

                wieso sollte die Seite dem user die Bequemlichkeit gönnen, Links ohne Protokoll zu posten,

                Weil Nutzer es so gewohnt sind. In die Adresszeile des Browsers gibt man™ auch Adressen ohne Protokoll ein.

                Ja, da gebe ich dir Recht. Das ist aber trotz allem nicht das gleiche, wie eine Seite in einem Posting zu verlinken. Wenn ich was in meine Browseraddresszeile angebe, dann gewöhnlich doch blos ne kurze url zur landing page (also z.b. forum.de.selfhtml.org), die ich oft genug auswendig weiß und deshalb von Hand und aus Bequemlichkeit ohne Protokoll eingeb. In einem Posting möchte ich aber in fast allen Fällen nicht auf eine Landing Page verweisen, sondern auf eine Unterseite mit dem speziell relevanten Inhalt (http://forum.de.selfhtml.org/cgi-bin/user/fo_post?fupto=218634%2C1506149). Das tippe ich in den allermeisten Fällen nicht von Hand und bei Copy/Paste hängt das Protokoll immer mit dran.

                Wollte meine Argumentation nur nochmal klarstellen ;) Welcher Mehraufwand dem Nutzer entsteht und ob dieser zumutbar ist oder nicht oder ob es überhaupt legitim ist, Mehraufwand entstehen zu lassen, darüber kann man sicher auch Glaubenskriege führen :D

                Das wichtigste ist, dass unser lieber T-Rex nun ein paar Ansätze mit den jeweiligen fürs und wieders an der Hand hat; welcher der geeignetste ist, ist sowieso auch vom konkreten Einsatzgebiet abhängig. An dieser Stelle auch nochmal Dank an dich und dedlfix für die hilfreichen Ergänzungen!

                Grüße,

                RIDER

                --
                Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
                ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
    2. Hi

      Ich denke damit decke ich schon recht viel ab. Die Merkmale sind jedoch ungenau.

      EXTREM ungenau.

      Absolut betrachtet auf jeden Fall. Aber es stellt sich die Frage ob sie nicht trotzdem ausreichend sind/sein können.

      Gibt es eventuell einen Regulären Ausdruck, der mir sagt ob es externe Links sind?

      Fast* alle aufgeführten Merkmale (inkl. der Ergänzungen von Andreas) lassen sich auch mittels CSS-Selektoren beschreiben.

      Gruß
      Ole

      *"kann XYZ enthalten, muss aber nicht" ist zugegebenermaßen problematisch.

      1. Fast* alle aufgeführten Merkmale (inkl. der Ergänzungen von Andreas) lassen sich auch mittels CSS-Selektoren beschreiben.

        Auch wenn das möglich ist, möchte ich das nicht machen. Ich möchte mir weitere schritte offen halten z.B. ein target='blank' hinzufügen. Das geht dann mittels css nicht mehr. Deshalb ist css diesmal keine Lösung.

        Gruß
        Deutschland-weiter-streik-Koordinator
        T-Rex

        1. Aloha,

          da hab ich doch noch was gefunden: In search of the perfect URL validation regex

          Vielleicht hilft dir das ja ein bisschen weiter.

          Gruß
          Ole

        2. @@T-Rex:

          nuqneH

          Ich möchte mir weitere schritte offen halten z.B. ein target='blank' hinzufügen.

          Och nö, bitte das nicht.

          “Opening up new browser windows is like a vacuum cleaner  sales person who starts a visit by emptying an ash tray on the customer's carpet. Don't pollute my screen with any more windows, thanks […]” (Top Ten Mistakes in Web Design, Punkt 9 [Nielsen]) S.a. Diskussion im Thread Internetseitenlink im neuen Fenster öffnen

          Qapla'

          --
          „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
          1. Das neue Forum braucht unbedingt eine Fettung, damit ich Sachen wie z.B. fett machen kann.
            War ja nur ein Beispiel.

            Gruß
            Beispielloser
            T-Rex

            1. Hallo T-Rex!

              Das neue Forum braucht unbedingt eine Fettung, damit ich Sachen wie z.B. fett machen kann.

              Sag' das doch gleich, dass du am JS für das neue Forum arbeitest ...! :-P

              Und dann bau' gleich noch einen "Link-Check" mit ein (für externe Links braucht's aber wegen der "Same-Origin-Policy" bspw. ein Skript auf dem Server, auf welches du per JS zugreifen kannst).

              Gruß
              Gunther

              1. Das neue Forum braucht unbedingt eine Fettung, damit ich Sachen wie z.B. fett machen kann.

                Sag' das doch gleich, dass du am JS für das neue Forum arbeitest ...! :-P

                Das stimmt zwar teilweise, dass wollte ich damit aber nicht sagen *hmpf*. Ich wollte Gunnar nur darauf hinweisen, dass es ein Beispiel war.
                Außerdem wäre eine Fettung generell nicht schlecht. Dann kann ich meinen Nick endlich meiner Körperform anpassen.

                Und dann bau' gleich noch einen "Link-Check" mit ein (für externe Links braucht's aber wegen der "Same-Origin-Policy" bspw. ein Skript auf dem Server, auf welches du per JS zugreifen kannst).

                Darüber habe ich auch schon nachgedacht. Da gibt es aber wieder viele Probleme.
                Wenn der User auf "Link" klickt, soll er einen Link eingeben. Jetzt kann man natürlich einen "Link-Check" einbauen. Dann kommen in die Textarea nur gültige Links.
                1. Problem, der User kann jetzt in der Textarea die Linksyntax ändern.
                2. Problem, ein Link der heute gültig ist kann morgen schon einen 404 bringen.

                Gruß
                <fat><b>**T-Rex**</b></fat>

                1. Hallo T-Rex!

                  Und dann bau' gleich noch einen "Link-Check" mit ein (für externe Links braucht's aber wegen der "Same-Origin-Policy" bspw. ein Skript auf dem Server, auf welches du per JS zugreifen kannst).

                  Darüber habe ich auch schon nachgedacht. Da gibt es aber wieder viele Probleme.
                  Wenn der User auf "Link" klickt, soll er einen Link eingeben. Jetzt kann man natürlich einen "Link-Check" einbauen. Dann kommen in die Textarea nur gültige Links.

                  1. Problem, der User kann jetzt in der Textarea die Linksyntax ändern.

                  Nein, ein solcher "Check" darf natürlich erst_nach_dem Absenden des Postings, aber_vor_der Veröffentlichung, quasi als Zwischenschritt erfolgen.

                  Und im Falle eines "Fehlers" (404) muss der User also wieder zurück zur Eingabe kommen, mit einem entsprechenden Hinweis auf den/ die fehlerhaften Link(s).

                  1. Problem, ein Link der heute gültig ist kann morgen schon einen 404 bringen.

                  Kein Problem - was morgen ist, braucht uns heute nicht zu interessieren! ;-)

                  Ist ja logisch, dass du nicht gewährleisten kannst, dass ein heute gültiger Link morgen nicht mehr existent ist.

                  Gruß
                  Gunther

                  1. Ist ja logisch, dass du nicht gewährleisten kannst, dass ein heute gültiger Link morgen nicht mehr existent ist.

                    Naja theoretisch doch.
                    Deine erste Logik braucht ein Verfahren, dass die Links aus einem Fließtext holt. Dann wird geprüft ob sie gültig sind.
                    So ein Verfahren kann man vor dem Anzeigen des Postings auch machen. Ist der Link nicht mehr aktiv wird der Linktext ersetzt "Dieser Link ist nicht mehr gültig" und der Link href wird zu einer Infoseite gesetzt wo einem erklärt wird wieso sich der Linktext geändert hat - "Qualitätsprüfung".

                    So oder so habe ich damit jedoch nichts zu tun, da ich der JS Man bin, der die lustige Knopflogik macht.

                    Gruß
                    lustiger Knöpfchen Dino
                    T-Rex

                    1. Tach!

                      Ist ja logisch, dass du nicht gewährleisten kannst, dass ein heute gültiger Link morgen nicht mehr existent ist.
                      Naja theoretisch doch.

                      Praktisch lässt man das lieber bleiben.

                      Deine erste Logik braucht ein Verfahren, dass die Links aus einem Fließtext holt. Dann wird geprüft ob sie gültig sind.
                      So ein Verfahren kann man vor dem Anzeigen des Postings auch machen. Ist der Link nicht mehr aktiv wird der Linktext ersetzt "Dieser Link ist nicht mehr gültig" und der Link href wird zu einer Infoseite gesetzt wo einem erklärt wird wieso sich der Linktext geändert hat - "Qualitätsprüfung".

                      Lässt man den Server testen, will man das dann vor jedem Aufruf machen? Oder einmal je $zeiteinheit für das gesamte Archiv?

                      Oder lässt man den Client einen ungewollten Ajax-Request ausführen?

                      Mit ersterem möchte ich die Server (unseren und die Ziele) nicht belasten, mit letzterem strapaziert man den Datenschutz ziemlich stark.

                      dedlfix.

                      1. Tach!

                        Lässt man den Server testen, will man das dann vor jedem Aufruf machen? Oder einmal je $zeiteinheit für das gesamte Archiv?

                        Oder lässt man den Client einen ungewollten Ajax-Request ausführen?

                        Ich würde das nur einmalig nach dem Absenden eines Postings machen. Und zwar auch nur, um evt. Tippfehler direkt zu erkennen, bzw. "tote Links" von vornherein zu vermeiden.

                        Und wenn ein User den Link nachträglich (aufgrund der neuen Editiermöglichkeit) ändert, dann sollte auch der Check erneut ausgeführt werden.

                        Gruß
                        Gunther

  2. Moin,

    da gibt es die Möglichkeit, dass der User einen Link eingibt. Bei externen Links möchte ich eine kleine Grafik anzeigen, die symbolisiert, dass dieser Link nach außen führt.
    Problem wie erkenne ich externe links?

    Moin Moin,

    Wozu, Warum?

    Ist nicht jeder Link, der nicht intern ist, extern?
    Vom Intranet ins Internet?

    1. Wozu, Warum?

      Hab ich doch geschrieben.

      Ist nicht jeder Link, der nicht intern ist, extern?

      Ja. Problem bleibt aber bestehen.

      Gruß
      Interner
      T-Rex

  3. Moin,

    ich behaupte mal, dass jeder "URI", der _kein_ Schema enthält, auf interne Resourcen im aktuellen Kontext verweisen _will_ (die Interpretation dessen ist aber eine clientseitige Sache). Ansonsten bleibt nur der Vergleich mit dem FQN der aktuellen Seite.

    Generell würde ich eher von deinem Vorhaben abraten. Ein Link ist ein Link ist ein Link ist ein Link. Wenn man es dennoch umsetzen nöchte (interne/externe Kennung), dann würde ich persönlich prüfen, ob die letzten zwei Zeichenketten (Trenner ist der Punkt) übereinstimmen. Also zum Beispiel ob der FQN auf .selfhtml.org/ endet (Bei DNS kommt noch ein Punkt hinzu, darauf möchte ich jetzt mal verzichten).

    Allerdings ist dies keine gute Prüfung, da diese einige Besonderheiten für den internationalen Raum ausläßt und zudem nichts über die Gültigkeit des Hyperlinks aussagt. So wäre zum Beispiel "unfug.selfhtml.org/" ein interner Link!

    Ok, ich versuche mal ein Resume zu erstellen: ein interner Link ist ein Hyperlink, der durch ein redaktionelles System oder entsprechend authorisierter Beutzer erstellt und als solcher gekennzeichnet wurde.

  4. Also ich denke, ich werde den Ansatz mit dem zwingenden http gehen. Camping_RIDER hat einfach recht. Ich kopier auch immer die URL aus der Adresszeile. Sogar wenn ich es in Facebook veröffentliche und die Ziel URL einen Like Button hat.
    Auch bei "internen" Verlinkungen würde ich als USer die Seite aufrufen um sicher zu gehen dass es die richtige ist und dann wieder aus der Adresszeile die Url kopieren. Ich glaube das würde sogar mein Vater machen, der Yahoo für die Startseite des Internets hält und den IE als das Tor zur Welt.

    Danke für eure Hilfe / Gedanken / Zeit / Anmerkungen / Lobgesänge (ach nee moment mal ihr seit ja gar nicht meine Affaire...hmm)

    Gruß
    Hängste die am Hang stehen schreibt man mit ä
    T-Rex

    1. @@T-Rex:

      nuqneH

      Camping_RIDER hat einfach recht.

      Hat er das?

      Auch bei "internen" Verlinkungen würde ich als USer die Seite aufrufen um sicher zu gehen dass es die richtige ist und dann wieder aus der Adresszeile die Url kopieren.

      Der Usecase für relative Angaben wäre also welcher? Keiner?

      Wenn niemand relative Angaben verwendet, wozu dann die zwingende Angabe des Protokolls?

      Qapla'

      --
      „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
      1. Moin ;)

        Der Usecase für relative Angaben wäre also welcher? Keiner?

        Wenn niemand relative Angaben verwendet, wozu dann die zwingende Angabe des Protokolls?

        Das ist nicht der springende Punkt. Der Grund, warum du gegen zwingende Angabe des Protokolls bist, ist doch gerade der, dass Nutzer damit Restriktionen unterworfen sind - wenn es tatsächlich keinen Usecase gibt, dann umso besser - dann ist es nämlich eine nicht bemerkbare Restriktion und von daher keine Restriktion. Du drehst die Argumentation hier um. Wenn es nur einen marginalen Usecase dann ist das doch kein Grund, die Restriktion fallen zu lassen, sondern eher ein Grund, warum man sie bedenkenlos einsetzen kann.

        Man kann allerdings nicht daraus, dass diese Beschränkung für die meisten Nutzer keine Auswirkungen zeigt, darauf schließen, dass sie unnötig wäre. Schließlich ging es in diesem Thread doch nur um eins: Darum, wie es möglich ist, eine Nutzereingabe zweifelsfrei entweder einem internen oder einem externen Verweisziel zuzuordnen. Und wenn ich das tatsächlich zweifelsfrei möchte (und um nichts anderes ging es hier, schwache Kriterien hatte T-Rex ja schon genug), dann möchte ich auch für den unwahrscheinlichen Fall einer relativen Pfadangabe nicht darauf verzichten.

        Nicht zuletzt ist die ganze Geschichte doch einfach eine Abwägung zwischen dem konkreten Nutzen und den konkreten Kosten einer solchen Restriktion. Die Kostenseite ist (da es wie du selbst schon sagst nur in den allerseltensten Fällen einen Usecase gibt) sehr überschaubar. Den Nutzen einer zweifelsfreien Zuordnung, ob intern oder extern, sehe ich da schon eher. Manche User möchten einfach nicht unwissentlich per Link aus einer reputablen Webpräsens auf zweifelhafte Seiten umgeleitet werden. Das ist auch eine Sicherheitsfrage; schließlich ist es unter Umständen immer möglich, sich auch bei einem nur kurzen Seitenbesuch einen Virus per Drive-By-Download einzufangen. Wenn der von einem anderen User in einem Posting angegebene Link nun eine(n) Linktext/Linkbeschreibung enthält, die absolut unbedenklich scheint, so wäre ich als User überaus dankbar darüber, in Form eines kleinen Icons darauf hingewiesen zu werden, dass der gepostete Link eventuell mit Vorsicht zu genießen ist - auch an das Thema Phishing zu denken ist hier vielleicht gar nicht verkehrt. Nicht umsonst verwenden E-Mail-Anbieter oder Dienste wie Steam ein ähnliches System (nämlich über eine Umleitungsseite, die über das Verlassen des Webangebots informiert) - auch dort bin ich jederzeit bereit, eine kurze zusätzliche Wartezeit in Kauf zu nehmen.

        Ich bin ganz deiner Meinung, dass Webdeveloper ihre Schwierigkeiten nicht auf den User abwälzen sollten. Wenn es aber darum geht, ein für viele potenziell nützliches Feature einzubauen, welches nicht ohne eine kleine Restriktion in Ausnahmefällen auskommt, dann kann man sicher nicht vom Probleme abwälzen sprechen.

        (Und noch einmal um es ganz klar zu machen: Ohne Protokollangabe gibt es nie 100%ige Sicherheit über die Intention des Users oder auch die Interpretation des eigenen Browsers, so dass ohne eine solche Sicherheit ein Feature wie die Markierung externer Links keinen derart großen Mehrwert mehr bietet, da es insbesondere dann nicht mehr zuverlässig funktionieren kann und somit auch keinen Sicherheitsmehrwert mehr bietet)

        Grüße,

        RIDER

        --
        Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
        ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
        1. @@Camping_RIDER:

          nuqneH

          Man kann allerdings nicht daraus, dass diese Beschränkung für die meisten Nutzer keine Auswirkungen zeigt, darauf schließen, dass sie unnötig wäre. Schließlich ging es in diesem Thread doch nur um eins: Darum, wie es möglich ist, eine Nutzereingabe zweifelsfrei entweder einem internen oder einem externen Verweisziel zuzuordnen. Und wenn ich das tatsächlich zweifelsfrei möchte (und um nichts anderes ging es hier, schwache Kriterien hatte T-Rex ja schon genug), dann möchte ich auch für den unwahrscheinlichen Fall einer relativen Pfadangabe nicht darauf verzichten.

          Dau möchtest dafür auf den eher wahrscheinlichen Fall einer Angabe ohne Protokoll verzichten? Wir sind uns – glaube ich – einig, dass man kaum beides haben kann. Jedenfalls nicht zweifelsfrei.

          Übliches Dreieck:
                         zweifelsfreie Erkennung
                              /       \ relative Angabe möglich — Angabe ohne Protokoll möglich

          Wähle zwei davon, aber nicht alle drei.

          Man muss also abwägen: Was bringt dem Nutzer mehr: relative Angaben machen zu können oder das Protokoll weglassen zu können?

          Ich sehe für ersteres keinen Usecase. Und die Frage nach einem solchen konnte von niemandem beantwortet werden. Deeplinks kopiert man aus der Adresszeile, da hat man die Angabe bereits absolut (http://www.example.net/foo?bar=baz#quz).

          Angaben von Homepages hingegen gibt der Nutzer oft direkt ein. Von der Adresszeile (und Angaben von Webadressen in Printmedien, auf Visitenkarten usw.) ist er gewöhnt, dass er das Protokoll weglassen kann: www.example.net.

          Meine Abwägung ist daher zugunsten der Angabe ohne Protokoll, dafür aber keine relativen Angaben. Sollte es Gründe für eine andere Abwägung geben, her damit.

          Qapla'

          PS. Dein Argument bezüglich Sicherheit habe ich so verstanden, dass du auf jeden Fall die zweifelsfreie Erkennung aus dem Dreieck dabeihaben möchtest, nicht relative Angabe möglich und Angabe ohne Protokoll möglich.

          --
          „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
          1. Hi Gunnar ;)

            Übliches Dreieck:
                           zweifelsfreie Erkennung
                                /       \ relative Angabe möglich — Angabe ohne Protokoll möglich

            Wähle zwei davon, aber nicht alle drei.

            Schöne Aufstellung - dem kann ich nur zustimmen.

            Meine Abwägung ist daher zugunsten der Angabe ohne Protokoll, dafür aber keine relativen Angaben. Sollte es Gründe für eine andere Abwägung geben, her damit.

            Okay - ich verstehe deine Argumente. Und wie du schon selbst sagst, ist es offenbar eine Frage persönlicher Prioritäten bzw. persönlicher Abwägung. Dem habe ich nichts hinzuzufügen. Jeder soll selbst entscheiden, welche Seite des Dreiecks für ihn/sie die wichtigste ist :)

            Grüße,

            RIDER

            --
            Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
            ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
      2. Hat er das?

        In meinen Augen ja.

        Wenn niemand relative Angaben verwendet, wozu dann die zwingende Angabe des Protokolls?

        Wenn jemand in ein Datumfeld ein Datum eingeben soll und dieses Datumsfeld per html Attribut eine Restiriktion erhält, würdest du serverseitig trotzdem nochmal prüfen? Ich schon - inklusive Fehlerausgabe. Ich bin ein Fan von Transparenz. Der User soll sehen wie doof er ist!
        Und wie sagte ein kluger Dino damals im Jahr 2014?

        Gruß
        Wissen ist männlich, Fehler sind Menschlich
        T-Rex

        1. @@T-Rex:

          nuqneH

          Der User soll sehen wie doof er ist!

          Jemandmit dieser Einstellung sollte keine Webseiten oder Software entwickeln.

          Qapla'

          --
          „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
          1. Aloha krakatoa!

            Der User soll sehen wie doof er ist!

            Jemandmit dieser Einstellung sollte keine Webseiten oder Software entwickeln.

            Ich denke T-Rex polarisiert mit dieser Aussage absichtlich :) Ich muss allerdings sagen, dass ich das Ganze mit gewissen Einschränkungen teils ähnlich sehe. In meinen Anfangszeiten habe ich Webseiten entwickelt, die User des IE von vornherein ausgesperrt haben - IE-Kompatibilität meiner Seite hin oder her. Ich sage nicht, dass ich das heute noch genauso machen würde, oder dass das ein guter Ansatz wäre. Aber ich stehe zu der Einstellung, die dahinter steht.

            Ich habe manchmal das Gefühl, wir als Webdeveloper stehen als eine Art Sklave vieler Herren zwischen User, Browserherstellern und Co. Ich finde es nicht schlimm, wenn man sich innerhalb gewisser Grenzen emanzipiert und an manchen Stellen auch mal dem User sagt: "Ich akzeptiere deine Eingabe nicht, machs ordentlich!" :D

            Neulich hab ich hier in ner Signatur nen Spruch gelesen - ich glaube es war der hier:

            "Progress: The process through which the Internet has evolved from smart people in front of dumb terminals to dumb people in front of smart terminals."

            Ich finds allgemein gesprochen nicht schlimm, wenn man Leute manchmal ans Mitdenken erinnert ;) Und dass T-Rex das vor dem Hintergrund seiner Arbeit und seines Chefs so sieht, wundert mich erst recht nicht :D

            Grüße,

            RIDER

            --
            Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
            ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[