38

コメントなどのテキスト文字列内の Web サイト リンクを (正規表現またはヒューリスティックを使用して) 検出するにはどうすればよいですか?

目的は、スパムを防止することです。HTML が削除されているため、コピー アンド ペーストへの招待を検出する必要があります。 ほとんどのユーザーはページにうまくアクセスできないため、スパマーがリンクを投稿するのは経済的ではありません。ベスト プラクティスに関する提案、参考資料、またはディスカッションを希望します。

いくつかの目的:

  • 適切な形式の URL などの簡単な成果 ( http://some-fqdn/some/valid/path.ext)
  • プレフィックスなしの URL http://(つまり、有効な FQDN + 有効な HTTP パス)
  • その他の面白いビジネス

もちろん、スパムをブロックしていますが、同じプロセスを使用してテキストを自動リンクすることもできます。

アイデア

ここに私が考えていることがいくつかあります。

  • コンテンツは母国語の散文なので、検出に満足できます
  • " " をキャッチするために、最初にすべての空白を削除する必要がありwww .example.comますか? 一般的なユーザーは、自分でスペースを削除することを知っていますか、それともブラウザーが「何を意味するか」を実行して削除することを知っていますか?
  • おそらく、複数のパスがより良い戦略であり、次のスキャンがあります。
    • 整形式の URL
    • すべての非空白の後に「.」が続きます。任意の有効な TLD が続く
    • 他に何か?

関連する質問

私はこれらを読み、現在ここに文書化されているため、必要に応じてこれらの質問で正規表現を参照することができます。

アップデートとまとめ

うわー、私はいくつかの非常に優れたヒューリスティックがここにリストされています! 私にとって、最高の費用対効果は、次の統合です。

  1. @Jon Bright の TLD を検出する手法 (優れた防御チョークポイント)
  2. これらの疑わしい文字列については、@capar に従って、ドットをドットに見える文字に置き換えます
  3. @Sharkey の下付きの · は、ドットのように見える良い文字です。(すなわち " · ")。· は単語境界でもあるので、さりげなくコピー&ペーストするのは難しいです。

これでスパマーの CPM は私のニーズに対して十分に低くなるはずです。「不適切としてフラグを立てる」ユーザーのフィードバックは、他のものをキャッチする必要があります。リストされている他のソリューションも非常に役立ちます。

  • すべてのドット四角形を取り除きます(@Sharkeyのコメントは彼自身の答えです)
  • 必須の非表示フィールドをフォームに挿入するクライアント側 Javascript に対する @Sporkmonger の要件。
  • URL サーバー側に ping を実行して、それが Web サイトであるかどうかを確認します。(おそらく、@Nathan のように、SpamAssassin または別のベイジアン フィルターを介して HTML を実行できます。)
  • Chrome のスマート アドレス バーのソースを調べて、Google がどのような巧妙なトリックを使用しているかを確認します
  • スパム/マルウェア検出のために OWASP AntiSAMY またはその他の Web サービスを呼び出します。
4

13 に答える 13

19

スパマーを避けるために、回答に集中しています。これは、2 つのサブ仮定につながります。つまり、システムを使用する人々は積極的にチェックに違反しようとします。目標は URL の存在を検出することだけであり、完全な URL を抽出することではありません。目標が別のものである場合、このソリューションは異なって見えます。

あなたの最善の策は、TLDを使用することになると思います。2 文字の ccTLD と、(現在) 比較的少数のその他のリストがあります。これらは、ドットを先頭に付け、スラッシュまたは単語境界のいずれかを末尾に付ける必要があります。他の人が指摘したように、これは完璧ではありません。正当な「もう一度試してみましたが、うまくいきません」などを拒否せずに、「ファンキーな医薬品を購入してください」を取得する方法はありません。そうは言っても、これは私の提案です:

[^\b]\.([a-zA-Z]{2}|aero|asia|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel)[\b/]

これが得るもの:

  • buyfunkypharmaceutical s.it
  • グーグルe.com
  • http://stackoverflo **w.com/**questions/700163/

もちろん、人々が「.」を置き換えて URL を難読化し始めるとすぐに壊れます。「ドット」で。しかし、スパマーがここでのあなたの目標であると仮定すると、彼らがそのようなことをし始めると、クリックスルー率はゼロに向かってさらに数桁低下します. URL の難読化を解除するのに十分な情報を持っている人々のグループと、スパム サイトにアクセスするのに十分な情報を持っていない人々のセットには、ごくわずかな共通点があると思います。このソリューションにより、巻き添え被害を最小限に抑えながら、コピーしてアドレス バーに貼り付けることができるすべての URL を検出できるようになります。

于 2009-04-15T12:15:07.390 に答える
6

これが自動リンクテキストに役立たないことはわかっていますが、検索して、すべてのピリオドを同じように見える文字 (ヘブライ語のポイント hiriq (U+05B4) の Unicode 文字など) に置き換えたらどうなるでしょうか?

次の段落は例です。

これでうまくいくかもしれません . ピリオドは少し奇妙に見えますが、まだ読めます . もちろん、利点は、誰でも www をコピーして貼り付けることができるということです .

于 2009-04-15T02:39:28.943 に答える
6

正規表現を使用して URL を検出することが、この問題を解決する正しい方法であるかどうかはわかりません。通常、スパマーが十分な動機を持っている場合に悪用できる、ある種のあいまいなエッジ ケースを見逃すことになります。

コメントからスパムを除外することが目的である場合は、ベイジアンフィルタリングについて検討することをお勧めします。電子メールをスパムとしてフラグ付けする際に非常に正確であることが証明されています.フィルタリングする必要があるテキストの量によっては、同様に同じことができる場合があります.

于 2009-04-14T03:10:11.140 に答える
4

明らかに簡単に達成できるのは、http:// と www で始まるものです。「www . g mail . com」のようなものを除外しようとすると、どこまで行きたいかという興味深い哲学的疑問につながります。次のステップに進み、「www dot gee mail dot com」も除外しますか? 「world wide web の略語の後にドットが続き、その後に文字 g が続き、その後に単語 mail とドットが続き、最後にコマーシャルの TLD 略語が続く」のような URL の抽象的な説明はどうでしょうか。

アルゴリズムの設計を続ける前に、どのような種類のものをフィルタリングしようとしているのかを明確にすることが重要です。「gmail.com」はURLとみなされるレベルで線を引くべきだと思いますが、「gmail.com」はそうではありません。そうしないと、誰かが文の最初の文字を大文字にしないたびに、誤検知が発生する可能性があります。

于 2009-04-14T20:09:09.067 に答える
3

主にブラウザーのアドレス バーにコピー アンド ペーストするための招待状を探しているので、オープン ソース ブラウザー (Chrome や Mozilla など) で使用されているコードを調べて、テキストが「アドレス バーに入力されたかどうか」を判断することをお勧めします。同等" は、検索クエリまたは URL ナビゲーションの試行です。

于 2009-04-15T12:55:59.273 に答える
2

可能性のある URL を ping する

サーバー側の計算が少し気にならない場合は、次のようなものはどうでしょうか?

urls = []
for possible_url in extracted_urls(comment):
    if pingable(possible_url):
       urls.append(url)  #you could do this as a list comprehension, but OP may not know python

ここ:

  1. Extract_urls はコメントを取り込み、保守的な正規表現を使用して候補を抽出します

  2. pingable は、実際にはシステム コールを使用して、ホスト名が Web 上に存在するかどうかを判断します。単純なラッパーで ping の出力を解析することができます。

    [ramanujan:~/base]$ping -c 1 www.google.com

    PING www.l.google.com (74.125.19.147): 56 データ バイト 74.125.19.147 からの 64 バイト: icmp_seq=0 ttl=246 time=18.317 ms

    --- www.l.google.com ping 統計 --- 1 パケットが送信され、1 パケットが受信され、0% のパケット損失ラウンドトリップ min/avg/max/stddev = 18.317/18.317/18.317/0.000 ms

    [ramanujan:~/base]$ping -c 1 fooalksdflajkd.com

    ping: fooalksdflajkd.com を解決できません:不明なホスト

欠点は、ホストが 404 を返した場合、それを検出できないことですが、これは非常に良い最初のカットです。アドレスが Web サイトであることを確認する最終的な方法は、そのアドレスに移動することです。その URL を wget することもできますが、それはより重いものです。

于 2009-04-18T07:01:36.507 に答える
1

OWASPAntiSAMYAPIの組み込みを検討してください...

于 2009-04-18T12:07:10.157 に答える
1

ここにはすでにいくつかの素晴らしい答えがあるので、これ以上投稿しません。ただし、いくつかの落とし穴を示します。まず、既知のプロトコルをテストするようにしてください。他のプロトコルはいたずらになる可能性があります。趣味がtelnetリンクに関係している人として、検索にhttp(s)以上を含めたいと思うかもしれませんが、たとえば目的や他のURLを避けたいと思うかもしれません。第二に、多くの人が< http://theroughnecks.net >のような山かっこ(gt / lt)または括弧 "(url)"でリンクを区切ることであり、リンクをクリックして閉じることほど悪いことはありません。 >または)残りのURLと一緒に行きます。

PS自己参照プラグについて申し訳ありません;)

