C++でCAPTCHAを生成し、ユーザー入力を検証するプログラムの作り方
このチュートリアルでは、CAPTCHA(キャプチャ)を自動生成し、ユーザーの入力を検証するC++プログラムについて詳しく解説します。
CAPTCHAとは、Webサイトなどで「人間による操作かどうか」を判別するために使われる仕組みです。本記事では、以下のような流れで実装していきます。
- システムがランダムな文字列を生成し、ユーザーに表示する
- ユーザーに対して、表示された文字列と同じ内容を再入力してもらう
- 表示された文字列と入力された文字列が一致しているかどうかを照合する
なお、生成されるCAPTCHAはa〜z、A〜Z、0〜9の62種類の文字から構成される完全なランダム文字列である必要があります。
サンプルコード
#include<bits/stdc++.h>
using namespace std;
// 2つの文字列が一致しているかどうかを判定する関数
bool check_string(string &captcha, string &user_captcha){
return captcha.compare(user_captcha) == 0;
}
// ランダムな文字列としてCAPTCHAを生成する関数
string gen_captcha(int n){
time_t t;
srand((unsigned)time(&t));
char *chrs = "abcdefghijklmnopqrstuvwxyzABCDEFGHI" "JKLMNOPQRSTUVWXYZ0123456789";
string captcha = "";
while (n--)
captcha.push_back(chrs[rand()%62]);
return captcha;
}
int main(){
// 9文字のCAPTCHAを生成
string captcha = gen_captcha(9);
cout << captcha;
string usr_captcha;
cout << "\nEnter CAPTCHA : ";
usr_captcha = "fgyeugs56"; // ユーザーの入力(テスト用)
if (check_string(captcha, usr_captcha))
printf("\nCAPTCHA Matched");
else
printf("\nCAPTCHA Not Matched");
return 0;
}
コードのポイント
1. gen_captcha関数:ランダム文字列の生成
srand((unsigned)time(&t))によって現在時刻をシード値として設定し、実行ごとに異なる乱数列が得られるようにしています。候補となる62種類の文字から、rand()%62でインデックスを決定し、指定した文字数(ここでは9文字)だけ文字列を構築します。
2. check_string関数:文字列の照合
std::string::compare()メソッドを使い、2つの文字列が完全に一致した場合のみ 0 を返す仕組みです。大文字・小文字も厳密に区別されるため、CAPTCHAの検証に適しています。
実行結果
nwsraJhiP Enter CAPTCHA : CAPTCHA Not Matched
この例では、生成されたCAPTCHAは「nwsraJhiP」ですが、ユーザー入力として与えられた文字列は「fgyeugs56」のため、両者は一致せず「CAPTCHA Not Matched(不一致)」と判定されています。
まとめ
このように、乱数を利用した文字列生成と単純な文字列比較を組み合わせるだけで、基本的なCAPTCHA認証の仕組みを実装できます。実際のWebアプリケーションでは、さらに画像への描画やノイズの追加などを行うことで、ボットによる自動読み取りを防ぐ強化が施されます。
-
C++で文字列の長さを求める方法:基本テクニックとstrlen()関数の使い方
C++における文字列とは、ヌル文字(\0)で終端される1次元の文字配列のことです。文字列の長さとは、このヌル文字より前に存在する文字数を指します。例えば、次のような文字列を考えてみましょう。char str[] = The sky is blue; 上記の文字列に含まれる文字数 = 15それでは、文字列の長さを求めるプログラムを見ていきましょう。例1:whileループを使って文字数をカウントする方法#include<iostream> using namespace std; int main() { char str[] = Apple; &n
-
C++で掛け算の九九(乗算表)を生成するプログラム
掛け算表(乗算表)は、任意の数に対する掛け算の結果を一覧にまとめたもので、十進法における初等算術の基礎を学ぶために広く使われています。掛け算表は通常、1から10までの積を各行に表示します。例として、4の掛け算表は以下のようになります。4 * 1 = 4 4 * 2 = 8 4 * 3 = 12 4 * 4 = 16 4 * 5 = 20 4 * 6 = 24 4 * 7 = 28 4 * 8 = 32 4 * 9 = 36 4 * 10 = 40指定した数の掛け算表を生成するC++プログラムの例は以下の通りです。プログラム例#include <iostream> using nam