CAPTCHAイメージ認証(securimage) の照合ソースコードを解読してみる

securimage.php を解析してみる。

L:618行目付近 ”function check($code)”

function check($code)
{   
    // 考えながら検証する
    // $code: POSTしたデータ
    // echo $code;   // ←POSTしたデータ
    
    $this->code_entered = $code;
    $this->validate();
    return $this->correct_code;
}

L:1170付近 ”function validate()”

function validate()
{
    // retrieve code from session, if no code exists check sqlite database if supported.
    $code = '';

    if (isset($_SESSION['securimage_code_value']) && trim($_SESSION['securimage_code_value']) != '') {
        if ($this->isCodeExpired($_SESSION['securimage_code_ctime']) == false) { 
            $code = $_SESSION['securimage_code_value'];
        }
    } else if ($this->use_sqlite_db == true && function_exists('sqlite_open')) { // no code in session - may mean user has cookies turned off
        $this->openDatabase();
        $code = $this->getCodeFromDatabase();
    } else { /* session code invalid or non-existant and code not found in sqlite db or sqlite is not available */ }
    
    $code               = trim(strtolower($code));
    $code_entered       = trim(strtolower($this->code_entered));
    $this->correct_code = false;
    
    // echo '----------------'.$code_entered .'------------------';
    //$code_entered: 入力したデータを小文字にしたもの
    // echo $_SESSION['securimage_code_value'];
    // echo '===================';
    // echo $_SESSION['securimage_code_ctime'];
    
    
    if ($code != '') {
                if ($code == $code_entered) {
            $this->correct_code = true;
            $_SESSION['securimage_code_value'] = '';  // ← 照合する元データ
            $_SESSION['securimage_code_ctime'] = '';  // ← 照合する元データの生成時刻
            $this->clearCodeFromDatabase();
            }
    }
}

フォームメール送信ソースコード(SMTP)のサンプル

<?PHP

//////////////////
// PUT_SMTP.PHP //
//////////////////

	// ここに投げる必須項目
	// $server
	// $to
	// $from
	// $subject
	// $body
$server='';
$put_smtp_flg="1";
$smtp='mail.hogehoge.com';
$subject="TESTmail";
$body="TESTmail";
$from = "hsmt@hogehoge.com";
//$to='has@zibaj.net';
$to='hsmt@zibaj.net';
//echo 'put_smtp_flg=>'.$put_smtp_flg.'<br>';
echo "smtp_server=>".$smtp."<br>";
echo "to=>".$to."<br>";
	
if($put_smtp_flg == "1"){
	
	$server=$smtp;
	
	// エンコード
	$subject = mb_convert_encoding($subject,"JIS");
	$body = mb_convert_encoding($body,"ISO-2022-JP");

	$date = date('D, d M Y H:i:s: O');// 日付(この形式でないとメーラーに送信日時として解釈されない)

	$sock = fsockopen($server,25);		// メールサーバの25番ソケットを開いて
	fputs($sock,"HELO $server\r\n");	// SMTPコマンド発行
		$result = fgets($sock,128);		// サーバからのレスポンスを取得
		echo 'SMTPコマンド発行=>'.$result.'<br>';
	fputs($sock,"MAIL FROM:<$from>\r\n");// FROMアドレス指定
		$result = fgets($sock,128);
		echo 'FROMアドレス指定=>'.$result.'<br>';
	fputs($sock,"RCPT TO:<$to>\r\n");	// 宛先指定
		$result = fgets($sock,128);
		echo '宛先指定=>'.$result.'<br>';
	fputs($sock,"DATA\r\n");			// DATAを送信後、ピリオドオンリーの行を送るまで本文。
		$result = fgets($sock,128);
		echo 'DATAを送信1=>'.$result.'<br>';

	// Header 表示項目
	fputs($sock,"FROM:<$from>\r\n");	// 送信元表示
	fputs($sock,"TO:<$to>\r\n");		// 送信先表示
	fputs($sock,"Date:<$date>\r\n");	// 日付表示

	fputs($sock,"Subject:$subject\r\n");// Subjectヘッダ送信
	fputs($sock,"\r\n$body\r\n");		// 本文送信** 改行の後が本文と見なされる
		$result = fgets($sock,128);
		echo 'DATAを送信2=>'.$result.'<br>';
	fputs($sock,"\r\n.\r\n");			// ピリオドのみの行を送信。
		$result = fgets($sock);
		echo 'DATAを送信END=>'.$result.'<br>';

	// echo $result."<br>\n";// 試験用表示
	
	if(!ereg("^250",$result)){			// 成功すると250 OK~と返してくるので
		echo "送信失敗<br>\n;";			// それが返ってこなかったら失敗。
	}
	
	echo '結果=>'.$result.'<br>';

	fclose($sock); //ソケット閉じる
}

?>

データベース汎用化モジュール

データベースを汎用化的概念で操作することに成功しました。

メリットは、ブログなどの小規模開発から、業務管理システムやECサイトなどの中規模開発程度まであってもあれば、データベース設計が不要になります。

また、開発の大半を占めるデータベースの

  • 読み込み
  • 登録
  • 更新
  • ソート抽出

の開発が半自動化されます。

デメリットは回避できる設計を施してありますので、フレームワークなどのように動作が 重くなることはございません。