2月 19

今度は、フレンド申請を利用したスパムが流行っているそうなので簡単な業者対策を。

*対策其の1:時間的制約を設ける

以前ここで紹介した「メッセージスパム対策」と殆ど同じ方法です。
webapp/modules/pc/do/f_link_request_insert_c_friend_confirm.php
38行目に(OpenPNE 2.12.7の場合)、以下のコードを挿入してみて下さい。

//-----------------------
$sql = "SELECT r_datetime FROM c_friend_confirm WHERE c_member_id_from=? ORDER BY c_friend_confirm_id DESC";
$unxLast = strtotime(db_get_one($sql,array($u)));
$difMinute = (time()-$unxLast)/60;
if ( $difMinute < 10 ) { //10分
  openpne_redirect('pc', 'page_h_access_block');
}
//-----------------------

OpenPNE SPAM1

*対策其の2:CAPTCHA認証を付け加える

さて、メッセージの場合は認証文字を打ち込むのが面倒ですが、「フレンド申請」の場合はそれほど利用頻度が高くないので、「友達を誘う」画面のようなキャプチャ認証を入れても良のではないでしょうか?
というわけで、以下の画面のような「キャプチャ認証」を導入する改造方法も載せておきます。
※MyNETSでは同じような対策がされるようです。
OpenPNE SPAM対策

多少複雑になりますが「友達を誘う」のキャプチャ認証と同じ方法です。
修正するファイルは次の3つ。

  • webapp/modules/pc/templates/f_link_request_confirm.tpl
  • webapp/modules/pc/do/f_link_request_insert_c_friend_confirm.php
  • webapp/modules/pc/validate/do/f_link_request_insert_c_friend_confirm.ini

1 : webapp/modules/pc/templates/f_link_request_confirm.tpl

26行目に次のコードを挿入。

//----------------------------------------------
({if $smarty.const.OPENPNE_USE_CAPTCHA})
<table>
<tr>
<th>確認キーワード</th>
<td>
<p><img src="./cap.php?rand=({math equation="rand(0,99999999)"})" alt="確認キーワード" /></p>
<p>※上に表示されているキーワードをご記入下さい。</p>
({/if})
<input type="text" class="input_text" name="captcha" value="" size="30" />
</td>
</tr>
</table>
//----------------------------------------------

OpenPNE SPAM2a

2 : webapp/modules/pc/do/f_link_request_insert_c_friend_confirm.php

38行目に次のコードを挿入。

//----------------------------------------------
if (OPENPNE_USE_CAPTCHA && (empty($_SESSION['captcha_keystring']) || $_SESSION['captcha_keystring'] !=  $requests['captcha'])) {
    unset($_SESSION['captcha_keystring']);
    $msg = "確認キーワードが誤っています";
    $_REQUEST['msg'] = $msg;
    openpne_forward('pc', 'page', "f_link_request");
    exit;
}
//----------------------------------------------

OpenPNE SPAM2b

3 : webapp/modules/pc/validate/do/f_link_request_insert_c_friend_confirm.ini

ファイルの最後に追加以下のコードを追加

[captcha]
type = "string"
default = ""

OpenPNE SPAM2c

*対策其の3: NGワード機能の実装

メッセージに管理者が設定した特定の単語(特定URLやメールアドレス、放送禁書用語など)が含まれていたら、受け付けないような機能を追加します。
本来はデータベースにNGワード管理用のテーブルを追加して専用の入力フォームを作って、とやるところなのでしょうが、今回は簡単実装に拘ります!
だからと言ってNGワードを別ファイルやソースコードに埋め込むことで追加、編集、削除が面倒になるのも問題です、更にNGワードのメンテナンスは管理者1人だけではなく、SNS内の信用できる仲間と共同で管理したい、そんな夢のような(笑)ことがDBを一切弄ることなく、数行のコードを追加するだけで実現できてしまうのがOpenPNEの素晴らしいところなのです。

