PHP 2022年10月06日 02:05   編集
掲示板PHPスクリプトです。
利用者に負担をかけずにスパム対策するというのがコンセプトで、以下の対策をとっています。

bbs.phpのスパム対策

ダミーフィールドからの投稿
スパム投稿はフォームのHTMLを解析して値を送信してくるため、CSSで非表示にしたフィールドのデータも送信する場合がある。その場合はスパムと判断して拒否する。
フォームIDのチェック
ブラウザで投稿フォームを表示するたびにユニークな投稿IDを生成し、そのIDを正しく送ってこない投稿を拒否する。フォームを表示せず、直接クエリ送信で投稿しようとするスパムを防ぐ。
投稿時間のチェック
フォームを表示してから投稿ボタンを押すまでの時間が早すぎるとロボットの投稿と判断して拒否
スライドロック
JavaScriptで表示されるボタンをスライドしないと投稿ボタンが押せず、投稿を受け付けないことによって、ロボットからの投稿を拒否する。
純粋なロボットによる投稿だと上記の対策でそこそこ効果がありますが、突破してくる投稿も多いので、以下の対策も追加しています。
ひらがなチェック
コメントにひらがなが連続2個以上含まれていないと投稿拒否
外国語の投稿をブロックするため。通常の日本語の文章なら、少なくともひらがな2個以上は含まれるはず
タイトルにURL
タイトルにURLが入っているスパムが多いため。
URL3個以上
URLを羅列するタイプの投稿を防ぐため。
禁止用語
禁止ワードを含む投稿を拒否する。
拒否IP
登録したIPアドレスからの投稿やアクセスを拒否する。

タグの使用について

管理者設定で記事で許可するタグを指定できるようになっていますが、ver.1.059でその際の挙動を変更しました。タグの使用を許可した場合でもタグ内に入れられるのはタグ名と閉じタグに使用する/(スラッシュ)だけということにしました。たとえばstrongタグを許可した場合、使用できるのは
<strong>これは有効</strong>
のような指定で、
<strong style="color:red;">こういう指定はダメ</strong>
という指定はNGということです。使用できるタグを利用してよからぬことを書かれてしまうのを避けるためです。
それと、開始タグの後に閉じタグが存在しないと有効にならないようにしました。タグの閉じ忘れで後続の記事のレイアウトなどに影響が出ないためです。
<strong>閉じタグが存在しないと有効にならない。
のように閉じタグがないとタグとして機能しません。なので通常閉じタグを使わないようなタグは使用許可しないでください。imgとかinputとか。まあタグ名しか入れられないので、許可しても意味がありませんが。
投稿時に許可タグのみを有効にしてログに保存しているので、タグ名以外の記述も許可していたバージョンで投稿された記事のタグは、再編集しない限り有効なままです。投稿時・再編集時の処理は、すべての<、>をそれぞれ&lt; &gt;に変換した後、許可されたタグについて
$html = preg_replace('/&lt;(' . 許可タグ . ')&gt;([\s\S]*?)&lt;\/(' . 許可タグ . ')&gt;/', '<$1>$2</$3>', $html);
というような処理をしています。
タグを許可した場合、投稿フォームに使用できるタグ名を表示するようにしました。利用を想定しているのはpreタグで、preタブ内にプログラムコードなどを入れると、タブによるインデントもそのまま表示されるようにしています。サポート掲示板などで、コードをそのまま表示したいような場合に使えます。

戻る

bbs.phpのヘルプ

掲示板を作成する
■ファイルアップロード、返信、過去ログ生成、隠しパラメータ送信によるスパム投稿対策、スライドロックによるスパム投稿対策
オプションは[[bbs('lock=1|max_log=100|item=thread')]]のように指定

指定できるオプション

form (現在の設定はform=up)
form=up(フォームを上に表示) form=down(フォームを下に表示)
item (現在の設定はitem=time)
デフォルトの記事表示順を指定
item=time(投稿順) item=thread(スレッドごとに表示)
max_log (現在の設定はmax_log=100)
現行ログの保存数。これを超えると過去ログに移動。
例 max_log=50
max_past (現在の設定はmax_past=100)
過去ログに保存する記事数。これを超えると過去ログファイルを新たに作成。
例 max_past=100
page_line (現在の設定はpage_line=10)
1ページに表示する記事数。これを超えると次のページに表示
例 page_line=10
lock (現在の設定はlock=1)
スライダで投稿ボタンをロックする lock=1で表示する
例 lock=1
perm_tag (現在の設定はperm_tag=)
許可するタグ。複数ある場合は;(セミコロン)で区切る。
有効になるのはタグ名だけを<>で囲った場合とその閉じタグだけ。styleなどは指定できない。
例 perm_tag=pre;h1
nameless (現在の設定はnameless=id)
投稿者名未入力で投稿した場合、表示される名前を指定。'id'にすると、日付とIPアドレスを元にしたIDを表示
例 nameless=id
titleless (現在の設定はtitleless=無題)
タイトル未入力で投稿した場合、表示されるタイトルを指定。
例 titleless=タイトルなし
hide_bbs (現在の設定はhide_bbs=1)
デフォルトでフォームと投稿内容を隠す hide_bbs=1で隠す
例 hide_bbs=1
show_text (現在の設定はshow_text=)
添付したtextファイルの内容を表示する show_text=txt;phpのように表示するテキストファイルの拡張子を指定する。複数ある場合は;(セミコロン)で区切る
例 show_text=txt;log

counter:6,853