برگه تقلب امنیت

 

لیست کامل مقادیر Falsy در PHP

مقدار مثال توضیح
false if ($var === false) خود مقدار بولین false
۰ (عدد صحیح صفر) if ($var === 0) عدد صفر (از نوع int)
۰.۰ (عدد اعشاری صفر) if ($var === 0.0) عدد اعشاری صفر (از نوع float)
"۰" (رشته حاوی صفر) if ($var === "0") رشته یک کاراکتری “۰” ⚠️ مهم
"" (رشته خالی) if ($var === "") رشته بدون هیچ کاراکتری
null if ($var === null) مقدار null
[] (آرایه خالی) if ($var === []) آرایه بدون هیچ عنصری
new stdClass() (شیء خالی – توجه ویژه) if ($var == new stdClass()) ❌ شرط FALSE نمی‌شود! فقط شیء بدون ویژگی false نیست
SimpleXMLElement خالی اشیاء XML خاص می‌توانند false باشند

 

لیست کامل توابع امنیتی

دسته تابع / API کاربرد کوتاه نکته مهم
Validation isset() بررسی تعریف بودن و null نبودن برای چک وجود مقدار خوب است
Validation empty() بررسی خالی بودن '۰' را هم خالی حساب می‌کند
Validation array_key_exists() بررسی وجود کلید در آرایه حتی اگر مقدار null باشد true است
Validation is_string() بررسی رشته بودن برای ورودی متنی
Validation is_int() / is_integer() بررسی عدد صحیح alias هستند
Validation is_float() بررسی اعشاری برای مقادیر decimal
Validation is_numeric() بررسی عددی بودن "۱۲" و "۱۲.۳" را true می‌کند
Validation is_bool() بررسی بولین بودن true/false واقعی
Validation is_array() بررسی آرایه بودن برای ورودی‌های چندمقداری
Validation is_object() بررسی آبجکت بودن در داده‌های structured
Validation is_null() بررسی null بودن برای داده اختیاری
Validation strlen() طول رشته برای ASCII بهتر است
Validation mb_strlen() طول رشته چندبایتی برای فارسی/یونیکد بهتر است
Validation count() تعداد اعضای آرایه برای لیست‌ها
Validation filter_var(..., FILTER_VALIDATE_EMAIL) اعتبارسنجی ایمیل استاندارد PHP
Validation filter_var(..., FILTER_VALIDATE_URL) اعتبارسنجی URL برای لینک
Validation filter_var(..., FILTER_VALIDATE_INT) اعتبارسنجی int برای ID و سن
Validation filter_var(..., FILTER_VALIDATE_BOOL) اعتبارسنجی boolean پس بودن (Boolean)
Validation filter_var(..., FILTER_VALIDATE_FLOAT) اعتبارسنجی float برای قیمت/نمره
Validation filter_var(..., FILTER_VALIDATE_IP) اعتبارسنجی IP IPv4/IPv6
Validation filter_var(..., FILTER_VALIDATE_BOOLEAN) تشخیص مقدار بولی FILTER_NULL_ON_FAILURE "yes""on""true""۱"
Validation filter_var(..., FILTER_VALIDATE_MAC) آدرس MAC "۰۰:1B:44:11:3A:B7"
Validation filter_var(..., FILTER_VALIDATE_REGEXP) الگوی منظم با options["regexp"]
Validation filter_var(..., FILTER_VALIDATE_URL) آدرس اینترنتی FILTER_FLAG_PATH_REQUIREDFILTER_FLAG_QUERY_REQUIRED
Validation filter_var(..., FILTER_VALIDATE_DOMAIN) نام دامنه FILTER_FLAG_HOSTNAME
Validation preg_match() بررسی الگو با regex برای slug, phone, code
Validation DateTime::createFromFormat() اعتبارسنجی تاریخ فرمت دقیق را چک می‌کند
Validation checkdate() اعتبارسنجی تاریخ میلادی day/month/year
Validation ctype_alpha() فقط حروف مناسب متون لاتین
Validation ctype_alnum() حروف و عدد برای username/code
Validation ctype_digit() فقط رقم برای رشته‌های عددی
Validation in_array(..., true) مقدار داخل لیست مجاز true برای مقایسه strict
Validation validate_file() اعتبارسنجی فایل وردپرس
Validation wp_verify_nonce() بررسی nonce امنیت فرم/درخواست
Validation current_user_can() بررسی دسترسی کنترل مجوز
Validation is_email() اعتبارسنجی ایمیل وردپرس
Validation email_exists() بررسی وجود ایمیل ثبت‌نام
Validation username_exists() بررسی وجود username ثبت‌نام
Validation wp_http_validate_url() اعتبارسنجی URL برای HTTP وردپرس
Validation absint() تبدیل به عدد صحیح مثبت وردپرس
Validation sanitize_key() همسان‌سازی key-like برای key/slug کوچک
Validation === برابری دو فیلد استاندارد PHP
Validation filter_input() دریافت و فیلتر کردن مستقیم یک متغیر خارجی (مثل $_POST) در یک مرحله. $email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL); 
Validation filter_input_array() اعمال فیلتر روی یک آرایه کامل از ورودی (مثل کل $_POST). $post_data = filter_input_array(INPUT_POST, $my_filters);
Validation filter_var_array() اعمال فیلتر روی یک آرایه از مقادیر. $filters = ['name' => FILTER_SANITIZE_STRING, 'age' => FILTER_VALIDATE_INT];
Sanitization trim() حذف فاصله ابتدا/انتها قبل از validation بهتر است
Sanitization ltrim() حذف فاصله از چپ خاص
Sanitization rtrim() حذف فاصله از راست خاص
Sanitization strip_tags() حذف HTML tags برای متن ساده
Sanitization filter_var(..., FILTER_SANITIZE_EMAIL) پاکسازی ایمیل قبل از ذخیره
Sanitization filter_var(..., FILTER_SANITIZE_URL) پاکسازی URL قبل از ذخیره
Sanitization filter_var(..., FILTER_SANITIZE_NUMBER_INT) نگه‌داشتن اعداد/علامت برای عددهای رشته‌ای
Sanitization filter_var(..., FILTER_SANITIZE_NUMBER_FLOAT) پاکسازی float برای عدد اعشاری
Sanitization filter_var(..., FILTER_SANITIZE_ENCODED) پاکسازی URL-encoded مانند urlencode()
Sanitization filter_var(..., FILTER_SANITIZE_SPECIAL_CHARS) پاک‌سازی کاراکترهای خاص معادل htmlspecialchars() با ENT_QUOTES
Sanitization filter_var(..., FILTER_SANITIZE_FULL_SPECIAL_CHARS) پاک‌سازی کامل کاراکترهای خاص معادل htmlspecialchars() با ENT_QUOTES و ENT_HTML5
Sanitization fstripslashes() حذف اسلش‌ها stripslashes("Hello \'World\'") // (در صورت فعال بودن magic_quotes قدیمی) 
Sanitization preg_replace() حذف/جایگزینی الگو برای نرمال‌سازی
Sanitization intval() تبدیل به int برای داده عددی
Sanitization floatval() تبدیل به float برای عدد اعشاری
Sanitization htmlspecialchars() آماده‌سازی برای HTML ضد XSS در خروجی
Sanitization htmlentities() تبدیل کاراکترها به entity گسترده‌تر از htmlspecialchars
Sanitization wp_unslash() حذف slashهای اضافه وردپرس روی $_POST مهم است
Sanitization sanitize_text_field() پاکسازی متن ساده وردپرس
Sanitization sanitize_textarea_field() پاکسازی متن چندخطی وردپرس
Sanitization sanitize_email() پاکسازی ایمیل وردپرس
Sanitization sanitize_url() پاکسازی URL وردپرس
Sanitization esc_url_raw() پاکسازی URL برای ذخیره وردپرس
Sanitization sanitize_key() پاکسازی key وردپرس
Sanitization sanitize_title() ساخت slug وردپرس
Sanitization sanitize_file_name() پاکسازی نام فایل وردپرس
Sanitization sanitize_meta() پاکسازی متا وردپرس
Sanitization sanitize_user() پاکسازی username وردپرس
Sanitization wp_kses() اجازه HTML محدود وردپرس
Sanitization wp_kses_post() HTML مجاز پست محتوای کاربر
Sanitization map_deep() پاکسازی آرایه‌های تو در تو همراه sanitize_*
Sanitization wp_check_invalid_utf8() بررسی UTF-8 نامعتبر وردپرس
Sanitization sanitize_filename() نام فایل (امن) تابع کمکی در CodeIgniter یا مشابه آن 
Escaping htmlspecialchars() خروجی امن HTML مهم‌ترین ابزار HTML
Escaping htmlentities() خروجی امن‌تر/گسترده‌تر بسته به نیاز
Escaping esc_html() خروجی داخل HTML وردپرس
Escaping esc_attr() خروجی داخل attribute وردپرس
Escaping esc_url() خروجی URL در HTML وردپرس
Escaping esc_url_raw() ذخیره امن URL وردپرس
Escaping esc_js() خروجی امن برای JS وردپرس
Escaping esc_textarea() خروجی امن textarea وردپرس
Escaping wp_kses_post() خروجی HTML محدود مجاز وردپرس
Escaping wp_nonce_field() تولید فیلد nonce خروجی فرم
Escaping wp_nonce_url() nonce در URL وردپرس
Escaping escapeshellarg() خروجی به Shell جلوگیری از اجرای دستورات مخرب در شل 
SQL امنیت PDO::prepare() query امن بهترین روش SQL
SQL امنیت mysqli::prepare() query امن بهترین روش SQL
SQL امنیت bind parameters تزریق امن پارامتر جایگزین escape دستی
HTTP/Input $_GET ورودی query string برای جستجو/فیلتر
HTTP/Input $_POST ورودی فرم برای create/update
HTTP/Input $_REQUEST ترکیب GET/POST/COOKIE معمولاً توصیه نمی‌شود
HTTP/Input $_FILES داده آپلود فایل همراه validate_file
HTTP/Output json_encode() خروجی امن JSON بهتر از concat دستی
URL urlencode() encode برای query مخصوص query string
URL rawurlencode() encode سخت‌گیرانه‌تر URL برای path segment
WordPress utils esc_html_e() echo متن ترجمه‌شده و escaped وردپرس
WordPress utils esc_attr_e() echo attribute-safe translation وردپرس
WordPress utils wp_die() پایان امن با پیام برای خطا/عدم اعتبار
WordPress utils selected() خروجی selected در select برای فرم‌ها
WordPress utils checked() خروجی checked در checkbox برای فرم‌ها
WordPress utils disabled() خروجی disabled در form برای فرم‌ها

 

