今では、私たちは皆、オンライン形式でCaptchaの画像に遭遇しました。キャプチャは必要な悪であり、この記事はそれらがどのように作られているかを教えます。
RecaptchaなどのCaptchasのためのより良い自動サードパーティのソリューションはありますが、このチュートリアルは、そのようなテクノロジーが実際にどのように機能するかを説明し、実証することを目的としていることに注意してください。それは一般的な知識であると想定されており、すでに他の場所でより詳細にカバーされているため、Captchasが実際に何であるかを説明することはありません。
キーテイクアウト- PHPのGD(グラフィックドロー)ライブラリを使用して、通常、形状、歪み、テキストで構成されるCaptcha画像を作成できます。
- キャプチャ作成プロセスでは、空の画像の表示、形状の作成、ランダムな線とドットの生成、ランダムなテキストの生成が含まれます。 CAPTCHA検証プロセスでは、ユーザーの入力をセッション変数に保存されているCAPTCHA文字列と比較することが含まれます。入力がCaptcha文字列と一致する場合、ユーザーの応答は正しいとみなされます。
- 描画captchas
- 進行前にGD(グラフィックドロー)ライブラリをインストールする必要があります。このライブラリは、内蔵のPHP関数を介してグラフィックと画像の描画を可能にします。インストールするには、sudo apt-getインストールphp5-gdを実行するか、unubuntu以外のオペレーティングシステムにある場合は、指示に従ってください。 captchasは通常、形、歪み、テキストの3つのもので構成されています。
- 以下の手順に従います:
ブラウザに空の画像を表示します。
形状を作成します。
ランダムな行を生成します。
- ランダムテキストを生成します この記事で使用される手続きスタイルは、これが概念の証明であり、最終ファイルを可能な限り単純に保つためにのみ存在します。実際のプロジェクトでは、oopになります。
- 空の画像を表示
- 画像は、「IMG」タグを使用して外部画像が表示されているかのようにHTMLによって扱われます。 2つの関数が使用されます - 1つは画像を作成するために、もう1つは表示するためです。
- 最初の行は、ページ上のユーザーのセッションの開始を示します。
- display()関数には、ブラウザに画像を表示する通常のHTMLコードに他なりません。それ以外は、出力が見栄えの良いように見えるようにスタイリングのみが行われます。
最初のステップの後に黒の画像が出力になります。
形状を作成します
キャプチャには任意の形状を選択できます。関数ImageFilledRectangle()を使用して、長方形を選択します。画像参照、X-POSを開始する、Y-POSを開始する、X-POSの終了、Y-POの終了、および背景色の5つの引数が必要です。楕円形のキャプチャを生成するために、楕円に対応する関数を使用できます。
ImageColorAllocate()関数は、色のRGBの組み合わせを引数として取得するため、色を変数に割り当てます。次のコードは、create()関数に追加されます。
このステップの後、前の画像は白になります。
<span><span><?php </span></span><span><span>session_start(); </span></span><span><span>?></span> </span> <span><span><span><title>></title></span>demo.php<span><span></span>></span> </span> <span><span><span> <span>style<span>="<span>background-color:#ddd; </span>"</span></span>></span> </span> <span><span><?php </span></span><span> <span>create_image(); </span></span><span> <span>display(); </span></span><span> <span>/***** definition of functions *****/ </span></span><span> <span>function display() </span></span><span> <span>{ </span></span><span> <span>?></span> </span> <span><span><span><div> <span>style<span>="<span>text-align:center;</span>"</span></span>> <span><span><span><h3 id="gt">></h3></span>TYPE THE TEXT YOU SEE IN THE IMAGE<span><span></span>></span> </span> <span><span><span><b>></b></span>This is just to check if you are a robot<span><span></span>></span> </span> <span><span><span><div> <span>style<span>="<span>display:block;margin-bottom:20px;margin-top:20px;</span>"</span></span>> <span><span><span><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/174018679423680.png?x-oss-process=image/resize,p_40" class="lazy" alt="PHPとGDのシンプルなキャプチャ" > src<span>="image.png"</span>></span> </span> <span><span><span></span></span></span></span> </div></span>></span> </span> //div1 ends <span><span><span></span></span></span></span></span> </div></span>></span> //div2 ends </span> <span><span><?php </span></span><span> <span>} </span></span><span> </span><span> <span>function create_image() </span></span><span> <span>{ </span></span><span> <span>$image = imagecreatetruecolor(200, 50); </span></span><span> <span>imagepng($image, "image.png"); </span></span><span> <span>} </span></span><span> </span><span> <span>?></span> </span> <span><span><span></span>></span> </span><span><span><?php </span></span><span><span>?></span></span></span></span></span></span></span></span>
ランダムな線を生成します。
今、私たちは実際にキャプチャの歪み部分を作ることから始めます。 PHPでは、ラインは開始点(x1、y1)からエンドポイント(x2、y2)まで生成されます。これで、ラインがボックスの両端に触れたいので、座標を、つまりボックスの完全な幅として維持します。 座標はランダムに生成されます。これにより、1つのランダムな行が作成されます。この機能をforループ内に配置することにより、複数の行を生成します。
ImageLine()関数は、x1、x2、y1、y2の座標を、画像参照と線の色とは別に、その順序で引数として調整します。前のステップで背景色が割り当てられていたように、線の色は割り当てられています。
<span>$background_color = imagecolorallocate($image, 255, 255, 255); </span><span>imagefilledrectangle($image,0,0,200,50,$background_color);</span>
y座標はrand()*として与えられます。これはボックスの高さであり、常に50未満の値を返すためです。代わりにrand(0,50)を使用できます。それらは同じ出力範囲を生成します。
ランダムドットを生成します。
X座標は、rand()* 0を使用してランダムに生成されます。これはボックスの幅であり、常に200未満の値を返します。代わりにRAND(0,200)を使用できます。それらは同じ出力範囲を生成します。 y座標は、ラインステップのように生成されます。
ランダムなテキストを生成
文字列内の位置(下品と上品の両方にアルファベットが含まれています)をランダムに指し、変数$文字
に割り当てます。<span><span><?php </span></span><span><span>session_start(); </span></span><span><span>?></span> </span> <span><span><span><title>></title></span>demo.php<span><span></span>></span> </span> <span><span><span> <span>style<span>="<span>background-color:#ddd; </span>"</span></span>></span> </span> <span><span><?php </span></span><span> <span>create_image(); </span></span><span> <span>display(); </span></span><span> <span>/***** definition of functions *****/ </span></span><span> <span>function display() </span></span><span> <span>{ </span></span><span> <span>?></span> </span> <span><span><span><div> <span>style<span>="<span>text-align:center;</span>"</span></span>> <span><span><span><h3 id="gt">></h3></span>TYPE THE TEXT YOU SEE IN THE IMAGE<span><span></span>></span> </span> <span><span><span><b>></b></span>This is just to check if you are a robot<span><span></span>></span> </span> <span><span><span><div> <span>style<span>="<span>display:block;margin-bottom:20px;margin-top:20px;</span>"</span></span>> <span><span><span><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/174018680058090.png?x-oss-process=image/resize,p_40" class="lazy" alt="PHPとGDのシンプルなキャプチャ" > src<span>="image.png"</span>></span> </span> <span><span><span></span></span></span></span> </div></span>></span> </span> //div1 ends <span><span><span></span></span></span></span></span> </div></span>></span> //div2 ends </span> <span><span><?php </span></span><span> <span>} </span></span><span> </span><span> <span>function create_image() </span></span><span> <span>{ </span></span><span> <span>$image = imagecreatetruecolor(200, 50); </span></span><span> <span>imagepng($image, "image.png"); </span></span><span> <span>} </span></span><span> </span><span> <span>?></span> </span> <span><span><span></span>></span> </span><span><span><?php </span></span><span><span>?></span></span></span></span></span></span></span></span>
ループ内に置くと、このように見えます -
<span>$background_color = imagecolorallocate($image, 255, 255, 255); </span><span>imagefilledrectangle($image,0,0,200,50,$background_color);</span>
行を説明します
<span>$line_color = imagecolorallocate($image, 64,64,64); </span><span>for($i=0;$i <span>imageline($image,0,rand()%50,200,rand()%50,$line_color); </span><span>}</span></span>次のセクションで
。
関数Imagestring()は、画像にテキストを書き込みます。 6つの引数があります:
- 画像参照。
- テキストのフォントサイズ(せいぜい5になることができます)。
- x-coordinate(すべてのアルファベットで比例して変更)。
- y座標(同じものを保持しますが、これもランダムに変更できます)。
- 書き込まれる実際の文字列。 テキストのフォントカラー。
X座標の計算は、検査によって行われます。大まかに、文字は約35ピクセル(5($ i*30))に間隔が塗られています。ここで、$ i = 0,1,2,3,4,5,6です。これは、この値を15〜20px程度に保持していた場合、2文字が重複する可能性があったためです。値が40pxを超えていた場合、文字は完全にボックスに収まりませんでした。
これにより、6アルファベットのCaptchaテキストが生成されます。色、Y座標など、シンプルさのために一定に保たれている側面を変更することにより、いつでもよりランダムさを作成できます。最後のキャプチャはこのように見えます
キャプチャに記載されているテキストは、ページを更新するたびに変更されます。
ピクセルでデザインを作成したり、色やサイズを変更したりすることで、よりランダム性を実現できます。
検証
ここでは、ユーザーの応答が取得され、処理後、返信を受け取ります。最初は、入力テキストボックスと送信ボタンで簡単なフォームが作成されます。複雑なWebアプリケーションの要件に従って、キャプチャを処理する多くの方法があります。ただし、この例のためにシンプルに保つと、同じページで処理します。
$ word。= $ letter; - 連結演算子。個々の文字を次々に追加するために使用され、6文字の単語が生成されます。
$ _セッション['captcha_string'] = $ word; Captcha文字列は、検証目的で使用されるセッション変数に保存されています。
- display()の定義を変更して、フォームのような構造を追加します。
- 2つの提出ボタンが使用されます。1つは文字列を送信し、もう1つはページを更新します。 次の行は、2つのクロージングDivタグの間に追加されます(前のdisplay()関数のコメントを参照)
-
<span><span><?php </span></span><span><span>session_start(); </span></span><span><span>?></span> </span> <span><span><span><title>></title></span>demo.php<span><span></span>></span> </span> <span><span><span> <span>style<span>="<span>background-color:#ddd; </span>"</span></span>></span> </span> <span><span><?php </span></span><span> <span>create_image(); </span></span><span> <span>display(); </span></span><span> <span>/***** definition of functions *****/ </span></span><span> <span>function display() </span></span><span> <span>{ </span></span><span> <span>?></span> </span> <span><span><span><div> <span>style<span>="<span>text-align:center;</span>"</span></span>> <span><span><span><h3 id="gt">></h3></span>TYPE THE TEXT YOU SEE IN THE IMAGE<span><span></span>></span> </span> <span><span><span><b>></b></span>This is just to check if you are a robot<span><span></span>></span> </span> <span><span><span><div> <span>style<span>="<span>display:block;margin-bottom:20px;margin-top:20px;</span>"</span></span>> <span><span><span><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/174018680328497.png?x-oss-process=image/resize,p_40" class="lazy" alt="PHPとGDのシンプルなキャプチャ" > src<span>="image.png"</span>></span> </span> <span><span><span></span></span></span></span> </div></span>></span> </span> //div1 ends <span><span><span></span></span></span></span></span> </div></span>></span> //div2 ends </span> <span><span><?php </span></span><span> <span>} </span></span><span> </span><span> <span>function create_image() </span></span><span> <span>{ </span></span><span> <span>$image = imagecreatetruecolor(200, 50); </span></span><span> <span>imagepng($image, "image.png"); </span></span><span> <span>} </span></span><span> </span><span> <span>?></span> </span> <span><span><span></span>></span> </span><span><span><?php </span></span><span><span>?></span></span></span></span></span></span></span></span>
さらに移動する前に、入力ボックスを表示する時期といつ表示しないかを知る必要があります。のみ表示されます
- ページが読み込まれた場合。
- ユーザーの回答が間違っていた場合。
これを達成するために、記事の冒頭での開始ステップの次の行を置き換えます:
<span>$background_color = imagecolorallocate($image, 255, 255, 255); </span><span>imagefilledrectangle($image,0,0,200,50,$background_color);</span>
<span>$line_color = imagecolorallocate($image, 64,64,64); </span><span>for($i=0;$i <span>imageline($image,0,rand()%50,200,rand()%50,$line_color); </span><span>}</span></span>
前のページからセッション変数が必要になるため、セッションはここでは破壊されません。ブラウザウィンドウが閉じられると、セッションは自動的に破壊されます。
キャプチャは次のようになります -入力が正しくない場合にのみ、ユーザーが再びプロンプトされます。
入力が正しい場合、ユーザーにメッセージが表示されます。
マイナーな注意事項があります。ユーザーが戻るボタンを押すと、ブラウザのキャッシュに既に存在する画像はリロードされませんが、ページが表示されます。 POSTリクエストでは、ブラウザのバックボタンには「ドキュメントの有効期限が切れた」ページが表示されますが、リクエストが取得されると、画像は再生されません。
セッションを開始した場所のすぐ下にこの行を追加します:ソリューションはシンプルです - 毎回画像の一意の名前を作成しているため、ブラウザがキャッシュに表示されないようにします。ブラウザでの作成中および表示中に、Image Nameに組み込まれたTime()関数によって返された一意の文字列を追加します。
display()関数のIMG SRCタグを
に置き換えます<span>$pixel_color = imagecolorallocate($image, 0,0,255); </span><span>for($i=0;$i <span>imagesetpixel($image,rand()%200,rand()%50,$pixel_color); </span><span>} </span></span>
に置き換えられます<span>$letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; </span><span>$len = strlen($letters); </span><span>$letter = $letters[rand(0, $len-1)]; </span> <span>$text_color = imagecolorallocate($image, 0,0,0);</span>
<span>for ($i = 0; $i <span>$letter = $letters[rand(0, $len-1)]; </span> <span>imagestring($image, 5, 5+($i*30), 20, $letter, $text_color); </span> <span>$word.=$letter; </span><span>} </span><span>$_SESSION['captcha_string'] = $word;</span></span>
ここから完全なコードをダウンロードしてください。
結論
PHPでさまざまな種類のキャプチャを作るのは非常に簡単です。この記事では、標準的なキャプチャの作成に使用される3つの基本的なもの、つまり形、歪み、テキストについて説明しました。この記事は概念の証明であり、ここに示されているコードは、生産に使用されるべきではありません。特に、聴覚障害のある人々を支援するための健全な出力もサポートするRecaptchaなどの優れた代替品が存在するためです。この記事が面白いと思います。以下にコメントとフィードバックを残してください!
PHP GDを備えたシンプルなキャプチャに関するよくある質問(FAQ)連絡先フォームにcaptchaを追加するにはどうすればよいですか?
連絡先フォームにCaptchaを追加するには、フォームのHTMLおよびPHPコードの変更が含まれます。 HTMLでは、Captchaの画像タグと、ユーザーがCaptchaを入力するための入力フィールドを追加する必要があります。 PHPでは、CAPTCHAを生成してユーザーの入力を検証する必要があります。
captchaはスパムを防ぐための一般的な方法ですが、それが唯一の方法ではありません。その他の方法には、ボットが記入するが、人間はそうしない隠されたフォームフィールドであるハニーポットの使用、フォームに記入するのにかかった時間など、ユーザーの動作を確認し、Akismetのようなサービスを使用してフィルターアウトします。既知のスパムのデータベースに基づいたスパム
以上がPHPとGDのシンプルなキャプチャの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

Laravelのサービスコンテナとサービスプロバイダーは、そのアーキテクチャの基本です。 この記事では、サービスコンテナ、詳細サービスプロバイダーの作成、登録、および実用的な使用法を例で説明します。 Oveから始めます

PHPロギングは、Webアプリケーションの監視とデバッグ、および重要なイベント、エラー、ランタイムの動作をキャプチャするために不可欠です。システムのパフォーマンスに関する貴重な洞察を提供し、問題の特定に役立ち、より速いトラブルシューティングをサポートします

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

SublimeText3 中国語版
中国語版、とても使いやすい

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

ドリームウィーバー CS6
ビジュアル Web 開発ツール

WebStorm Mac版
便利なJavaScript開発ツール

ホットトピック



