実現したいこと
イラストのQ&A掲示板にNGワードを設けて犯罪、差別的な言葉が書き込まれないように制限したい。
発生している問題・分からないこと
現在荒らし対策のために空白と改行は連続して入力できないように対策しているのですが、参考サイトを見ると句読点や記号にも対応するようなコードが書かれており、どこまで制限すべきか悩んでおります。
例を考えてみました。「死ね」というNGワードを設定している場合、「死、ね」や「死。ね」と入力された場合は制限できず書き込めてしまいます。
句読点を削除して「死ね」に変換することで、「死ね」と一致するかチェックして削除することができます。
ですが、「死×ね」「死/ね」「死☆ね」「死♪ね」とUTF8の記号すべてに対応する場合きりがありません。
上記とは別の問題もあり「ばか」をNGワードに設定したとします。日常会話で使う「ばかり」まで制限にかかってしまい書き込めないです。
NGワードの制限範囲はどこまで設定するのが適切でしょうか?
※参考サイト
https://php.o0o0.jp/article/php-ng_words
該当のソースコード
PHP
1<?php 2 3class MAX_LENGTH 4{ 5public const NAME = 50; 6public const MESSAGE = 500; 7} 8 9function bbs_quest_input() 10{ 11 session_start(); 12 $message = $_POST['message']; 13 $namae = $_POST['namae']; 14 $stamp = $_POST['stamp']; 15 $namae = Chk_StrMode($namae); 16 $message = Chk_StrMode($message); 17 Chk_ngword($namae, '・NGワードが入力されています。', $error); 18 Chk_ngword($message, '・NGワードが入力されています。', $error); 19 Chk_InputMode($namae, '・お名前をご記入ください。', $error); 20 Chk_InputMode($message, '・お問い合わせ内容をご記入ください。', $error); 21 Chk_InputMode($stamp, '・スタンプを選択してください。', $error); 22 CheckUrl($namae, '・お名前にURLは記入できません。'); // 追加 23 CheckUrl($message, '・お問い合わせ内容にURLは記入できません。'); // 追加 24 $result = []; 25 if (empty($error)) { 26 $result['error'] = ''; 27 $_SESSION['namae'] = $namae; 28 $_SESSION['message'] = $message; 29 $_SESSION['stamp'] = $stamp; 30 $_SESSION['attach'] = $_FILES['attach']; 31 foreach ($_FILES['attach']['tmp_name'] as $i => $tmp_name) { 32 if (!empty($tmp_name)) { 33 $_SESSION['attach']['data'][$i] = file_get_contents($tmp_name); 34 } 35 } 36 } else { 37 $result['error'] = $error; 38 $_SESSION['namae'] = ''; 39 $_SESSION['message'] = ''; 40 $_SESSION['stamp'] = ''; 41 $_SESSION['attach'] = null; 42 } 43 header('Content-type: application/json; charset=UTF-8'); 44 echo json_encode($result); 45 exit; 46} 47add_action('wp_ajax_bbs_quest_input', 'bbs_quest_input'); 48add_action('wp_ajax_nopriv_bbs_quest_input', 'bbs_quest_input'); 49 50function Chk_ngword($str, $mes, $error) 51{ 52 // NGワードリスト配列の定義 53 $ng_words = array('死ね','アホ','殺す','バカ'); 54 foreach ($ng_words as $ngWordsVal) { 55 // 対象文字列にキーワードが含まれるか 56 if (mb_strpos($str, $ngWordsVal) !== FALSE) { 57 $error[] = $mes; 58 } 59 } 60} 61function Chk_StrMode($str) 62{ 63 // 連続する空白をひとつにする 64 $str = preg_replace('/[\x20\xC2\xA0]++/u', "\x20", $str); 65 // 連続する改行をひとつにする 66 $str = preg_replace("/(\x20*[\r\n]\x20*)++/", "\n", $str); 67 // 前後の空白を除去 68 $str = mb_ereg_replace('^( ){0,}', '', $str); 69 $str = mb_ereg_replace('( ){0,}$', '', $str); 70 $str = trim($str); 71 // 特殊文字を HTML エンティティに変換する 72 $str = htmlspecialchars($str); 73 74 return $str; 75} 76/* 未入力チェックファンクション */ 77function Chk_InputMode($str, $mes, $error) 78{ 79 if ('' == $str) { 80 $error[] = $mes; 81 } 82} 83 84/* 以下追加 */ 85function CheckUrl($checkurl, $mes) 86{ 87 global $errors; 88 if (preg_match("/[\.,:;]/u", $checkurl)) { 89 $errors[] = $mes; 90 } 91} 92?>
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
恐らくまとめ掲示板などはNGワードのみ設定しており、句読点や記号には対応していないのではないかと考えております。
※参考サイト
https://qiita.com/hose/items/774ac58f0155ef0a9973
補足
特になし

回答1件
あなたの回答
tips
プレビュー