• ベストアンサー

ランダムな文字列の含まれた画像を表示させたい

ウェブサイトのユーザ登録のさいに、ロボットによる大量自動登録をさけるために、 ランダムな文字列の含まれた画像を表示させ、その文字列を入力することにより、 人間による登録だと判断させる方法がありますが、 あれは、どうやって実現しているのでしょうか? なお、環境はCentOS4、Apache2.0.52、MySQL4.1.20、PHP4.3.9です。 PHPにGD組み込んでます。(使ったことはないのですが・・・) なお、画像はgifを希望しています。 また、できれば、 ●文字列を音声で発音してくれる機能 ●l(エル)と1(イチ)、5とS(エス)などまぎらわしい文字は排除したい の2点を実現できればと思っています。 以上、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.6

#1です。 結構有名なページですが、ゲイツ認証ってのがあります。はっきり言って笑えます。こういう認証なら誰も嫌がりませんよね。 http://captcha.jp/ ゲイツは間違う可能性はありますが、みのもんたはどれ、とかなら間違う人はいないでしょうね。 あと、簡易的にはJavaScriptを使ったものがあります。画像をその場で生成するのではなく、最初に作っておいたものを表示するようです。 http://youmos.com/news/captcha_validation PHPでGD使えば容易く画像を作れますが、サーバ負荷を考えると必要かつ十分な数だけ先に画像を用意しておいて認証に使うというのも一つの解決策かもしれませんね。

daisuke_dm
質問者

お礼

お礼が遅くなってしまってすみません。 ゲイツ認証、笑えました。 日本人なら、タモリが一番間違えにくいかな?w >あと、簡易的にはJavaScriptを使ったものがあります。画像をその場で生成するのではなく、最初に作っておいたものを表示するようです。 なるほど・・・。 CAPTCHA、奥が深いですね。 あと、サーバ負荷のことを考えていませんでした。。。。うっかり。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

  • wp_
  • ベストアンサー率54% (132/242)
回答No.5

>暗号化 すみません当方の勘違い^^; 送信データなどは平文で問題ないすね。 // 送信データを暗号化して_SESSIONにも暗号化した物を置いて・・・て最初からssl使えよって話になる^^; >session id 冗長にしか過ぎないのですが、意図しないPOSTなどに対応できるのですよ。 httpのクエリを恣意的なものにして送信することでF5アタックと同等の効果を得られるバッチを組むことが出来ますが、 セッションID(厳密にはcookie)を破棄させればフォーム画面を呼びなおさねばなりません。 もちろん$_SESSIONそのものを破棄させることでも対応可能ですけど、 IDを保持しているか 破棄しているか では堅牢さが微妙に違います。 >これ、アニジフwでなくても、JavaScriptで画像を置き換えていけば、同じことが実現可能ですね。 これもアニジフ大先生並みに設計が面倒ですけどね^^; ブラウザごとの対応だけでなく マシンスペックや環境によっては超高速で画像が切り替わったり、とか良くあります。 キチンとしたコーディングをすれば問題ないですけど、検証がまた面倒・・・・ ついでにJS切られてるとアウト・・・ そういう意味ではアニジフ大教授はかなり偉大な存在であらせられますな。 >でも、結局人海戦術には負けますが。これだけ流動的なQ&Aならどうかなあと。 入力するエンドユーザさんからしてみれば「ウゼェ!」ってなるかもしれませんね。^^;

daisuke_dm
質問者

お礼

お礼が遅くなってしまってすみません。 暗号化とsession idについての解説ありがとうございます。 >JavaScript なるほど、そうですよね。。。 >そういう意味ではアニジフ大教授はかなり偉大な存在であらせられますな。 ですねー。 >入力するエンドユーザさんからしてみれば「ウゼェ!」ってなるかもしれませんね。^^; うーん、確かに。あるいみ(エンドユーザにとって)おもしろいかな、ともおもったのですが・・・やっぱりうざいですよね・・・。 ありがとうございます

全文を見る
すると、全ての回答が全文表示されます。
回答No.4

