Ticket #3731 (closed enhancement: fixed)

Opened 8 years ago

Last modified 8 years ago

連続投稿防止機能

Reported by: toraneko Assigned to: toraneko
Priority: minor Milestone: OpenPNE2.13.7
Component: 指定しない Version:
Keywords: Cc:

Description (Last modified by kiwa)

■概要

メッセージ・日記などの投稿間隔をチェックし、短時間で連続投稿された場合に制限する機能。

■仕様

投稿間隔をチェックし、短時間で連続投稿された場合には、「サーバが混み合っています」の画面を表示する。

機能詳細

投稿された時刻を保持し(*1)(1)、次回投稿時に(1)との間隔をチェックする。 一定間隔(*2)内での投稿が、一定回数(*3)以上を超えた場合、「サーバが混み合っています」のメッセージを表示する。

  • *1:Session、またはDBのどちらで保持するかをconfig.phpで設定する
  • *2:config.phpで設定する
  • *3:config.phpで設定する

config.php変更

連続投稿チェックの対象となるdoアクションのリストを追加

$GLOBALS['CHECK_POST_ACTIONS'] = array(
'pc' => array(
    'do_h_diary_add_insert_c_diary',
    'do_fh_diary_insert_c_diary_comment',
    'do_h_com_add_insert_c_commu',
    'do_c_topic_add_insert_c_commu_topic',
    'do_c_topic_write_insert_c_commu_topic_comment',
    'do_c_event_add_insert_c_commu_topic',
    'do_c_event_write_insert_c_commu_topic_comment',
    'do_f_message_send_insert_c_message',
    'do_f_link_request_insert_c_friend_confirm',

));

以下の3つのフラグを追加

// 連続投稿と判断する間隔(秒)
// 0を指定した場合、チェックしない
define('POST_INTERVAL_UNFAIR_SECOND', 0);

// 前回から[POST_INTERVAL_UNFAIR_SECOND]秒以内の投稿が、
// 何回行われた時に、連続投稿と判断するか
define('POST_INTERVAL_UNFAIR_COUNT', 10);

// 前回投稿から何秒以上あいていたら、連続投稿回数をリセットするか
define('POST_INTERVAL_UNFAIR_COUNT_RESET_SECOND', 60*60);

// 前回投稿時刻と投稿回数の保存先
// 0:セッション
// 1:データベース
define('POST_INFO_STORAGE', 0);
CHECK_POST_ACTIONS
連続投稿のチェック対象とするアクション
POST_INTERVAL_UNFAIR_SECOND
前回投稿との時間が何秒以内の場合に、連続投稿としてカウントするか
POST_INTERVAL_UNFAIR_COUNT
連続投稿の許容回数。 この数値を超えた場合エラーとし、「サーバが混み合っています」を表示する
POST_INTERVAL_UNFAIR_COUNT_RESET_SECOND
前回投稿から何秒以上間隔があいていれば、カウントされている連続投稿回数をリセットするか
POST_INFO_STORAGE
前回投稿時刻と連続投稿カウントの保存先

備考

[STORAGE_POST]=1を指定された場合、メンバーがログアウトしても情報(*4)は保持されます

  • *4:前回投稿時刻、不正投稿回数

■関連情報

Change History

03/13/09 14:04:58 changed by toraneko

  • description changed.

03/13/09 14:05:30 changed by toraneko

  • description changed.

03/13/09 14:06:23 changed by toraneko

  • description changed.

03/13/09 14:12:30 changed by toraneko

03/13/09 14:15:08 changed by kiwa

  • milestone set to OpenPNE2.13.7.

ありがとうございます!時期的にギリギリですが2.13.7で取り込みましょう!

03/16/09 16:04:33 changed by nakasone

  • keywords set to 確認中.

以下のリビジョンで対応しました。

03/19/09 19:04:08 changed by nagasawa

  • keywords deleted.

安定版ではテーブルの追加、config.phpへの追加を避けたい。

  • テーブルを新規に作成するのではなく既存のc_member_configを使用して実装する。
  • config.phpに関しては初期値を設定することでconfig.phpに記述する項目数を減らす。

03/19/09 21:03:13 changed by nagasawa

  • keywords set to 確認中.
  • owner changed from nobody to nagasawa.
  • status changed from new to assigned.

r11072 で修正しました。

03/23/09 16:38:35 changed by ebihara

  • keywords changed from 確認中 to 差し戻し.

