- 締切済み
Postmailの禁止ワードの改造
CGIに詳しい方ご指導の程宜しくお願い致します。 現在KENTWEB様のPostmailを使用しております。 その中の機能で【禁止ワード】というものがあり、 荒らし対策やスパム用として活用しているのですが 入力項目に禁止項目で設定した禁止ワードが入力されていて メールを送信しようとすると次のページで 【ERROR ! 禁止ワードが含まれています 】と表示されるのですが この【エラー文章】をどこの入力項目に入ってる文章が 禁止項目なのかを表示したいのです。 ただし何の文字が禁止ワードなのかが表示されてしまうと 荒らし対策やスパム対策にならないので、入力項目のみ 表示したいのですが、可能でしょうか? 大変乱文で説明が分かりにくい点もございますが何卒 ご指導の程宜しくお願い致します。 ■Postmailの動作サンプル http://www.kent-web.com/data/postmail/index.html ■Postmailダウンロード先 http://www.kent-web.com/data/index.html
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- koma30007
- ベストアンサー率87% (173/198)
『○○○に禁止ワードが含まれています。』などの メッセージを表示させたい場合は、「禁止ワード」 の所にある以下の行を if ($flg) { &error("禁止ワードが含まれています"); } 次のようにするだけで大丈夫のようです。 if ($flg) { &error("$_に禁止ワードが含まれています"); } ※『○○○に禁止ワードが含まれています。』の○○○ の部分は、送信フォームのHTMLで各入力欄に設定したname の値が反映されます。 ほとんど詳しくないので、複数あった場合にすべて表示 させる方法は分かりません。 一番最初に禁止ワードを見つけた段階で、エラーメッセ ージを表示するようですので、そのように改造するのは 難しいかもしれません。 どうしても出来ない場合は、メールの送信者には1つずつ 修正して送信してもらうと良いです。 カテゴリを変更して質問し直すと良い回答が得られるかも しれません。 次のカテゴリは技術者向けなので詳しい人がいるかも・・・ [技術者向] コンピューター > プログラミング > CGI あるいは [技術者向] コンピューター > プログラミング > Perl ※マルチ投稿にならないように、どちらか1つだけに 質問を投稿してください。
- snowize
- ベストアンサー率27% (68/245)
すみません。引数の順番が間違っていました。 join(@err, ", ") ⇒ join(", ", @err) こちらが正しいみたいです^^; 普段Perlを書かないのにリファレンスもきちんと確認せず思い込みですらすらやってしまいました。これでもだめならちょっと上の方も試してみてくださいw;
- snowize
- ベストアンサー率27% (68/245)
おそらく「名前に禁止ワードが含まれています!」などのように改造したいのだと思いますが、最低限のPerlの知識はお持ちと踏まえてよろしいでしょうか? 本当でしたらサンプルコードをそのまま使ってもらえればよいのですが、当方Rubyが専門でPerlは動作環境がない上にほとんど覚えてないときたもんで、間違いもご愛敬ということでどうぞよろしく。 最初に619行目からのサブルーチンを確認してください。 ここでフォーム情報が連想配列in、配列keyにそれぞれ格納されていることが分かります。 なので255行目から始まる禁止ワードの捜査にこれらの情報を加えてやればいいのではないかと思います。 foreach文で配列keyの中身を順次確認していますので、一番簡単な手段は "禁止ワードが含まれています" ⇒ "#{$in{$_}}に禁止ワードが含まれています" のように何の工夫もなく文字列を連結してしまうことだと思いますが、名前と本文の二カ所に禁止ワードが含まれていた場合は最初に見つけた禁止ワードしか通達してくれません。 それが不満でしたらエラーを見つけ次第サブルーチンを呼び出すのではなく、配列などにエラーメッセージをストックしておいてから最後にまとめて出力すればいいんじゃないかでしょうか。方法はいろいろあると思いますが…… # 禁止ワード if ($no_wd) { local($err); foreach (@key) { foreach $nowd ( split(/,/, $no_wd) ) { if (index($in{$_}, $nowd) >= 0) { $err .= ", {$in{$_}}"; } } if (length($err) > 0) { &error("{$err}に禁止ワードが含まれています"); } } } のように文字列として連結しちゃったり、 # 禁止ワード if ($no_wd) { local(@err); foreach (@key) { foreach $nowd ( split(/,/, $no_wd) ) { if (index($in{$_}, $nowd) >= 0) { push(@err, $in{$_}); } } if (@err > 0) { &error(join(@err, ", ") . "に禁止ワードが含まれています"); } } } のように配列にストックしておけばいいんじゃないでしょうか。後者の方が応用が利くかしら? なお上記ソースは全角スペースでインデントしていますのでタブ文字などに置換してください。 もし全然うまくいかないなんてことがありましたら改めてご連絡くださいまし。 自分の回答でウェブサイトが一層にぎわうようなら幸いです。
- 参考URL:
- http://www.rfs.jp/sb/perl/
補足
早急なご回答本当に有難う御座います。 この方法であっているのですが、下の方法を行うと 【,に禁止ワードが含まれています 】と表示されてしまい どの項目に禁止ワードがあるのか【,】だけ表示されてしまうのです。 行った方法は初期から存在する 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 # 禁止ワード if ($no_wd) { local($flg); foreach (@key) { foreach $nowd ( split(/,/, $no_wd) ) { if (index($in{$_},$nowd) >= 0) { $flg = 1; last; } } if ($flg) { &error("禁止ワードが含まれています"); } } } 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 をご指導頂きました方法 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 # 禁止ワード if ($no_wd) { local(@err); foreach (@key) { foreach $nowd ( split(/,/, $no_wd) ) { if (index($in{$_}, $nowd) >= 0) { push(@err, $in{$_}); } } if (@err > 0) { &error(join(@err, ", ") . "に禁止ワードが含まれています"); } } } 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓 へと書き換えてアップロードをしてみました。 大変お忙しい中お手数をおかけ致しますが何卒ご指導の程 宜しくお願い致します。
補足
何度もご丁寧に有難う御座います!! 頂きましたタグを入れてみたのですが 【禁止ワード,禁止ワードに禁止ワードが含まれています 】 と2回繰り返してしまいます。 入力された禁止ワードは1つなのですが、これは何か自分の 設置方法が悪かったのでしょうか? また可能であればなのですが、入力された項目名を表示させる事は できませんでしょうか? ------------------------------------------------------------ (例)お名前の入力欄に【禁止ワード】があった場合・・・ ERROR ! お名前に禁止ワードが含まれています。 ------------------------------------------------------------ また複数あった場合も対応出来れば良いのですが・・・ ------------------------------------------------------------ (例)お名前、住所、お問い合わせ内容の入力欄に【禁止ワード】があった場合・・・ ERROR ! お名前、住所、お問い合わせ内容に 禁止ワードが含まれています。 ------------------------------------------------------------ 何度も何度もご親切に対応して頂き大変お手数をお掛けし 申し訳ございませんが何卒ご指導の程宜しくお願い致します。