برگه تقلب امنیت
لیست کامل مقادیر 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_REQUIRED, FILTER_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()(آرایه خالی)