ブランド宣伝スパムを締め出す
自サイトにPHPの掲示板を設置しているのですが、長い事下記のようなスパム投稿に悩まされていました。

ロレックス、シャネル、財布、手帳、腕時計JP-ROLEX
吉田 拓也
ロレックス、シャネル、財布、手帳、腕時計JP-ROLEX
当店の主要な経営のブランド:ルイ.ヴィトン (LOUIS VUITTON)、
グッチ (GUCCI)、エルメス (HERMES)、シャネル (CHANEL)、
コーチ (COACH)、ブルガリ (BVLGARI)、 (CHLOE)、ROLEX ロレス、
OMEGA オメガ、FRANCK MULLER、IWC.
各種ブランドのかばん、財布、腕時計
ロレックス 時計 シャネル 時計
ブルガリ 時計 カルティエ 時計
オメガ 時計 チュードル時計
ルイヴィトン 時計 フランク
エルメス 腕時計 恋人時計
▲信用第一、良い品質、低価格は。
広大な客を歓迎して買います!
当社URL: http://www.jp-rolex.com
店長:吉田 拓也
連絡先: jprolex@188.com
腕時計専売店:http://www.n-watch.net

ロレックス(Rolex)、シャネル 時計直営店★Lvgoogle.net★
ブランド財布 グッチ バッグ 腕時計
★ S/SS品質 シリアル付きも有り 付属品完備!
当社の商品は絶対の自信が御座います。
高品質 安心 最低価格保証
商品の数量は多い、品質はよい、価格は低い、現物写真!
経営方針: 品質を重視、納期も厳守、信用第一は当社の方針です。
高品質な商品を超格安価格で、安心、迅速、確実、にお客様の手元にお届け致します。
豊富な品揃えで最新作も随時入荷致しておりますのでごゆっくりとご覧ください。
★ 税関の没収する商品は再度無料にして発送します
★送料無料(日本全国)★
URL: http://www.lvgoogle.net
【超人気質屋】
店長 : 福田 穗子
E-mail: lvgoogle@188.com
UGG靴専店:http://www.yahoougg.net
支店:http://www.k-rolex.net


自分の使っているJubei Inc.さんによるPHPスクリプトはスパム投稿をブロックするようになってるのですが、これはそれをすり抜けてしまう模様。
やむなく、自分でPHPをいじくり、ブランド名が入っていればブロックするという処理を書き加えました。

詳しい内容は以下。

2011.12.25 追記
書き直しました。古い内容は打ち消し線引いてます。

<元々書かれていたスクリプト(データファイルに書き込む部分だけ抜粋)>
$fp = fopen(DATA_FILE, 'wb');
set_file_buffer($fp, 0);
flock($fp, LOCK_EX);
rewind($fp);

fwrite($fp, $line . "n");
fwrite($fp, join('', $allrecords));

fclose($fp);


<自分で書き直したスクリプト>
if (!preg_match('/^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/',$host) && substr($host, -3)!='.cn') {
$fp = fopen(DATA_FILE, 'wb');
set_file_buffer($fp, 0);
flock($fp, LOCK_EX);
rewind($fp);

fwrite($fp, $line . "n");
fwrite($fp, join('', $allrecords));

fclose($fp);
}


何をしているかというと、ホスト部分がIPアドレスのみで構成されているか、.cnで終わる場合は書き込まない、という仕組みを加えたのです。
普通、ホスト部分は、私は自宅からですと「exxx-xx-xx-xxx-xxx.uqwimax.jp」
という感じでIPアドレスにプロバイダを差すアルファベットが付属していますが、スパムは「123.45.67.89」とIPだけ。
もしくは中国ドメインを意味する.cnが末尾につきます。

というわけで、試しにこのようなホストの場合は書き込みを許さないようにしてみました。
これでうまくいくでしょうか。

2012.1.15 追記
ぶろぐん+(このブログのこと)へのコメントにも同じような投稿がわいてきたので、スクリプトを付け加えました。
もういい加減にして欲しい。

<場所>
ぶろぐん+のフォルダ→index.php の459行目付近
if (!$entry_id || !$utf_name || !$utf_mes || !blogn_check_token($token, 'blogn_index_token')) {


$host = gethostbyaddr($ip);
if (!$entry_id || !$utf_name || !$utf_mes|| !blogn_check_token($token, 'blogn_index_token') || preg_match('/^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/',$host) || substr($host, -3)=='.cn') {



if ( strpos( $useragent, 'TencentTraveler') === false && strpos( $this->body, 'ルイヴィトン') === false && strpos( $this->body, 'ブラダ') === false && strpos( $this->body, 'シャネル') === false && strpos( $this->body, 'エルメス') === false && strpos( $this->body, 'グッチ') === false && strpos( $this->body, 'ロレックス') === false && strpos( $this->body, 'フェンディ') === false && strpos( $this->body, 'バレンシアガ') === false ) {
// 現在ログの先頭へ出力
$fp = fopen(DATA_FILE, 'wb');
set_file_buffer($fp, 0);
flock($fp, LOCK_EX);
rewind($fp);

fwrite($fp, $line . "n");
fwrite($fp, join('', $allrecords));

fclose($fp);
}


UserAgent(ユーザエージェント)にTencentTravelerという文字が含まれているか、投稿本文にブランド名が入っていれば掲示板のデータファイルに書き込ませない、という仕組みです。
TencentTravelerというのはどうも中国発のブラウザらしい。※参考

一応措置は講じてみたものの、ブランド名は無数にあるし、「シャ○ル」という書き込みには無力。
根本的には解決できていない状況です。

| PHP | 00:30 | comments (0) | trackback (0) |
コメント
コメントする




この記事のトラックバックURL
http://kodawari.sakura.ne.jp/blogn/tb.php/78
トラックバック


  
CALENDAR
S M T W T F S
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31       
<<   10 - 2021   >>
LOGIN
現在のモード: ゲストモード
USER ID:
PASS:
CATEGORIES
ARCHIVES
COMMENTS
TRACBACK
PROFILE
OTHERS
POWERED BY
POWERED BY
ぶろぐん