では以下に、その方法を説明します。

1、NGワード管理用コミュニティーを作ります。

作成する時の条件は「参加条件と公開範囲」を「管理者の承認が必要、掲示板:コミュニティ参加者にのみ公開」にして下さい。

2、トピックを作りIDをメモ

トピックを1つ作って、そこにNGワードを書き溜めて行きます、1行に1ワードで書き溜めて下さい。
そのトピックを表示した時にアドレスバーに現れる target_c_commu_topic_id=N 、この N の数字をメモして下さい。

3、ロジックにコードを追加

ここからは「対策其の1」で紹介した方法と同じです。

※メッセージをブロックしたい場合は f_message_send_insert_c_message.php の41行目に以下のコードを

//-----------------------
$topic_id = N; //NGワード専用コミュのトピックID
$sql = "SELECT body FROM c_commu_topic_comment WHERE number=0 AND c_commu_topic_id=$topic_id";
$buf = db_get_one( $sql );
if ( $buf ) {
  $words = spliti( "\n", $buf );
  foreach( $words as $val) {
    if (eregi($val,$body)) {
      $msg1 = "規制された文字列が含まれています。" . $val;
      break;
    }
  }
}
//-----------------------

※フレンド申請をブロックしたい場合は f_link_request_insert_c_friend_confirm.php の38行目に以下のコードを入れて下さい

//-----------------------
$topic_id = N; //NGワード専用コミュのトピックID
$sql = "SELECT body FROM c_commu_topic_comment WHERE number=0 AND c_commu_topic_id=$topic_id";
$buf = db_get_one( $sql );
if ( $buf ) {
  $words = spliti( "\n", $buf );
  foreach( $words as $val) {
    if (eregi($val,$body)) {
      openpne_redirect('pc', 'page_h_access_block');
      break;
    }
  }
}
//-----------------------

その時に「$topic_id = N;」の N の部分を先ほどメモした target_c_commu_topic_id の番号を指定して下さい。

以上です完成です、NGワード管理コミュニティーに信頼できる仲間を招待すれば複数人で管理可能なシステムになります。
それから、「正規表現」という機能が使えます、例えばNGワードに ABCD[0-9]EFG と書いておくと、 ABCD0EFG,ABCD1EFG,ABCD2EFG,ABCD3EFGもNGワードとして検出されます、正規表現は他にも色々ありますのでネットで調べて下さい、まぁあまり使わないと思いますが。。。

※最後に

webapp以下のソースコードに変更を加える場合は、webapp_exフォルダーを使う事をお勧めします。

※この記事は取り急ぎ公開しています、修正、加筆される可能性があります。

Tagged with:
1月 28

緊急リリース

最近OpenPNEを使って構築されたSNS内でメッセージを利用したスパムが横行しているようで方々から悲鳴が上がっています、主にオープン型で運営されているSNSでの話しだとは思いますが、招待制であっても一旦もぐり込まれ複アカで自分を召還し始めると厄介かもしれませんね、いずれはコアチームが対応してくれるとは思いますが、(PNE3のこともあって忙しそうなので)取り急ぎ簡単なスパムフィルター(ブロッカー?)の実装方法を説明します。
最低限シンプルに書いていますので気の利いた設定などはありません、ある程度PHPが理解できる方であれば色々と応用も利くと思います(もちろんこのままでも動作します)。

スパム対策(業者対策)内容

マイフレンド以外へのメッセージの連続攻撃をブロックします。
※マイフレンドはスパムしないでしょうから。笑

スクリプト修正方法

webapp/modules/pc/do/f_message_send_insert_c_message.php
41行目(PNE2.12.7)へ以下のコードを追加して下さい。