جدول مقایسه روش‌های بررسی

روش وجود متغیر خالی نبودن مقدار null خطا روی متغیر تعریف‌نشده کاربرد اصلی
isset($var) بررسی وجود متغیر یا کلید آرایه
empty($var) بررسی خالی نبودن (شامل null)
!empty($var) بررسی پر بودن متغیر
array_key_exists('key', $arr) ⚠️ (اگر آرایه تعریف نشده باشد) بررسی وجود کلید در آرایه (حتی با مقدار null)
count($arr) > 0 ⚠️ (روی null خطا می‌دهد) ⚠️ بررسی تعداد عناصر آرایه
$var !== null ⚠️ بررسی نبودن null
$var ?? $default مقدار پیش‌فرض

 

استاندارد اعتبارسنجی فرم در PHP

برای اعتبارسنجی فرم‌ها، هیچ راه “یکتای استاندارد” وجود ندارد و بستگی به سناریو دارد. اما یک الگوی استاندارد و حرفه‌ای وجود دارد که اکثر توسعه‌دهندگان PHP از آن پیروی می‌کنند.

برای فیلدهای اجباری: از !empty() استفاده کن
برای فیلدهای اختیاری (مثل چکباکس): از isset() استفاده کن
برای مقادیری که ممکن است ۰ معتبر باشد: از isset() + بررسی جداگانه استفاده کن

