Opened 11 years ago
Closed 11 years ago
#3731 closed enhancement (fixed)
連続投稿防止機能
Reported by: | toraneko | Owned by: | toraneko |
---|---|---|---|
Priority: | minor | Milestone: | OpenPNE2.13.7 |
Component: | 指定しない | Version: | |
Keywords: | Cc: |
Description (last modified by )
■概要
メッセージ・日記などの投稿間隔をチェックし、短時間で連続投稿された場合に制限する機能。
■仕様
投稿間隔をチェックし、短時間で連続投稿された場合には、「サーバが混み合っています」の画面を表示する。
機能詳細
投稿された時刻を保持し(*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 (18)
comment:1 Changed 11 years ago by
Description: | modified (diff) |
---|
comment:2 Changed 11 years ago by
Description: | modified (diff) |
---|
comment:3 Changed 11 years ago by
Description: | modified (diff) |
---|
comment:4 Changed 11 years ago by
comment:7 Changed 11 years ago by
Keywords: | 確認中 removed |
---|
安定版ではテーブルの追加、config.phpへの追加を避けたい。
- テーブルを新規に作成するのではなく既存のc_member_configを使用して実装する。
- config.phpに関しては初期値を設定することでconfig.phpに記述する項目数を減らす。
comment:8 Changed 11 years ago by
Keywords: | 確認中 added |
---|---|
Owner: | changed from nobody to nagasawa |
Status: | new → assigned |
r11072 で修正しました。
comment:9 Changed 11 years ago by
Keywords: | 差し戻し added; 確認中 removed |
---|
以下の理由で差し戻します。最初の 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 コメントの返り値と実装が食い違っています。
comment:11 follow-up: 12 Changed 11 years ago by
Keywords: | 差し戻し added; 確認中 removed |
---|
10 指摘事項のどこまでを修正したのか明記してください。(すべては修正されていないようです)
以下、追加の指摘です。
- util_do_post_interval_ok() で、OPENPNE_POST_INTERVAL_UNFAIR_SECOND が 0 の場合に必ず false を返すようになっています(必ず true を返すべきです)
- util_do_post_interval_ok() で、使用されていない変数 $result が定義されています
comment:12 Changed 11 years ago by
- util_do_post_interval_ok() で、OPENPNE_POST_INTERVAL_UNFAIR_SECOND が 0 の場合に必ず false を返すようになっています(必ず true を返すべきです)
r11189 で修正しました。
comment:13 Changed 11 years ago by
Keywords: | 確認中 added; 差し戻し removed |
---|
config.php 未更新によるトラブルを防ぐために OpenPNE_Config に初期値を指定してください。
r11190 で修正しました。これですべて修正済みとします。
comment:14 Changed 11 years ago by
Description: | modified (diff) |
---|
comment:15 Changed 11 years ago by
Keywords: | 差し戻し added; 確認中 removed |
---|---|
Owner: | changed from nagasawa to kiwa |
Status: | assigned → new |
細かい修正やります
comment:16 Changed 11 years ago by
Keywords: | 確認中 added; 差し戻し removed |
---|
r11304,r11305にて連続投稿機能の微調整を取り込みました。
comment:17 Changed 11 years ago by
Keywords: | 確認中 removed |
---|---|
Owner: | changed from kiwa to toraneko |
Summary: | 連続投稿の防止 → 連続投稿防止機能 |
#3832:連続投稿防止機能 コードチェック
残りのコードチェックは上のチケットで行います。動作を確認したところ致命的な問題はなさそうなので、今回はこれで完了とします。
comment:18 Changed 11 years ago by
Resolution: | → fixed |
---|---|
Status: | new → closed |
Note: See
TracTickets for help on using
tickets.
コミットしました。r11017
https://trac.openpne.jp/svn/OpenPNE/branches/work/toraneko/prj_newfeature/enhancement_3731