Das erkennen einer (frech oder nett) URL oder den link in einen text-string
Wie kann ich erkennen (mit regulären Ausdrücken oder Heuristik) eine Website-Verknüpfung in einem text wie ein Kommentar?
Zweck ist um spam zu verhindern. HTML wird entfernt, so dass ich brauchen, um festzustellen, Einladungen zu kopieren-und-einfügen. Sollte es nicht wirtschaftlich für einen spammer erlaubt, links zu posten, weil die meisten Benutzer nicht erfolgreich konnte man die Seite. Ich möchte Anregungen, Referenzen und Diskussion über best-practices.
Einige Ziele:
- Die niedrig hängende Frucht, wie die wohlgeformte URLs (
http://some-fqdn/some/valid/path.ext
) - URLs, aber ohne die
http://
Präfix (D. H. einen gültigen FQDN + gültigen HTTP-Pfad) - Andere lustige business
Natürlich, ich bin blockiert spam, aber der gleiche Prozess verwendet werden könnte, um die automatische link-text.
Ideen
Hier sind einige Dinge, die ich mir denke.
- Der Inhalt ist Muttersprache-die Sprache der Prosa, so kann ich trigger-happy in der Erkennung
- Sollte ich entfernen Sie alle whitespace-ersten zu fangen "
www .example.com
"? Wären gemeinsame Benutzer wissen, zu entfernen, den Raum selbst, oder irgendwelche Browser "do-what-I-mean" und " strip für dich? - Vielleicht mehrere Pässe ist eine bessere Strategie, mit der sucht nach:
- Wohlgeformte URLs
- Alle nicht-whitespace-Zeichen gefolgt von '.' gefolgt von einer gültigen TLD
- Etwas anderes?
Fragen
Ich gelesen habe diese und Sie sind jetzt hier dokumentiert, also können Sie nur Referenzen die regexes in diesen Fragen, wenn Sie wollen.
- ersetzen Sie URL mit HTML Links, javascript
- Was ist die beste regular expression um zu überprüfen, ob ein string eine gültige URL
- Erste Teile der URL (Regex)
Update und Zusammenfassung
Wow, ich gibt es einige sehr gute Heuristiken, die hier aufgeführten! Für mich der beste bang-for-the-buck ist eine Synthese der folgenden:
- @Jon Hell ist die Technik der Erkennung von TLDs (eine gute defensive kampfpunkt)
- Für diejenigen, die verdächtigen Zeichenfolgen ersetzen Sie den Punkt durch einen Punkt aussehenden Charakter als pro @capar
- Ein guter Punkt-Suche-Charakter ist @Sharkey ' s gelesen · (d.h. "·"). · ist auch eine Wort-Grenze, so ist es schwieriger, beiläufig copy & paste.
Sollte ein spammer CPM-Wert, der niedrig genug ist für meine Bedürfnisse; die "als unangemessen Kennzeichnen" feedback der Nutzer sollte sich fangen, sonst nichts. Andere Lösungen aufgelistet sind auch sehr nützlich:
- Streifen aus alle dotted-Quad (@Sharkey ' s Kommentar zu seiner eigenen Antwort)
- @Sporkmonger die Anforderungen für client-side Javascript, das fügt eine erforderliche verstecktes Feld in das Formular.
- Anpingen der URL-server-Seite, um festzustellen, ob es sich um eine Website. (Vielleicht könnte ich die HTML durch SpamAssassin oder anderen Bayes-filter als pro @Nathan..)
- Suche bei Chrome die Quelle für seine smart address bar, um zu sehen, was für clevere tricks Google verwendet
- Rief OWASP AntiSAMY oder andere web-Dienste für den spam - /malware-Erkennung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin, konzentriert sich meine Antwort auf den Versuch, zu vermeiden Spammer. Dies führt zu zwei sub-Annahmen: die Menschen mit dem system wird daher aktiv versuchen, gegen Ihren check und Ihre Ziel ist nur, zu erkennen, das Vorhandensein einer URL nicht extrahieren Sie die vollständige URL. Diese Lösung würde anders Aussehen, wenn Ihr Ziel ist etwas anderes.
Ich denke, Ihre beste Wette ist, gehen, um mit der TLD. Es sind die aus zwei Buchstaben bestehenden länderdomains und die (derzeit noch) vergleichsweise kleine Liste von anderen. Diese müssen mit einem Präfix versehen sein, die durch einen Punkt und Suffix durch einen Schrägstrich oder einige Wort-Grenze. Wie andere bemerkt haben, nicht so perfekt zu sein. Es gibt keinen Weg, um "buyfunkypharmaceuticals . es" ohne die Nichtanerkennung des legitimen ", versuchte ich es erneut. es funktioniert nicht" oder ähnliches. All das sagte, dies wäre mein Vorschlag:
Dinge wird dies:
Es wird natürlich brechen, sobald die Menschen starten Verschleierung von URLs zu ersetzen "." durch " dot ". Aber, wieder unter der Annahme Spammer Ihr Ziel, wenn Sie anfangen, das zu tun diese Art der Sache, Ihre click-through-raten gehen, fallen noch ein paar Größenordnungen in Richtung null. Die Menschen informiert genug, um Entwirre Sie eine URL, und die Menschen uninformiert genug, um zu besuchen, spam-sites haben, denke ich, zu einer kleinen Kreuzung. Diese Lösung sollten Sie erkennen, alle URLs kopieren und pasteable der Adressleiste, ohne die Kollateralschäden auf ein minimum.
Überprüfen Sie diesen Artikel:
Ich bin mir nicht sicher, ob die Erkennung von URLs mit einem regex ist der richtige Weg, um dieses problem zu lösen. In der Regel werden Sie vermissen irgendeine Art von obskuren edge-Fall, die Spammer nutzen können, wenn Sie motiviert genug sind.
Wenn Ihr Ziel ist nur zum filtern von spam-Kommentare, dann möchten Sie vielleicht denken über Bayes filtern. Es hat sich als sehr präzise in der E-Mail als spam Kennzeichnen, es könnte in der Lage sein, das gleiche zu tun für Sie, abhängig von der Menge an text, den Sie filtern müssen.
Ich weiß, das hilft nicht mit auto-link-text aber was, wenn Sie suchen, und ersetzt alle full-stop-Perioden mit einem Zeichen, das sieht aus wie die gleiche Sache, wie das unicode-Zeichen für Hebräisch-Punkt hiriq (U+05B4)?
Folgende Absatz ist ein Beispiel:
Könnte dies workִ Der Zeit sieht ein wenig seltsam, aber es ist immer noch readableִ Der Vorteil ist natürlich, dass jemand das kopieren und einfügen wwwִgoogleִcom nicht zu farִ 🙂
Gut, offensichtlich die niedrig hängenden Früchte sind Dinge, die beginnen mit http://und www. Versucht heraus zu filtern, die Dinge wie "www . g-mail . com" führt zu interessanten philosophischen Fragen, wie weit Sie gehen wollen. Wollen Sie nehmen es einen Schritt weiter und filtern "www dot gee mail dot com" auch? Wie über abstrakte Beschreibungen einer URL wie "Die Abkürzung für world wide web, gefolgt von einem Punkt, gefolgt von der Buchstabe g, gefolgt von dem Wort E-mail, gefolgt durch einen Punkt, abgeschlossen mit der TLD Abkürzung für "commercial".
Es ist wichtig, die Linie zu zeichnen von dem, was Arten von Dingen, die Sie gehen, um zu versuchen, zu filtern, bevor Sie weiter mit dem Versuch, Ihre design-Algorithmus. Ich denke, dass die Linie gezogen werden sollte, auf der Ebene, wo "gmail.com" als eine url, sondern "gmail. com" ist es nicht. Andernfalls bist du wahrscheinlich false positives jedes mal, wenn jemand ausfällt, um die Anfangsbuchstaben in einem Satz.
Da Sie in Erster Linie auf der Suche für die Einladungen zu kopieren und in Adresszeile eines Browsers, könnte es sein, lohnt sich ein Blick auf den verwendeten code in open-source-Browser (wie Chrome oder Mozilla) zu entscheiden, ob der eingegebene text in die "address bar äquivalent" ist eine Suchanfrage oder eine URL-navigation versuchen.
Ping URL
Wenn Sie don T Geist ein wenig server-side-Berechnung, was ungefähr so etwas wie das?
Hier:
extracted_urls nimmt in einem Kommentar und verwendet eine konservative regex zu ziehen aus den möglichen Kandidaten
"pingbar" geführt tatsächlich verwendet ein system rufen Sie, um zu bestimmen, ob der hostname vorhanden ist, auf der web. Sie könnten einen einfachen wrapper Parsen der Ausgabe des ping.
[ramanujan:~/base]$ping -c 1 http://www.google.com
PING http://www.l.google.com (74.125.19.147): 56 data bytes
64 bytes from 74.125.19.147: icmp_seq=0 ttl=246 time=18.317 ms
--- http://www.l.google.com ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max/stddev = 18.317/18.317/18.317/0.000 ms
[ramanujan:~/base]$ping -c 1 fooalksdflajkd.com
ping: cannot resolve fooalksdflajkd.com: Unbekannter host
Der Nachteil ist, dass wenn der host gibt ein 404, wirst du es nicht erkennen, aber das ist ein ziemlich guter Erster Schnitt -, der ultimative Weg, um zu überprüfen, dass eine Adresse ist eine website, um zu versuchen, um zu navigieren. Sie könnten auch versuchen, wget ' Ing, dass die URL, aber das ist mehr Schwergewicht.
Nachdem er mehrere versuche, genau dieses Stück code kann ich eindeutig sagen, werden Sie nicht in der Lage, das zu tun dieses mit absoluter Zuverlässigkeit, und Sie wird sicherlich nicht in der Lage sein zu erkennen, alle von der URI-Formen erlaubt, durch den RFC. Zum Glück, denn Sie haben einen sehr begrenzten Satz von URLs, die Sie in interessiert sind, können Sie irgendeine der oben beschriebenen Technik.
Jedoch die andere Sache, die ich kann sagen mit großer Sicherheit, ist, dass, wenn Sie wirklich wollen, zu schlagen Spammer, der beste Weg, dies zu tun ist, JavaScript zu verwenden. Senden Sie ein Stück JavaScript-Code, führt einige Berechnungen, und wiederholen Sie die Berechnung auf der server-Seite. Das JavaScript sollte kopieren Sie das Ergebnis der Berechnung in ein verstecktes Feld, so dass, wenn der Kommentar abgeschickt wird, wird das Ergebnis der Berechnung vorgelegt, wie gut. Überprüfen Sie auf der server-Seite, die Berechnung ist korrekt. Der einzige Weg, um diese Technik ist für die Spammer manuell eingeben oder Kommentare für Sie zu laufen beginnen, eine JavaScript-engine nur für Sie. Ich habe diese Technik zum reduzieren der spam auf meiner Website von 100+/Tag auf ein oder zwei pro Jahr. Jetzt ist der einzige spam den ich je bekommen wird eingegeben durch den Menschen manuell. Es ist seltsam, um on-topic spam.
Wissen Sie natürlich, wenn Spammer sich entscheiden, tinuyrl oder derartige Leistungen zu kürzen Ihrer URLs, die Ihr problem nur schlimmer. Möglicherweise müssen code schreiben, um sich die tatsächlichen URLs in diesem Fall, mit einem service wie TinyURL decoder
Berücksichtigen die Einbindung der OWASP AntiSAMY API...
Ich mag capar's Antwort die beste, so weit, aber der Umgang mit unicode-fonts kann ein bisschen nervenaufreibend, mit älteren Browsern oft anzeigen eine lustige Sache oder einer kleinen box ... und die Lage der U+05B4 ist ein wenig seltsam ... für mich scheint es außerhalb der Rohre hier |ִ| auch wenn es zwischen Ihnen.
Gibt es eine praktische · (·) obwohl, die Pausen Ausschneiden und einfügen in der gleichen Weise. Die vertikale Ausrichtung kann behoben werden, indem man <sub>ing es, zB:
stackoverflow·com
Pervers, aber wirksam in FF3 eh, es kann nicht Ausschneiden und einfügen als URL. Die <sub> ist eigentlich ganz nett, denn es macht es optisch klar, warum die URL nicht eingefügt werden.
Punkten, die nicht im Verdacht URLs kann allein gelassen werden, so zum Beispiel könnten Sie tun
Weitere option ist das einfügen eine Art von null-Breite Einheit weiter zu vermuten, dots, aber Dinge wie ‍ und ‌ und &zwsp; nicht zu funktionieren scheinen, in FF3.
Da gibt es schon einige gute Antworten hier, also werde ich nicht mehr posten. Ich gebe ein paar Fallstricke, obwohl. Erstens, stellen Sie sicher, dass der test für bekannt Protokolle, alles andere dürfen unartig sein. Als jemand, dessen hobby betrifft die telnet-links, werden Sie wahrscheinlich wollen, um mehr als http(s) in die Suche ein, kann aber möchten Sie verhindern, dass sagen Ziel: oder einige andere urls. Zweite, ist, dass viele Menschen begrenzen Ihre links in den Winkel-Klammern (gt/lt) wie <http://theroughnecks.net> oder in Klammern "(url)" und es gibt nichts Schlimmeres, als auf einen link klicken, und mit der Schließung > oder ) gehen, allong mit dem rest der url.
P. S. sorry für die self-referencing-Stecker 😉
Brauchte ich nur das erkennen von einfachen http-urls mit/aus Protokoll, vorausgesetzt, dass entweder das Protokoll gegeben ist oder eine " www " - Präfix. Ich fand die oben erwähnt link ganz hilfreich, aber am Ende kam ich mit diesem:
Bedeutet dies, offensichtlich, nicht test die Einhaltung der nach dem dns-standard.
Angesichts des Durcheinanders, des "anderen zicken", die ich sehe, in der Disqus Kommentar-spam in form von look-alike-Zeichen, die erste Sache Sie wollen zu tun ist, damit umzugehen.
Zum Glück, die Unicode-Menschen haben Sie abgedeckt. Graben, bis eine Implementierung der TR39-Skeleton-Algorithmus für Unicode-Confusables in Ihrer Programmiersprache der Wahl, und koppeln Sie es mit einigen Unicode-Normalisierung und Unicode-aware oberen/unteren Gehäuse.
Den skeleton-Algorithmus verwendet eine lookup-Tabelle verwaltet vom Unicode-Menschen etwas zu tun, was vom Konzept her ähnlich wie case-folding.
(Die Ausgabe kann nicht mit Hilfe einer sinnvollen Zeichen, aber, wenn Sie es anwenden, um beide Seiten des Vergleichs, erhalten Sie ein Spiel, wenn die Charaktere optisch ähnlich sind genug für einen Menschen zu bekommen, die auf Vorsatz.)
Hier ist ein Beispiel aus diese Java-Implementierung:
(Wie Sie sehen können, werden Sie wollen, um einige der anderen Normalisierung erste.)
Gegeben, dass Sie tun, URL-Erkennung für die Zwecke der Beurteilung, ob etwas spam ist, das ist wahrscheinlich einer von denen ungewöhnlich Situationen, in denen wäre es sicher zu starten, indem Sie die Normalisierung der Unicode zu NFKD und dann Strippen codepoints erklärt werden, die Kombination von Zeichen.
(Sie würden dann normalisieren wollen den Fall vor der Fütterung in den skeleton-Algorithmus.)
Ich würde empfehlen, dass Sie führen Sie einen der folgenden Schritte aus: