Debug- Official Website -


犬土偶日記

海の近くに住みたい

Debug日記の使い方

話題:Webプログラミングとか

2008年07月03日

コメントスパム対策

公開日時: 不明

夜起きた。何時頃かは分からないが夜に起きた。全身に激痛が走つてまともに動けない。昨日歩き過ぎたせゐで大変なことになつた。散歩に行くたびに歩く距離を増やすことにしてゐるので、次回はさらに死ぬことになるだらう。考へるだけで気が狂ひさうだ。

昨日の散歩の時の写真をPCに取り込んで解像度を下げたり画質を落としたりしてWeb用に加工してから日記を書いた。写真を載せるだけでも結構面倒臭いのに、Yahoo!の地図を繋ぎ合はせて散歩ルートを書き込んだり選んだ写真の撮影場所を書き込んだりするのもかなり大変だつた。暇人だからこそできる。見る人なんてほとんどゐないのに。ていふか、あんな地図載せたら住所バレバレだな。

ダラダラと日記を書いてゐるうちに明るくなつた。今日は散歩には行かない。雨が降つてゐたし、全身の痛みが激し過ぎて絶対に無理。当然パチ屋も休む。

昨日買つた物を色々と確認したり家計簿をつけたりした。まだYUIのCDは聴いてゐない。用事が済んでからじつくり聴くのだ。昼までゆつくり過ごして疲労回復を目指した。といふか、動けなかつた。昼に飯を食ひ、まだまだ休憩。椅子に座つたままでできる作業は常にやつてゐるのだが、気分は休憩。

午後に喫茶店へ。飯を食つたばかりだつたから特に飯類は食はない。歩くだけで相当脚が痛む。キツいな。屋久島の縄文杉のために体を鍛へてゐる。去年も鍛へるために早朝の散歩をしたが今年ほどは歩かなつた。丁度1年前の今日種子島に行つたんだな。もうあれから1年になるのか。早い。早過ぎる。1年前の俺と比べて何か成長してゐるのだらうか。種子島の地理に少し詳しくなつたぐらゐであとは一切何も変はつてゐないのではないか。いや、ギターが弾けなくなつた分だけ退化してゐるのではないか。

昨日の日記にも書いたが、日記やBBSで外人によるコメントスパム投稿が酷い。99%以上は弾いてゐるが、極稀に投稿が成功しやがる。実に鬱陶しい。それで、昨日の日記にも書いたが、外人には理解できない入力をさせることで外人を排除してやることにした。ランダムで漢字を表示し、その読み仮名を入力させるのだ。スパム投稿の外人ではない善良な外人も排除してしまふ可能性がある。しかしこのサイトは元々日本語で書かれてゐる。そのサイトを見てゐる外国人なら漢字も読めるはず。といふか、まともな外国人は1人も見てゐないだらう。外人よりもむしろバカな日本人が排除されてしまふ可能性もあるのだが、俺は一般人の平均を著しく下回るバカに対する圧倒的な差別者なのでバカがどうならうと知つたことではない。本当は頭の悪い奴らを全部弾きたいから、難しい漢字を出してやらうかとも思つた。漢字検定2級レベルを出題してやらうかなと最初は思つてゐた。2級は小中高で習ふ常用漢字なので、高卒以上の人間が必ず習得してゐるはずのレベルだ。大学入試レベルと言ふと難しく感じるかもしれないが、一般人の平均レベルだと思ふ。実際に漢字検定のサイトで過去問を見たりすると、難しい漢字は全く無い。しかし、世の中には一般レベルの人間でもたまたま国語が不得意なのもゐたりする。高校を出てから新聞も本も読まずに生活してゐた人は忘れてしまつて読めないかもしれない。さういふ人間に無駄に苦痛を与へるのも悪いかなと、慈悲の心を放出して簡単な漢字だけを出すことにした。普通の日本人なら読めて当然、そして外人には読めない、さういふ漢字。どの程度が良いだらうか考へた。で、思ひついたのが日本国憲法前文。これは中3の時に社会の公民の授業で必ずやるだらう。俺は日本国憲法なんてウンコだと思つてゐるし、こんな奴隷根性を押し付けられたやうな卑屈なのはすぐに破棄すべきだと思つてゐるのだが、俺個人の思想とは全く関係無く、日本人なら誰でも読める、いや、読めなければならないものとして、現在の我が国の最高法規である日本国憲法の前文に使はれてゐる漢字を抽出して出題することにした。