سناریو روش مناسب مثال
فیلد اجباری (نام، ایمیل، رمز) !empty() یا بررسی اختصاصی if (empty(trim($name))) { error }
فیلد اختیاری (توضیحات، وبسایت) فقط در صورت نیاز بررسی کن if (!empty($bio)) { validate($bio) }
چکباکس (قوانین را قبول دارم) isset() (چون ممکن false ارسال شود) $agreed = isset($_POST['agree']) ? true : false
عدد صفر معتبر (سن ۰، نمره ۰) isset() + بررسی جداگانه if ($age === null) { error } else { // 0 معتبر }
آرایه (علاقه‌مندی‌ها، تاگ‌ها) isset() + is_array() $hobbies = isset($_POST['hobbies']) && is_array($_POST['hobbies']) ? $_POST['hobbies'] : []
رادیو باتن (جنسیت) isset() + in_array() if (isset($_POST['gender']) && in_array($_POST['gender'], ['male', 'female']))
سلکت باکس (شهر) isset() + بررسی خالی نبودن if (!empty($_POST['city']) && in_array($_POST['city'], $cities))
فیلد عددی (قیمت، تعداد) isset() + is_numeric() if (isset($_POST['qty']) && is_numeric($_POST['qty']) && $_POST['qty'] > 0)

 

خلاصه قوانین طلایی

# قانون توضیح
۱ فیلدهای اجباری از !empty() یا trim() === '' استفاده کن
۲ فیلدهای اختیاری فقط در صورت !empty بودن اعتبارسنجی کن
۳ عدد صفر معتبر از isset() و === استفاده کن، چون ۰ falsy است
۴ چکباکس از isset() استفاده کن (چون false ارسال نمی‌شود)
۵ آرایه‌ها از isset() + is_array() استفاده کن
۶ خطاها را جمع کن تا پایان اعتبارسنجی خطاها را در آرایه جمع کن
۷ مقادیر قبلی را نگه دار با htmlspecialchars($_POST['field'] ?? '')
۸ پاک‌سازی نهایی بعد از اعتبارسنجی، داده‌ها را پاک‌سازی کن
۹ از Prepared Statements برای دیتابیس حتماً استفاده کن
۱۰ هرگز به ورودی اعتماد نکن همیشه اعتبارسنجی و پاک‌سازی کن

 

جمع‌بندی: کی از ?? استفاده کنیم؟

سناریو روش مناسب دلیل
دریافت از $_GET، $_POST $_POST['name'] ?? '' ✅ عالی – جایگزین isset
دریافت از $_SESSION $_SESSION['user'] ?? null ✅ عالی
دریافت از تنظیمات $config['key'] ?? 'default' ✅ عالی
عدد صفر معتبر (سن، نمره) $age ?? null ✅ عالی – چون ۰ را نگه می‌دارد
چکباکس‌ها isset($_POST['agree']) ❌ از ?? استفاده نکنید
بررسی خالی نبودن !empty($var) ❌ از ?? استفاده نکنید
مقدار پیش‌فرض برای false/0 $var ?: 'default' (Elvis) ❌ از ?? استفاده نکنید

قانون طلایی: از ?? فقط زمانی استفاده کن که می‌خواهی null را با مقدار پیش‌فرض جایگزین کنی، نه مقادیر falsy دیگر مثل ۰، false، "" یا [].

 

تابع empty() در PHP

empty() بررسی می‌کند که آیا یک متغیر وجود ندارد یا مقدار آن برابر با مقادیر زیر است:

  • "" (رشته خالی)

  • ۰ (عدد صفر)

  • "۰" (رشته حاوی صفر)

  • null

  • false

  • array() (آرایه خالی)