以下の理由で差し戻します。最初の 3 点は特に優先的に対処してください。

  • post_config.php を廃止して config.php に追記する方向に戻してください。理由は以下に挙げます。
    • post_config.php は変更を前提としているファイルであるにもかかわらず Subversion 管理下に置かれています。
    • config.php 以外の設定ファイルを設けるということは、今までにない作業手順を学習し実施する負担を SNS 管理者に与えます。連続投稿規制は各SNSで強く求められており、かつ、 SNS によって設定項目の調節が必要なセンシティブな機能です。なるべく管理者の負担を減らす方向で実装したいです。
    • post_config.php が config.php と違う階層にあるなど、リリース直後のトラブルが予想されます。
    • config.php への設定項目追加を避けるという以外にメリットを感じられません。上に挙げたように無理が生じるようなら config.php に追記する形で妥協しておくのが望ましいです。
    • あるいは、対象とするアクションリストの設定のみを config.php に逃がし、管理画面で値を調節できるようにするアプローチを検討してみてください。
  • 現時点での OpenPNE の USE_KTAI_IP のデフォルト値が false である以上、 ktai モジュールからもツールによる連続投稿が可能と考え同様に対策するべきです。
  • POST_INTERVAL_UNFAIR_COUNT の値が 1 では、誤って複数回クリックをしてしまった場合にも引っかかってしまいます。 この機能をデフォルトで有効にするのであれば、OpenPNE のデフォルト値としてはやや控えめにしておいたほうがいいです。
  • db_etc_set_post_info() において不要な設定項目 r_datetime を更新していますがこれは削除してください。
  • 設定用の他の定数に倣い、 OPENPNE_ というプレフィックスを定数名に付加してください。
  • config.php 未更新によるトラブルを防ぐために OpenPNE_Config に初期値を指定してください。
  • util_do_post_interval_ok() が 第二引数 $u にデフォルト値 0 を許容していますが、$u が使われる util_get_post_info() と util_set_post_info() の関数コールの両方ともに 0 を用いてよいとは思いません。
  • util_do_post_interval_ok() ですが、ネストが無駄に深く可読性を落としています。 POST_INTERVAL_UNFAIR_SECOND が false と評価できる値の場合は return で抜けられることなどを考慮すればたとえば以下のようにもっとシンプルに書けます。これだけシンプルであれば欠陥を見落とす確率がぐっと低くなるはずです。この関数は本機能の肝となる部分なのでバグが入り込む確率を減らしたいです。
    function util_do_post_interval_ok($action, $u = 0)
    {
        if (!POST_INTERVAL_UNFAIR_SECOND) {
            return true;
        }
        
        if (in_array($action, $GLOBALS['CHECK_POST_ACTIONS']['pc'])) {
            // 最終投稿時間と投稿回数を取得
            list($last_post_time, $post_count) = util_get_post_info($u);
    
            $now_time = time();
            $interval = $now_time - (int)$last_post_time;
    
            if (!$last_post_time || $interval > POST_INTERVAL_UNFAIR_COUNT_RESET_SECOND) {
                // 最終投稿時間が不明か、前回投稿から一定時間経過しているためカウントをリセットする
                $post_count = 1;
            } elseif ($interval < POST_INTERVAL_UNFAIR_SECOND) {
                $post_count++;
            }
            util_set_post_info($u, $now_time, $post_count);
    
            // 投稿回数が一定数以上のため、連続投稿であるとみなす
            if ($post_count > POST_INTERVAL_UNFAIR_COUNT) {
                return false;
            }
        }
    
        return true;
    }
    
  • 優先度はやや低いですが、 init_pc_do() の、 $is_secure を式に取る if ブロックをひとつに統合してください。

  • 優先度は低いですが、 POST_INFO_STORAGE の値を見る際に 0 と 1 がマジックナンバーになってしまっているので、マジックナンバーにならないようにするか、もしくはフォローがほしいです。
  • 優先度は低いですが、以下のような docblock 形式のコメントの書式が間違っています。
    • 引数の解説には型を明示すべきです
    • : は不要です
    • docblock コメントの終端のアスタリスクが 1 つ多いです
    • array(); は型名ではありません。正しくは array です
       /**
       * DBから前回POST情報を取得する
       *
       * @params : $u
       *
       * @return array();
       **/
      
  • 優先度は低いですが、 util_set_post_info() の docblock コメントの返り値と実装が食い違っています。

(follow-up: ↓ 11 ) 03/23/09 19:04:28 changed by nagasawa

  • keywords changed from 差し戻し to 確認中.

r11110 で修正しました。

(in reply to: ↑ 10 ; follow-up: ↓ 12 ) 03/30/09 21:00:12 changed by ogawa

  • keywords changed from 確認中 to 差し戻し.

10 指摘事項のどこまでを修正したのか明記してください。(すべては修正されていないようです)

以下、追加の指摘です。

  • util_do_post_interval_ok() で、OPENPNE_POST_INTERVAL_UNFAIR_SECOND が 0 の場合に必ず false を返すようになっています(必ず true を返すべきです)
  • util_do_post_interval_ok() で、使用されていない変数 $result が定義されています

(in reply to: ↑ 11 ) 03/31/09 13:53:18 changed by nagasawa

* util_do_post_interval_ok() で、OPENPNE_POST_INTERVAL_UNFAIR_SECOND が 0 の場合に必ず false を返すようになっています(必ず true を返すべきです)

r11189 で修正しました。

03/31/09 14:38:22 changed by nagasawa

  • keywords changed from 差し戻し to 確認中.

config.php 未更新によるトラブルを防ぐために OpenPNE_Config に初期値を指定してください。

r11190 で修正しました。これですべて修正済みとします。

04/14/09 12:02:09 changed by kiwa

  • description changed.

04/14/09 21:11:03 changed by kiwa

  • keywords changed from 確認中 to 差し戻し.
  • owner changed from nagasawa to kiwa.
  • status changed from assigned to new.

細かい修正やります

04/15/09 00:48:44 changed by kiwa

  • keywords changed from 差し戻し to 確認中.

r11304,r11305にて連続投稿機能の微調整を取り込みました。

04/16/09 12:01:39 changed by kiwa

  • keywords deleted.
  • owner changed from kiwa to toraneko.
  • summary changed from 連続投稿の防止 to 連続投稿防止機能.

#3832:連続投稿防止機能 コードチェック

残りのコードチェックは上のチケットで行います。動作を確認したところ致命的な問題はなさそうなので、今回はこれで完了とします。

04/16/09 12:01:48 changed by kiwa

  • status changed from new to closed.
  • resolution set to fixed.