出題される漢字は以下の87個。圧迫、安全、維持、一切、永遠、確定、確認、確保、各国、関係、享受、恐怖、協和、恵沢、決意、欠乏、権威、厳粛、憲法、権利、原理、権力、行為、恒久、行使、公正、行動、公布、国際、国政、国民、国家、国会、惨禍、自覚、自国、子孫、支配、社会、自由、主権、詔勅、除去、主権、信託、信義、信頼、人類、崇高、成果、政治、生存、正当、政府、世界、責務、選挙、宣言、専制、戦争、全土、専念、全力、相互、対等、代表者、他国、達成、地位、地上、道徳、人間、念願、排除、福利、普遍、平和、偏狭、法則、法令、保持、無視、名誉、目的、由来、理想、隷従。何だか猛烈にキモい熟語が並んでゐて嫌悪感を抱いてしまふのだが、まあ中身はどうでも良い。これで外人によるコメントスパム投稿は全て弾けるのではないかと思ふ。コメントスパム投稿はプログラムによつて自動的に行はれるもので、人間が手動でやつてゐるものではない。しかし、プログラムを作る人間が理解できないことはプログラムにも理解できない。例へ漢字を読める外人がプログラムを作るとしても、上記87種類が毎回ランダムで出題されるので対策は難しい。問題の総数がまづ分からない。1番が出題された時の答はこれ、2番が出題された時の答はこれ、といふ具合に全てのパターンをプログラムに入れておかないとダメだからまづ全問題を把握する必要がある。さうやつて苦労してプログラムに組み込んだとしても、残念なことにそのプログラムに汎用性は皆無。このサイトにしか使へないプログラムを苦労して作る意味が無いのだ。他の多数のサイトでも有効なプログラムを作つてこそ意味がある。といふわけで、漢字を読める外人が来たとしてもこのサイトに投稿するためだけのプログラムは作らない。問題が追加されたり問題が全て変更されたりしたら死ぬといふ点も大きい。このスパム対策を回避して書き込みをするプログラムを作る労力よりも圧倒的に問題を変へる方が楽だ。スパムプログラマの立場からしてもこれはかなり厄介だらう。といふわけで、上記の87種類の漢字を毎回ランダムで出題することにした。対象は日記のコメント、DebugBBSの新規投稿、DebugBBSのレス投稿の3つ。書き込みをしようと思つた時、もし万が一読めない漢字が出題されてしまつたら読める漢字が出るまでリロードしてくれ。まさかまともな日本人でこんな簡単な漢字が読めんなんていふ奴はゐないだらうと思ふけども。書けない可能性はあるけど読むことはできるだらう?

さて、さういふ機能を実装するためにはどうすれば良いだらうか。Webプログラミングの経験がある人間ならほとんど考へなくても即座に色々とやり方を思ひつくだらう。問題を今後増やす気も無いし数も多くないのでデータベースは使はない。まづは漢字の問題と答が書かれたファイルを用意する。圧迫\tあっぱく\n安全\tあんぜん\n・・・といふ具合に単純に列挙したテキストファイルを用意する。\tはタブ文字。\nは改行。実際にメモ帳等のテキストエディタにTabキーでタブ、Enterキーで改行を打ち込む。1行に漢字と読みをタブで区切りながら書いていくだけ。区切り文字は別にタブでなくてもコンマとかでもいい。さうやつて漢字と読みを交互に書いたテキストファイルを用意する。

次は日記や掲示板のCGIプログラムのファイルを開き、フォーム生成部分に手を加へる。フォームフィールドを1つ増やし、そこのラベルに問題を表示し、フィールド内に答を入力させるやうにする。その際、まづどの漢字が出題されるかを決める必要がある。毎回同じでは意味が無いのでランダムで。$num = int(rand(87));とやつてみる。intは他の言語でもほぼ必ず存在する関数で、数値を整数化する。小数点以下を切り捨てる。randは他の言語ではrndだつたりするが、乱数を生成する関数だ。Perlの場合は0以上引数未満の数値を生成する。この場合はintと合はせて0〜86までの整数の乱数を生成することになる。その整数を$numといふスカラー変数に代入する。

最初に作つた漢字と読みのリストのファイルをopenし、配列に読み込む。配列名は適当に@kanji_listにでもしておかう。行末の改行コードはchomp関数で削除しておく。先ほどの$numを配列の添へ字に使つて配列を使用する。配列変数の何番目の要素を使ふかといふ指定にこの乱数を使ふのだ。配列の添へ字は0から配列の要素数-1になるのでこれで良い。乱数で指定した配列の要素を取り出し、区切り文字(タブ)で切り離す。($kanji, $yomi) = split (/\t/, $kanji_list[$num]);漢字と読みを別々の変数に入れる。コメント投稿フォームのラベルにここで取り出した漢字$kanjiを含めて、『$kanji』の読み仮名(現代仮名遣い、平仮名)と書いておく。フォームフィールドのname属性はyomiとしておかう。あとで投稿ボタンを押された際にCGIに渡される値に付けられる名前だ。cgi-lib.plといふライブラリのReadParseサブルーチンを使ふと、%inといふ連想配列にフォーム内容が格納される。$in{'yomi'}といふ変数にyomiと名前を付けたフォームに入力された値が格納されることになる。あとは、どの問題が出題されたのかといふことを、次回実行時(投稿時)にプログラムに知らせるための値が必要になる。これはHTMLのinput要素、hiddenフィールドで送れば良い。name属性は適当にnumとしておかうか。値はvalue属性に先ほど生成した乱数の$numを書く。これで書き込み実行時には$in{'num'}で出題番号を参照できる。