//-----------------------
if ( !db_friend_is_friend($c_member_id_to, $u ) ) {
  $sql = "SELECT r_datetime FROM c_message WHERE c_member_id_from=? ORDER BY c_message_id DESC";
  $unxLast = strtotime(db_get_one($sql,array($u)));
  $difMinute = (time()-$unxLast)/60;
  if ( $difMinute < 10 ) { //10分
    $msg1 = "メッセージはビジー状態です、暫くお待ち下さい。";
  }
}
//-----------------------

何故41行目かと言いますと、この判定は$msg1の初期化後でないと利かないので、
$msg1 = “”;
$msg2 = “”;
の直後が良いと思います。
スパムブロック
※上記のソースは10分以上のインタバルを空けなければ送れない設定です。

注意

このまま利用する場合は十分な検証を行った上で使用して下さい。
マイフレンドからのスパム、一通一通時間を置いて根気よく送られてくるスパムには全く効果はありません。

追記

OpenPNE 2.6.11 での動作確認がとれました、ただしスクリプトの挿入位置が少し違いますので、コメントを参考にして下さい。

Tagged with:
1月 01

今年の目標。(笑

  • 拡張モジュールの整理。
  • 未公開モジュールの整理公開
    • チャットモジュール(mixiエコークローン)
    • MyNETSのテーブルプレフィクス対応
    • スケジューラー
    • リモートAPI
    • 携帯電話への積極的な対応
  • OpenPNE3ソーシャルアプリケーションの理解と作成。
  • Symfony、CodeIgniter、Cocoa、フレームワークの理解と作成。
  • Dashcode、iPhone App、Adobe AIR、Chumbyアプリの作成。
  • OpenPNE、MyNETSのカスタマイズやモジュールの作成方法をマトメル(解説?)。
  • OpenPNE用DataBaseユーティリティの作成

因みにGoogle検索を使ってここへ訪れた方の検索キーワードで最も多かったのが、”iPhone OpenPNE” の組合せで、他に”天気予報”、”今日の運勢”、”OpenPNE エコー”、”OpenPNE チャット”、などなど。。。

さてどれだけ達成できるかな。。。
そんなわけで、みなさま本年もヨロシクお願いします。

富士山

5月 04

只今、WordPressを使ってサイトリニューアル中なのです。

4月 23

年度末の激務もそろそろ収束に近づく今日この頃。。。
いやまだまだやるべき仕事は沢山残ってるけど、昨日久々に本屋でWPの本を見ていたら、急にWPが恋しくなった。w
そういえば色々なCMSを(どれも中途半端に)いじってきたけど、WPでのカスタマイズって全くやってなかった!
そこで今日色々ネットを漁っていたら、MEではなくWP本家から2.5日本語版なるものがリリースされていることを発見!

っつーわけでアップグレードしてみました。

方法はすんごく簡単!

  1. 以前のwpをバックアップする(wp-config.phpとwp-contentフォルダーは必須)
  2. 以前のwpをカラッポにして、新バージョンを全部コピー
  3. バックアップしたwp-config.phpをwpへコピー(この中にDB設定とか覚えてるので必須)
  4. ブラウザから、wp/wp-admin/update.php にアクセスすると、DBが古いから云々言われるので、そのままUpGradeをクリック。
    これで終りです。

あと、wp-content/uploads/フォルダーには、ブログで使われている写真等がはいっているので、これもwpに戻してください。

それと、何かのプラグインが有効になっている場合は、無効にしてから作業した方が吉です。もしバージョンアップ後にwpの画面が出てこない場合プラグインが有効になっている可能性があります、その場合でも管理画面(wp/wp-login.php)には入れるので、そこで一度全てのプラグインを無効にして再度プラグインをDLし直すなり個々に対処してみて下さい。

とりあえず無事バージョンアップできたので、wpでCMSするのはまたイツカ。。。

1月 23

Ichiro nagahara ソロアルバム、今回はアルバムジャケットのデザインで参加。
iTunes Music Store(USA/JAPAN)で販売中です。

preload preload preload