于 2009-04-19T05:38:45.060 に答える
1

この正確なコードを書くために何度か試みましたが、絶対的な信頼性でこれを行うことはできず、RFC で許可されているすべての URI 形式を検出することはできません。幸いなことに、関心のある URL のセットは非常に限られているため、上記の手法のいずれかを使用できます。

しかし、私が確信を持って言えるもう 1 つのことは、スパマーを本当に打ち負かしたいのであれば、それを行う最善の方法は JavaScript を使用することだということです。何らかの計算を実行する JavaScript のチャンクを送信し、サーバー側で計算を繰り返します。コメントが送信されたときに計算結果も送信されるように、JavaScript は計算結果を隠しフィールドにコピーする必要があります。計算が正しいことをサーバー側で確認します。この手法を回避する唯一の方法は、スパマーが手動でコメントを入力するか、JavaScript エンジンを実行することです。この手法を使用して、サイトのスパムを 1 日 100 件以上から年 1 ~ 2 件に減らしました。現在、私が受け取ったスパムは、人間が手動で入力したものだけです。トピックに関するスパムを受信するのは奇妙です。

于 2009-04-15T12:41:25.737 に答える
1
于 2009-04-15T12:42:04.127 に答える
1

私はこれまでのところcaparの答えが一番気に入っていますが、Unicode フォントを扱うのは少し難しいかもしれません。 .. 私にとっては、ここのパイプの外側に表示されます |⋅|| たとえそれが彼らの間であっても。

便利な · があります。(・) でも、同じようにカットアンドペーストを壊します。垂直方向の配置は <sub> することで修正できます。例:

スタックオーバーフロー·コム

ひねくれていますが、とにかくFF3で効果的で、URLとしてカットアンドペーストすることはできません. <sub> は、URL を貼り付けることができない理由を視覚的に明らかにするので、実際には非常に優れています。

疑わしい URL に含まれていないドットはそのままにしておくことができるので、たとえば次のようにします。

s/\b\.\b/<sub>&middot;<\/sub>/g

もう 1 つのオプションは、疑わしいドットの横にある種のゼロ幅エンティティを挿入することですが、‍ のようなものです。と ‌ そして &zwsp; FF3では動かないようです。

于 2009-04-19T05:00:54.497 に答える