投稿を実行した時に本文が空欄ではないかとか、不正な文字列が入力されてゐないか等をチェックする。同時に漢字の読み仮名入力が正しいかどうかもチェックする。問題の番号は$in{'num'}、入力値は$in{'yomi'}に格納されてゐる。番号の方はhiddenフィールドに書かれてゐたもので、人がフォームに入力したものではない。しかし、この値は改竄可能。偽のフォームを用意したり一寸弄れば簡単に思ひ通りの入力ができる。特定の数字で固定されて送られて来るはずだからと思ひ込んで入力チェックを怠るとそこに脆弱性が現れる場合がある。フォーム内容は全てチェックしてから使ふ。この場合、問題番号が数字でなかつたら問答無用でエラーにすれば良い。数字が0〜86の範囲を超えてゐた場合もエラーにすれば良いが、さうすると問題の総数がバレる可能性があるので数字なら取り敢へず通しておいても良い。この日記に87種類と書いてゐるから総数なんてモロバレなのだが、外人には犬土偶日記は読めないし、読めるならそもそもこの対策は無意味といふことになる。だからこの日記に問題の総数を書くことには何の問題も無い。

漢字と読みが列挙されたデータファイルを開き、配列に格納する。そして配列の添へ字に$in{'num'}を使つて調べる。その要素が出題された漢字のはずだ。配列名は同じやうに@kanji_listとしておく。出題された要素は$kanji_list[$in{'num'}]となる。これをやはり出題時と同様にsplitで切り離す。あとはこの切り離した後ろの方の読みの値と、入力された$in{'yomi'}の値を比較し、全く同じならば正解で書き込み実行、違つてゐれば不正解でエラーを出して終了、と。

たつたこれだけのことだが、これで外人をほぼ排除できるのではないかと期待してゐる。日記や掲示板の使ひ方が書かれてゐるページもこれに合はせて多少修正したりした。ローカルで書き込み実験して無事に動くことも確認した。そしてサーバーにUPして昨日の犬土偶日記に書き込みを試してみた。読みを間違へた場合と正しく書いた場合の2種類。どうやら無事にできてゐるやうだ。掲示板の方はローカルでは試したがサーバー上では試してゐない。投稿が成功するとメール登録してゐるメンバーに投稿内容が送られる。テキストだからパケ代はほとんど掛からないが0ではない。どうでも良い書き込みはしない方が良い。日記と同じサブルーチンを使つてゐるから日記で上手く行けば掲示板もOKなはずだといふことで、テストを省略した。

まだ20時だが、異常なまでに眠い。何時に起きたのか覚えてゐないが、夜から起きてゐる。もう寝る時間を過ぎてゐる。寝てしまふか。早く起きれたら地獄の散歩か?まだ昨日の疲労が癒えてないからやめておいた方が良いか。一度に無理して歩くよりは毎日少しづつ歩いた方が効率が良いのは分かるが、俺は狂人だから普通ではダメなのだ。満足できん。またまたギター練習時間0分。取り敢へず寝ることにする。

話題:Webプログラミングとか

Info.
公開日時不明
本文文字数5457文字 (タグ込み)
URLhttps://orca.xii.jp/debug/diary/diary.cgi?id=dogoo;date=20080703
RSS1.0https://orca.xii.jp/info/diary-dogoo.rdf
Comments
コメント投稿フォーム
文字色              
  • 名前を省略すると「名無しDebugger」になります。
  • メールアドレスの入力は任意です。
  • 海外からのコメントスパム対策のため、表示された漢字の読みを必ず入力してください。
  • 本文は必須項目です。投稿する場合は必ず記入してください。タグは使えません。
  • 改行が1つ入力された場合は強制改行として処理されますが、2つ以上連続する改行は段落の終了として処理されます。
  • 本文の行頭に「>」のある文は引用としてマークします。引用でない部分の冒頭に「>」は付けないでください。
  • コメントの削除は管理者若しくは日記執筆者しかできません。書き込む時は注意しましょう。
  • 全部記入が済んだら投稿ボタンを押す前に一度読み直して推敲しましょう。