#1です。 盛り上がって来ているのでちょっと参戦します。 一般的なCAPTCHAなら、#1のリンクを辿れば導入はそう難しくないでしょう。GDを使った事が無くても使える環境さえ整えれば実装できるかと。 音声でというはとても面白いかもしれませんね。障害者向けだったり。ただ、音声認識でロボットに破られる、なんて事だと元も子もありませんが(笑。 余裕があれば作ってみたいですが、ming関数を使ってFlashを作ったり(アルファベット読音声のswfを埋込む)、外部スクリプトでmp3を合成させたりすれば可能かと思います。flashなら音声と画像をいっぺんに表示する事が可能ですね(画像はFlashでも合成可能でしょうが、解析されれば意味が無いのでGDで作ったものを外部読込み)。 また、ほとんどのCAPTCHAはアルファベットですが、日本語を使えば海外からのアクセス制限が比較的容易になると思います。日本語の入力は外国人には難しいでしょうし、投稿スパムの多くは海外からのものが多いと言う事もあります。漢字とひらがなならほんのちょっと崩すだけでOCR出来なくなりますし。辞書から引っ張って来た文字列ならば入力も簡単なのでユーザフレンドリーって感じです(一般的なCAPTCHAはランダム文字列なので入力が難しい)。 日本語のもの http://php.to/tips/8/ http://drupal.0829.info/module/captchajp 参考まで。

daisuke_dm
質問者

お礼

ありがとうございます。 >音声でというはとても面白いかもしれませんね。障害者向けだったり。 #3さん(=#2さん)へのお礼にもアクセシビリティのことを書いたのですが、 そか、別に音声だけでなく、画像と音声の両方を掲載すればいいですよね。。。っていうか、普通そうか。。。 >ming関数を使ってFlashを作ったり(アルファベット読音声のswfを埋込む)、外部スクリプトでmp3を合成させたりすれば可能かと思います。 おー、おもしろそうですね。 また、日本語のCAPTCHA、おもしろいし、有効ですね。 >漢字とひらがなならほんのちょっと崩すだけでOCR出来なくなりますし。 なるほど、「みのもんた」より「明石家さんま」のほうが認識されないですね。 -- あと、話題が若干それますが、#1へのお礼に書いた、W3Cのページに、パズルを掲載するってのがあったのですが、5問くらい簡単な問題を出すって有効かなあと思いました。 たとえば、 ●あなたの希望するログインIDは何文字ですか?(フォームの他の項目と絡めると、難しそうかなと) ●アメリカに今まで何回行ったことがありますか?(わざと、答えがどうでもいい質問をだす。最後の質問のため) ●このドメインは「http://www.*****.com」ですが、「*****」の部分は何文字ですか?(他のサイトで流用されてもいいように、サイトによって答えが異なる問題をだす。独自ドメインを持っていないとだめですが) ●今日は何日?(深夜0時をまたぐと困りますが。そしたら、「今は何月?」。月をまたぎそうなら、「今年は西暦何年?」。年をまたぎそうなら、「もうすぐ今年も終わりますね。年が変わったら、西暦何年?」) ●この問題、何問目?(クイズタイムショック的にw) ・・・のような問題をランダムに出す。 で、最後の質問は ●今までの答えを、全て足したら、いくつですか? みたいなのを画像で表示・・・って画像重たくなるけど・・・ってどうでしょう? 答えを入力する欄が、質問の数だけ必要ですが、答えが数字なら楽かなと。 でも、結局人海戦術には負けますが。これだけ流動的なQ&Aならどうかなあと。 どうでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • wp_
  • ベストアンサー率54% (132/242)
回答No.3

