aminarjmand/pure-captcha
Composer 安装命令:
composer require aminarjmand/pure-captcha
包简介
A secure, customizable and lightweight PHP CAPTCHA package with multiple difficulty levels
README 文档
README
🔒 Pure Captcha
A secure, customizable and lightweight PHP CAPTCHA package
یک پکیج کپچای امن، قابل تنظیم و سبک برای PHP
🇬🇧 English
📖 About
Pure Captcha is a lightweight, dependency-free PHP CAPTCHA package that generates secure CAPTCHA images using only PHP's built-in GD extension. No external services, no JavaScript dependencies, no API keys required.
✨ Features
- 🎨 Beautiful UI — Modern, responsive design with gradient backgrounds and shadow effects
- 🔧 Fully Customizable — Configure length, size, fonts, colors, noise, and more
- 🛡️ 5 Difficulty Levels — From
lowtonightmare - 👻 Ghost Characters — Fake background characters to confuse bots
- 🌊 Wave Distortion — Sinusoidal warping to defeat OCR
- 🔤 Multiple Character Sets — Letters, numbers, special characters, or mixed
- 🌐 Multi-language — Built-in support for Persian (fa) and English (en)
- 🔄 Refresh Button — AJAX-powered image refresh with spin animation
- 📦 Zero Dependencies — Only requires PHP GD extension
- 🎯 PSR-4 Autoloading — Composer-ready with proper namespacing
- ⏱️ Expiry Control — Auto-expire CAPTCHA codes after configurable time
- 🔑 Case Sensitivity — Optional case-sensitive validation
📋 Requirements
- PHP >= 7.4
- GD Extension (
ext-gd) - Session Extension (
ext-session)
📥 Installation
composer require aminarjmand/pure-captcha
🚀 Quick Start
Step 1: Create the image endpoint
Create a file called captcha_image.php:
<?php require 'vendor/autoload.php'; use AminArjmand\PureCaptcha\Captcha; Captcha::renderImage();
Step 2: Add CAPTCHA to your form
<?php require 'vendor/autoload.php'; use AminArjmand\PureCaptcha\Captcha; ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>My Form</title> <?= Captcha::styles() ?> </head> <body> <form method="POST" action="submit.php"> <!-- Your other form fields --> <input type="text" name="name" placeholder="Your name"> <!-- CAPTCHA --> <?= Captcha::html() ?> <button type="submit">Submit</button> </form> </body> </html>
Step 3: Validate the CAPTCHA
Create submit.php:
<?php require 'vendor/autoload.php'; use AminArjmand\PureCaptcha\Captcha; if ($_SERVER['REQUEST_METHOD'] === 'POST') { $captchaInput = $_POST['captcha'] ?? ''; if (Captcha::validate($captchaInput)) { echo '✅ CAPTCHA is valid!'; // Process your form... } else { echo '❌ Invalid CAPTCHA. Please try again.'; } }
⚙️ Configuration
Method 1: Configuration File
Create captcha_config.php in your project root:
<?php return [ 'lang' => 'en', 'font' => 'Vazirmatn.ttf', 'expiry' => 300, 'length' => 5, 'width' => 170, 'height' => 55, 'font_size' => 22, 'char_type' => 'mixed', 'case_sensitive' => false, 'noise_level' => 'medium', ];
Method 2: Runtime Configuration
Captcha::configure([ 'noise_level' => 'extreme', 'length' => 6, 'lang' => 'en', 'char_type' => 'letters', ]);
⚠️ Note: When using
configure(), you must call it in both your form file andcaptcha_image.php, because each HTTP request is independent.
Configuration Options
| Option | Type | Default | Description |
|---|---|---|---|
lang |
string | 'fa' |
Language: 'fa' or 'en' |
font |
string | '' |
Font filename (place in fonts/ directory) or full path |
expiry |
int | 300 |
CAPTCHA expiry time in seconds |
length |
int | 5 |
Number of characters |
width |
int | 170 |
Image width in pixels |
height |
int | 55 |
Image height in pixels |
font_size |
int | 22 |
Font size in points |
char_type |
string | 'mixed' |
Character set: 'mixed', 'letters', 'numbers', 'characters' |
case_sensitive |
bool | false |
Enable case-sensitive validation |
noise_level |
string | 'medium' |
Difficulty level (see below) |
Character Sets
| Type | Characters |
|---|---|
mixed |
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789~!@#$%^&*()-+ |
lettersB |
ABCDEFGHJKLMNPRSTUVWXYZ |
lettersS |
abcdefghijklmnopqrstuvwxyz |
numbers |
0123456789 |
characters |
~!@#$%^&*()-+ |
🎯 Difficulty Levels
| Level | Dots | Arcs | Lines | Rotation | Grid | Ghosts | Wave | Difficulty |
|---|---|---|---|---|---|---|---|---|
low |
1000 | 10 | 1 | ±15° | ❌ | ✅ (2) | ❌ | ⭐ |
medium |
2000 | 20 | 2 | ±20° | ❌ | ✅ (4) | ❌ | ⭐⭐ |
high |
3000 | 30 | 4 | ±25° | ✅ | ✅ (6) | ❌ | ⭐⭐⭐ |
extreme |
4000 | 40 | 6 | ±35° | ✅ | ✅ (8) | ❌ | ⭐⭐⭐⭐ |
nightmare |
5000 | 50 | 8 | ±40° | ✅ | ✅ (10) | ✅ | ⭐⭐⭐⭐⭐ |
What each feature does:
- Dots — Random colored pixels scattered across the image
- Arcs — Curved lines in the background
- Lines — Straight lines drawn over the text
- Rotation — Random angle applied to each character
- Grid — A mesh grid overlay on the background
- Ghosts — Faint fake characters in the background to confuse OCR
- Wave — Sinusoidal pixel displacement that warps the entire image
📚 API Reference
Captcha::configure(array $options): void
Set configuration options at runtime.
Captcha::configure(['length' => 6, 'noise_level' => 'high']);
Captcha::get(string $key, mixed $default = null): mixed
Read a configuration value.
$lang = Captcha::get('lang'); // 'fa'
Captcha::generate(): string
Generate a new CAPTCHA code and store it in the session. Returns the generated code.
$code = Captcha::generate();
Captcha::validate(string $input): bool
Validate user input against the stored CAPTCHA code. Returns true if valid. The stored code is destroyed after validation (one-time use).
if (Captcha::validate($_POST['captcha'])) { // Valid! }
Captcha::renderImage(): void
Generate and output a CAPTCHA PNG image. Sends headers and exits.
Captcha::renderImage();
Captcha::html(string $imageUrl, string $inputName, ?string $lang): string
Generate the HTML markup for the CAPTCHA widget.
echo Captcha::html('captcha_image.php', 'captcha', 'en');
| Parameter | Default | Description |
|---|---|---|
$imageUrl |
'captcha_image.php' |
URL of the image endpoint |
$inputName |
'captcha' |
Name attribute of the input field |
$lang |
null (uses config) |
Override language |
Captcha::styles(): string
Generate the CSS styles for the CAPTCHA widget.
echo Captcha::styles();
🎨 Custom Fonts
- Place your
.ttffont file in thefonts/directory inside the package, or provide a full path. - Set the font in config:
// Filename only (looks in package's fonts/ directory) 'font' => 'MyCustomFont.ttf' // Or full path 'font' => '/path/to/fonts/MyCustomFont.ttf'
If no font is configured or found, the package falls back to system fonts, and then to PHP's built-in bitmap font as a last resort.
🔧 Usage Examples
Simple number-only CAPTCHA
Captcha::configure([ 'char_type' => 'numbers', 'length' => 4, 'noise_level' => 'low', ]);
High-security CAPTCHA
Captcha::configure([ 'char_type' => 'mixed', 'length' => 7, 'noise_level' => 'extreme', 'case_sensitive' => true, 'expiry' => 120, ]);
English CAPTCHA
Captcha::configure(['lang' => 'en']); // Or override in html() only echo Captcha::html('captcha_image.php', 'captcha', 'en');
🇮🇷 فارسی
📖 درباره پروژه
Pure Captcha
یک پکیج سبک و بدون وابستگی برای تولید تصاویر کپچای امن در PHP است. فقط از اکستنشن GD خود PHP استفاده میکند. نیازی به سرویس خارجی، جاوااسکریپت اضافه یا کلید API ندارد.
✨ امکانات
- 🎨 رابط کاربری زیبا — طراحی مدرن با پسزمینه گرادیانت و افکت سایه
- 🔧 کاملاً قابل تنظیم — تعداد کاراکتر، اندازه، فونت، رنگ، نویز و ...
- 🛡️ ۵ سطح سختی — از
lowتاnightmare - 👻 حروف شبح — کاراکترهای جعلی در پسزمینه برای گیج کردن رباتها
- 🌊 اعوجاج موجی — تاب دادن تصویر برای شکست OCR
- 🔤 چند مجموعه کاراکتر — حروف، اعداد، کاراکترهای خاص یا ترکیبی
- 🌐 چندزبانه — پشتیبانی داخلی از فارسی و انگلیسی
- 🔄 دکمه رفرش — بارگذاری مجدد تصویر با انیمیشن چرخشی
- 📦 بدون وابستگی — فقط نیاز به اکستنشن GD
- 🎯 PSR-4 — آماده استفاده با Composer
- ⏱️ انقضای خودکار — کد کپچا بعد از زمان مشخصی منقضی میشود
- 🔑 حساسیت به حروف — امکان فعالسازی تشخیص بزرگ/کوچک بودن حروف
📋 پیشنیازها
- PHP نسخه ۷.۴ به بالا
- اکستنشن GD
- اکستنشن Session
📥 نصب
composer require aminarjmand/pure-captcha
🚀 شروع سریع
مرحله ۱: ساخت فایل تصویر کپچا
فایلی به نام captcha_image.php بسازید:
<?php require 'vendor/autoload.php'; use AminArjmand\PureCaptcha\Captcha; Captcha::renderImage();
مرحله ۲: اضافه کردن کپچا به فرم
<?php require 'vendor/autoload.php'; use AminArjmand\PureCaptcha\Captcha; ?> <!DOCTYPE html> <html lang="fa" dir="rtl"> <head> <meta charset="UTF-8"> <title>فرم من</title> <?= Captcha::styles() ?> </head> <body> <form method="POST" action="submit.php"> <!-- فیلدهای دیگر فرم --> <input type="text" name="name" placeholder="نام شما"> <!-- کپچا --> <?= Captcha::html() ?> <button type="submit">ارسال</button> </form> </body> </html>
مرحله ۳: اعتبارسنجی کپچا
فایل submit.php بسازید:
<?php require 'vendor/autoload.php'; use AminArjmand\PureCaptcha\Captcha; if ($_SERVER['REQUEST_METHOD'] === 'POST') { $captchaInput = $_POST['captcha'] ?? ''; if (Captcha::validate($captchaInput)) { echo '✅ کد امنیتی صحیح است!'; // پردازش فرم... } else { echo '❌ کد امنیتی اشتباه است. لطفاً دوباره تلاش کنید.'; } }
⚙️ پیکربندی
روش ۱: فایل کانفیگ
فایل captcha_config.php را در روت پروژه بسازید:
<?php return [ 'lang' => 'fa', 'font' => 'Vazirmatn.ttf', 'expiry' => 300, 'length' => 5, 'width' => 170, 'height' => 55, 'font_size' => 22, 'char_type' => 'mixed', 'case_sensitive' => false, 'noise_level' => 'medium', ];
روش ۲: پیکربندی در زمان اجرا
Captcha::configure([ 'noise_level' => 'extreme', 'length' => 6, 'lang' => 'fa', 'char_type' => 'letters', ]);
⚠️ توجه: اگر از
configure()استفاده میکنید، باید آن را هم در فایل فرم و هم درcaptcha_image.phpفراخوانی کنید، زیرا هر درخواست HTTP مستقل است.
جدول تنظیمات
| تنظیم | نوع | پیشفرض | توضیح |
|---|---|---|---|
lang |
string | 'fa' |
زبان: 'fa' یا 'en' |
font |
string | '' |
نام فایل فونت (در پوشه fonts/) یا مسیر کامل |
expiry |
int | 300 |
زمان انقضای کپچا (ثانیه) |
length |
int | 5 |
تعداد کاراکترها |
width |
int | 170 |
عرض تصویر (پیکسل) |
height |
int | 55 |
ارتفاع تصویر (پیکسل) |
font_size |
int | 22 |
اندازه فونت |
char_type |
string | 'mixed' |
مجموعه کاراکتر |
case_sensitive |
bool | false |
حساسیت به بزرگ/کوچکی حروف |
noise_level |
string | 'medium' |
سطح سختی |
مجموعه کاراکترها
| نوع | کاراکترها |
|---|---|
mixed |
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789~!@#$%^&*()-+ |
lettersB |
ABCDEFGHJKLMNPRSTUVWXYZ |
lettersS |
abcdefghijklmnopqrstuvwxyz |
numbers |
0123456789 |
characters |
~!@#$%^&*()-+ |
🎯 سطوح سختی
| سطح | نقاط | کمان | خطوط | چرخش | شبکه | شبح | موج | سختی |
|---|---|---|---|---|---|---|---|---|
low |
۱۰۰۰ | ۱۰ | ۱ | ±۱۵° | ❌ | ✅ (۲) | ❌ | ⭐ |
medium |
۲۰۰۰ | ۲۰ | ۲ | ±۲۰° | ❌ | ✅ (۴) | ❌ | ⭐⭐ |
high |
۳۰۰۰ | ۳۰ | ۴ | ±۲۵° | ✅ | ❌ | ✅ (۶) | ⭐⭐⭐ |
extreme |
۴۰۰۰ | ۴۰ | ۶ | ±۳۵° | ✅ | ✅ (۸) | ❌ | ⭐⭐⭐⭐ |
nightmare |
۵۰۰۰ | ۵۰ | ۸ | ±۴۰° | ✅ | ✅ (۱۰) | ✅ | ⭐⭐⭐⭐⭐ |
هر ویژگی چه کاری انجام میدهد:
- نقاط (Dots) — پیکسلهای رنگی تصادفی در سطح تصویر
- کمانها (Arcs) — خطوط منحنی در پسزمینه
- خطوط (Lines) — خطوط مستقیم روی متن
- چرخش (Rotation) — زاویه تصادفی برای هر کاراکتر
- شبکه (Grid) — شبکه توری روی پسزمینه
- شبح (Ghosts) — کاراکترهای کمرنگ جعلی در پسزمینه برای گیج کردن OCR
- موج (Wave) — جابجایی سینوسی پیکسلها که کل تصویر را تاب میدهد
📚 مرجع API
Captcha::configure(array $options): void
تنظیمات را در زمان اجرا تغییر میدهد.
Captcha::configure(['length' => 6, 'noise_level' => 'high']);
Captcha::get(string $key, mixed $default = null): mixed
مقدار یک تنظیم را برمیگرداند.
$lang = Captcha::get('lang'); // 'fa'
Captcha::generate(): string
یک کد کپچای جدید تولید و در سشن ذخیره میکند. کد تولیدشده را برمیگرداند.
$code = Captcha::generate();
Captcha::validate(string $input): bool
ورودی کاربر را با کد ذخیرهشده مقایسه میکند. در صورت صحت true برمیگرداند. کد ذخیرهشده بعد از اعتبارسنجی حذف میشود (یکبار مصرف).
if (Captcha::validate($_POST['captcha'])) { // معتبر است! }
Captcha::renderImage(): void
تصویر PNG کپچا را تولید و به خروجی ارسال میکند.
Captcha::renderImage();
Captcha::html(string $imageUrl, string $inputName, ?string $lang): string
کد HTML ویجت کپچا را تولید میکند.
echo Captcha::html('captcha_image.php', 'captcha', 'fa');
| پارامتر | پیشفرض | توضیح |
|---|---|---|
$imageUrl |
'captcha_image.php' |
آدرس فایل تصویر |
$inputName |
'captcha' |
نام فیلد ورودی |
$lang |
null (از کانفیگ) |
زبان |
Captcha::styles(): string
استایلهای CSS ویجت کپچا را تولید میکند.
echo Captcha::styles();
🎨 فونت سفارشی
- فایل فونت
.ttfخود را در پوشهfonts/داخل پکیج قرار دهید یا مسیر کامل را وارد کنید. - فونت را در کانفیگ تنظیم کنید:
// فقط نام فایل (در پوشه fonts/ پکیج جستجو میشود) 'font' => 'MyCustomFont.ttf' // یا مسیر کامل 'font' => '/path/to/fonts/MyCustomFont.ttf'
اگر فونتی تنظیم نشده باشد، پکیج ابتدا فونتهای سیستمی و سپس فونت داخلی PHP را استفاده میکند.
🔧 مثالهای کاربردی
کپچای فقط عددی
Captcha::configure([ 'char_type' => 'numbers', 'length' => 4, 'noise_level' => 'low', ]);
کپچای امنیت بالا
Captcha::configure([ 'char_type' => 'mixed', 'length' => 7, 'noise_level' => 'extreme', 'case_sensitive' => true, 'expiry' => 120, ]);
کپچای انگلیسی
Captcha::configure(['lang' => 'en']); // یا فقط در html() تغییر زبان echo Captcha::html('captcha_image.php', 'captcha', 'en');
📁 Project Structure / ساختار پروژه
pure-captcha/
├── src/
│ └── Captcha.php # Main class / کلاس اصلی
├── config/
│ └── captcha.php # Default config / کانفیگ پیشفرض
├── fonts/
│ └── .gitkeep # Place your .ttf fonts here / فونتها اینجا
├── composer.json
├── README.md
└── LICENSE
🤝 Contributing / مشارکت
Contributions, issues and feature requests are welcome!
از مشارکت، گزارش مشکلات و پیشنهاد ویژگیهای جدید استقبال میشود!
📄 License / مجوز
This project is licensed under the MIT License.
این پروژه تحت مجوز MIT منتشر شده است.
👤 Author / توسعهدهنده
Amin Arjmand
- 🌐 Website: aminarjmand.com
- 📧 Email: info@aminarjmand.com
- 🐙 GitHub: @sibche2013
Made with ❤️ by Amin Arjmand
aminarjmand/pure-captcha 适用场景与选型建议
aminarjmand/pure-captcha 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 9 次下载、GitHub Stars 达 0, 最近一次更新时间为 2026 年 02 月 16 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「php」 「image」 「security」 「spam」 「captcha」 「bot-protection」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 aminarjmand/pure-captcha 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 aminarjmand/pure-captcha 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 aminarjmand/pure-captcha 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Yii2 LightBox image galary widget uses Lightbox v2.10.0 by Lokesh Dhakar
The Yii2 extension uses jQuery jquery.carousel-1.1.min.js and makes image carousel from php array of structure defined.
Provide a way to secure accesses to all routes of an symfony application.
It's a barebone security class written on PHP
The Yii2 extension uses jQuery PrettyPhoto and OwlCarousel js and makes image galary from php array of structure defined.
Contao CMS integrity check for some files
统计信息
- 总下载量: 9
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 19
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2026-02-16