>既存のCAPTCHAを使うとしたら、どれが比較的安全に、スパマーに対応できるものなんでしょうか? 堅牢さで言えばどれも同じだと思いますよ。 結局のところ機械的に(ロジカルに)破るのが難しいだけで、人海戦術・偽装ページからの誘導・アナログな方法でのhackなどに対しては無力です。 また、先に述べた3つのファイルでも完全でなく、いろいろ工夫する必要はあります。 (暗号化とか、セッションIDの刷新とか。 私はすべて使ったことがあるわけではないのでどれがいいというのは分かりませんが、 CAPTCHA Xは見たことがあります。導入もそれほど難しくないです。 >これって、アニジフだからスパマーにとっては解析しづらいかもしれないし、 高橋メソッドと言え・・・っ!!(ざわ アニジフって誰だろうと素で思った。^^; >どう思います? 面白いですね。 日本のサイトでもどこかで見たことある気がします・・・が失念。 画像の生成ロジックがかなり苦心しそうですが。^^; アニメーションgifの生成は確かpeclでないと出来ないので面倒と言えば面倒かもしれません。 画像バイナリを無理やりくっ付けることで実装することも出来ますが。。

daisuke_dm
質問者

お礼

あ・・・アニジフなんて表現って今どきしませんね。すみません^^; >堅牢さで言えばどれも同じだと思いますよ。 >結局のところ機械的に(ロジカルに)破るのが難しいだけで、人海戦術・偽装ページからの誘導・アナログな方法でのhackなどに対しては無力です。 確かにおっしゃるとおりですね。 >暗号化とか、セッションIDの刷新とか。 すみません、これって具体的にはどういうことを意味しているのでしょうか? ●暗号化・・・htmlをJavaScriptで暗号化して、なんじゃこりゃーなhtmlソースにする・・・?って違うかな。でもこれって有効かも。 ●セッションIDの刷新・・・「セッションIDの刷新」という意味はわかるのですが、どういう効果があるのでしょうか? しかし、 #1さんへのお礼に書いたW3Cのページにも書いてあったのですが、 スパマーに対抗しようとすると、それだけ、アクセシビリティが悪くなりますね。というか、「スパマーへの対抗」と「アクセシビリティ」の両立は、どう考えても実質不可能かな。 ↑でアクセシビリティと言ったのは、病気として知覚に問題がある人に対しての配慮だけではないです。たとえば、どこだったかな、マイクロソフト系のサイトで、文字列を読み上げる機能があって、 だけどそれを聴くと、すごいノイズが入っていて、お経を唱えているようなボイスも入っていて、その中で、日本語で、「イチ・・・ヨン・・・サン・・・ロク・・・シチ」と言ってました。 自分は特に知覚に問題があるわけではないですが、わかるまで5回くらい再生しました・・・。 で、アクセシビリティを考慮しなくていいのなら、 >日本のサイトでもどこかで見たことある気がします・・・が失念。 >画像の生成ロジックがかなり苦心しそうですが。^^; これ、アニジフwでなくても、JavaScriptで画像を置き換えていけば、同じことが実現可能ですね。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • wp_
  • ベストアンサー率54% (132/242)
回答No.2

CAPTCHAは既存の物を使うのが手っ取り早いですね~ >あれは、どうやって実現しているのでしょうか? phpで実装するのに必要なのは3つ。 1.画像を動的に生成して標準出力し、入力させたい文字列をセッションで保持させるプログラム 2.入力用のフォーム 3.入力された文字列とセッションの等価をチェックするプログラム 実は凄く簡単に作れるんですよ。 phpでgdとセッションを扱うときの入門に最適ですな。 脱初心者を目指している人に作らせたいプログラムでもあります。 総コードも300行くらいだった気がする。 音声についてはphpで生成するには荷が重いかもしれません。 出来るのかもしれませんが。

daisuke_dm
質問者

お礼

ありがとうございます。 回答が前後しますが、 >音声についてはphpで生成するには荷が重いかもしれません。 アクセシビリティを考えてこれはやめようと思います。 >phpで実装するのに必要なのは3つ。 >1.画像を動的に生成して標準出力し、入力させたい文字列をセッションで保持させるプログラム >2.入力用のフォーム >3.入力された文字列とセッションの等価をチェックするプログラム >実は凄く簡単に作れるんですよ。 なるほどたしかに。 たぶんGDを使ったことがないから、 苦労しそうなんでしょうね。。。 >CAPTCHAは既存の物を使うのが手っ取り早いですね~ やっぱりそうしようかな。。。 ただ、 #1さんがあげてくださった、 http://ja.wikipedia.org/wiki/CAPTCHA に、 「最も有名なCAPTCHAの一つのEZ-Gimpyを打ち破る手法を詳述した論文を発表し、その手法は92%の的中率であると検証された。」と・・・。 意味ない・・・。 既存のCAPTCHAを使うとしたら、どれが比較的安全に、スパマーに対応できるものなんでしょうか? もしご存じでしたら、お教えいただければ幸いです。

daisuke_dm
質問者

補足

補足させてください。もしお手すきならば。。。、 http://www.phpclasses.org で、CAPTCHA のタグで、検索して、トップの評価を得ているものに、 http://www.querythe.net/Animated-Gif-Captcha/#leave_a_comment (デモです) がありました。 これって、アニジフだからスパマーにとっては解析しづらいかもしれないし、 簡単な計算式を表示させてるので、(で、答えを入力する)、ロボットは計算できない・・・ので いいかな・・・と思ったのですが(あくまで素人考え) どう思います?

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

CAPTCHAですね。URLを参照してください。たくさんありすぎて紹介出来ません(笑。 http://ja.wikipedia.org/wiki/CAPTCHA http://phpspot.org/blog/archives/2006/11/phpcaptcha.html

daisuke_dm
質問者

補足

ありがとうございます。本当にいろいろあるんですね。 でも、wikiを読んだら、スパマーは結構みやぶってるらしく・・・それが懸念です。 wikiのページからとんだ、 Inaccessibility of Visually-Oriented Anti-Robot Tests http://www.w3.org/TR/turingtest/ をひととおりよんでいました。 (日本語訳のページもあるみたいだけど、つながらないです) 目次を抜粋すると、 # 3. Possible solutions * 3.1 Logic puzzles * 3.2 Sound output * 3.3 Limited-use accounts * 3.4 Non-interactive checks o 3.4.1 Spam filtering o 3.4.2 Heuristic checks * 3.5 Federated identity systems o 3.5.1 Single-sign-on o 3.5.2 Public-key infrastructure solutions o 3.5.3 Biometrics * 3.6 Other approaches(クレカ番号を入れさせるとか) だそうで、 結局いくつかの方法を併用するのがベストなのでしょうね。 でも手間が・・・。 ともあれ、ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • phpのGDで画像の特定色だけを他の色に塗りつぶし

    一応環境です centos5.5 apache 2.2.3 php 5.3.3 phpのGDで画像の特定色だけを他の色に塗りつぶすことはできるでしょうか? 例えば、白(R:255 G:255 B:255)の部分だけをすべて他の色に変更する。といったことがしたいのですが、GDでは難しいでしょうか?

    • ベストアンサー
    • PHP
  • 画像ファイルに文字列を合成

    こんばんは。お世話になっております。 ブラウザからアップされた画像ファイルに、文字列を付け加えて保存したいと考えているのですが、GD利用ということで手元にある本やネットで色々調べてはいるものの、黒い画面(画像)が出てくるのみで、「やりたいことに副ってない?」と半信半疑な心境に駆られている状態です。 イメージ的にはよく「SAMPLE」と記載された画像があると思うのですが、この「SAMPLE」自体を透過加工したGIFを事前に揃えておくのか?それとも単なる文字列を画像ファイルに合成?させることで叶うものなのか?さえも手探り状態が続いています。 例えば以下のページにある画像のようなものを描いています。 http://www.photolibrary.jp/img48/7058_149125.html imagemagickを導入すれば・・とまでは、本サイトの同じカテゴリにも紹介がありますが、まず、GDにて文字列を画像ファイルに合成させる場合の簡単なサンプルでもお教えいただければ幸いに思っております。 ※教えて君のような恐縮なのですが・・・手探り状態から抜け出せずにおりまして・・・ご理解願えれば幸いです。

    • 締切済み
    • PHP
  • GDで生成したはずの画像が文字列として表示される!

    PHP初心者です。いろいろ調べたのですが解決策が見つかりません。なんとか解決策を教えてください。よろしくお願いします。 imagejpeg()で画像を生成したつもりなのですが、文字列として下のように表示されてしまいます。 ・・ JFIF ・>CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), default quality 棧C $.' ",# (7),01444 '9=82<.342棧C 2! !2222222 画像データがそのまま文字で打ち出されているようです。 こちらの環境は、 ・さくらインターネットの共用サーバー ・php.iniはデフォルトのまま ・文字コードは、euc-jp ソースは以下の通りです。 <?php Header ("Content-type: image/jpeg"); $test = imagecreate(200, 200); $bcolor = imagecolorallocate($test, 0, 0, 0); imagejpeg($test); imagecolordeallocate ($test,$bcolor); imagedestroy($test); ?>

    • ベストアンサー
    • PHP
  • 長さ1の空文字列?

    タイトルの通り、長さ1の空文字列で困っています。 現在、Linux、Apache、MySQL、PHPを使って3階層アプリケーションを作っています。 予めMySQLでテーブルの形を決めておいて、CSVからデータを読み込ませておき、 PHPでSQL文を実行してレコードを取得することで、それらをユーザに表示という感じです。 複数あるカラムのうち、空文字列(CSV上でブランクだったもの)は表示させたくないので、 PHPで「 if(カラム=="")~ 」のように比較することで、空文字列だけ避けるつもりでした。 しかし上手くいかなかったので、strlen()で調べて見たところ、返り値が1でした。 本来は空文字列に対してstrlen()は0或いはfalseの返り値を返しますよね。 is_empty()でも空データ扱いにならず、当然NULLの扱いでもありません。 そのため、実データとの区別が出来ずに困っています。 何故、空文字列のカラムを除外したいかというと、 DB上のユニークなレコードを検索したいからです。 select * from where カラム='データ' and カラム='データ'… という風に。 「カラム=''」としてしまうと検索に引っかからなくなってしまいます。 どうすればよいでしょうか。 以下はそれぞれのバージョンです。 MySQL:5.0.95 PHP:5.1.6 Linux:RHEL5 Apache:2.2.3

    • ベストアンサー
    • PHP
  • PHPのGD系の関数で描画した文字列の下に下線を引きたい

    PHPのGD系の関数で描画した文字列の下に下線を引きたい PHPのGD系の文字列関数がありますよね? (例:日本語が扱えるやつだとImageTTFTextとか) これで文字列の長さに揃えてリンクっぽく見せるために 下線を引きたいのですが、良い手法が思いつきません。 文字数をstrlenでカウントしてフォントのサイズ/2を掛けたら 文字列の長さになるかなーと思って試しましたが、 これだとaとあの文字の横幅が違うようにずれが出ます。 あるフォントである文字列描画関数を使ったときに文字列の横幅が 調べられるような手法があれば、その長さに応じた下線が引けるのですが、 そうした手法はないでしょうか?

    • ベストアンサー
    • PHP
  • 画像処理での文字の処理について

    formのtextareaから文字を受け取り、その文字を画像に書き込むプログラムを作成しています。 処理手順は、 1.[a.php]にあるtextareaに文字を入力   <textarea name="intxt" rows="10" cols="30"></textarea> (FORMのmethodはPOST)    2.submitで値を送信し、[b.php]で処理   [a.php]:print "<img border='0' src='b.php?imgfile=$imgfile&txt=$txt'>";      [b.php]:$imgfile=$_GET['imgfile'];/*画像*/        $txt=$_GET['txt'];    /*入力文字*/        文字を画像に書き込むときに、  aaa  bbb という風に画像に書き込みたいのですが、処理をすると  aaabbb  となります。 そこで私が考えた方法は、改行コードで文字列を切り取り、【 $text=explode("\n",$txt); 】 for文で書き込むという方法でしているのですが、うまく文字列を切り取れません。 改行コードが間違っているのでしょうか? それとも、改行コードでは切り取れないのでしょうか? 検索をかけてみたり、他の質問を見てみたのですが、うまく出来ませんでした。 それと、日本語で文字列を渡すためにはどのような関数を使えばよいのでしょうか? マルチバイト文字列はrawurlencode()を噛まさねば渡すことが出来ないというのはわかったのですが、 どういう風に噛ませるのかわかりません。 いろいろと試したのですが、表示されませんでした。 他にも方法があるのでしょうか? 開発環境は、PHP5.2.5、Apache2.2、WindowsXPです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PostgreSQLのラージオブジェクトを使って画像を表示したい

    現在、PostgreSQL+PHPで画像管理DBを作成しています。 開発環境は、 Solaris8 Apache1.3.12 PostgreSQL7.1.3 PHP-4.1.0 で行っています。 今、PostgreSQLのラージオブジェクトを使用して画像(JPEG)のDBへの登録及び画面に表示するところを作っているのですが、PHPのスクリプトを作成してWeb上から動作確認を行ったところ、画面に以下の文字が表示されました。 =====表示される文字列===== ・・JFIF,,・厥hotoshop 3.08BIM,, ・'File written by Adobe 屯胖7GWgwt6Х牌范 : ========================= 多分、画像(JPEG)のバイナリがそのまま出力されていると思われます。 これは、PHPの問題なのでしょうかそれとも、DBへの登録が失敗したのでしょうか? 教えていただけないでしょうか?また、 PHP4.1.0+PostgreSQL7.1.3の環境で画像管理DBのなにかサンプルがあれば教えてください。

    • 締切済み
    • PHP
  • 文字列の置換について

    こんにちは、kanpoと申します。 今回文字列の置換についての質問をさせていただきたいと思います。 やりたいことは以下のとおりです。 たとえば、あるStringデータに”あかさた#1728なはま#7586やらわ”などという 文字列が入ってるとします。 この文字列のなかから"#1728"と"#7586"を検索しそれぞれを #1728 → test #7586 → test2 と変換し最終的にもとのStringデータを ”あかさたtestなはまtest2やらわ”としたいのです。 説明が長くなってしまい申し訳ありませんがよろしくご教授ください。 環境は下記のとおりです。 RedhatLinux6.2J apache-1.3.12-0jp1.i386 php-3.0.15_i18n_ja-0vl2.i386

    • ベストアンサー
    • PHP
  • マルチバイト文字を画像に書き込みたい

    いつもお世話になっています。 画像に文字を書き込むプログラムを作成中なのですが、 日本語を書き込もうとすると文字化けを起こしてしまいます。 文字は、EUC-JPで処理するようにしています。 【index.php】にHTMLでフォームから値(文字列やフォントなど)をとり、 【a.php】で画像に文字を書き込む処理をし、 【index.php】で作成した画像を表示させるプログラムです。 マルチバイト文字を送信する際に、 $text=rawurlencode($text);  【index.php】 をし、【a.php】では、   $text=$_GET['text'];   $text=rawurldecode($text); をして、   imagettftext($im, $fontsize, 0, 12, $fontsize+8, $color, $font, $text); 書き込みを行っています。 マルチバイト文字を送信する際にこの方法が出来ない場合、他に方法があるのでしょうか?? 開発環境は、Windows XP、PHP5.2.5,Apache2.2です。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • POST文字列が化ける(外字)

    以下の環境で、システムを開発しています。 OS = Windows2000 SP4 Apache = 2.0.58 PHP = PHP 5.1.6 magic_quotes_gpc = Off mbstring.language = Japanese mbstring.internal_encoding = SJIS mbstring.http_input = auto mbstring.http_output = SJIS mbstring.encoding_translation = On mbstring.detect_order = auto mbstring.substitute_character = none; このような設定で、コードはSJISで書いています。 外字エディタで外字が登録してあります。 この外字をフォームから、POSTで受取たいと思っています。 さきほども似たような内容で質問しました。 その後、いくつか分かったことがあるので、質問しなおします。 POSTする文字列が、 ・外字一文字の場合 ・先頭が外字の場合 は、化けないことが分かりました。 つまり、なんらかの文字列の間に文字列が入ると化けるのです。(化けないこともあります。)たぶん周りの文字を巻き込んでしまうのだと思います。 何か解決方法に心あたりないでしょうか?

    • 締切済み
    • PHP