یکی از مهمترین قسمتهای برنامه نویسی وب ، کنترل داده های ورودی توسط کاربر و اعتبارسنجی فرم ها در php است؛
فرم ها، اصلی ترین ابزار برقراری ارتباط با کاربران سایت میباشند و اطمینان از اینکه کاربر فرم را در قالب صحیح پر کرده باشد از مشکلات آتی جلوگیری میکند.
علاوه بر این در مواقعی، فردی که فرم را پر میکند، لزوما کاربر اصلی سایت نیست و هدفی به غیر از هدف اصلی فرم دارد.
باید توجه داشت که اگر داده های ورودی از فرم ها به خوبی بررسی و پاکسازی نشوند، میتوانند به عنوان مهمترین وسیله هک و نفوذ به سیستم تلقی شوند.
برای جلوگیری از این مسائل باید داده های ورودی از فرم ها را قبل از پردازش و ارسال به دیتابیس، بررسی و پاکسازی کنیم.
استفاده از عبارات منظم (Regular Expressions) و توابع خود php میتواند برای این موضوع مناسب باشد، که در زیر به انواع داده های فرم و نحوه اعتبارسنجی فرم ها در php اشاره شده است:
برای کپی صحیح و کامل کدها ، دابل کلیک کرده تا وارد محیط سفید و کپی شوید در غیر اینصورت امکان دارد اجرای کدها با مشکل روبرو شود
۱- اعتبارسنجی و پاکسازی و بررسی وجود ایمیل با PHP
اعتبارسنجی فرم ایمیل:
اعتبار سنجی فرم ایمیل را میوانید به ۲ روشی که در زیراشاره میشود انجام دهید. اولین روش به این صورت است:
1 2 3 |
function isValidEmail($email){ return preg_match('/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/i', $email); } |
و اگر از PHP 5.2 به بالا استفاده میکنید که معمولا همه از ۵٫۶ به بالا بهره می برند ، میتوانید از این روش فرم ایمیل رو اعتبار سنجی کنید:
1 2 3 4 |
function fnValidateEmail($email) { return filter_var($email, FILTER_VALIDATE_EMAIL); } |
پاکسازی ایمیل:
ما حتی میتوانیم برای اطمینان بیشتر ایمیل گرفته شده را پاکسازی کنیم:
1 2 3 |
function fnSanitizeEmaill($string) { return preg_replace( '((?:\n|\r|\t|%0A|%0D|%08|%09)+)i' , '', $string ); } |
و یا از تابع filter_var استفاده کنید که مطمین تر و سریعتر کار sanitize و پاکسازی ورودی ها را انجام می دهد.
1 2 3 4 |
function fnSanitizeEmaill($url) { return filter_var($url, FILTER_SANITIZE_EMAIL); } |
بررسی وجود ایمیل با php :
این کار امکان پذیر نیست ولی میشود تا حد زیادی با بررسی دامنه ایمیل از وجود آن مطلع شد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
function check_email($email) { $email_error = false; $Email = htmlspecialchars(stripslashes(strip_tags(trim($email)))); //parse unnecessary characters to prevent exploits if ($Email == '') { email_error = true; } elseif (!eregi('^([a-zA-Z0-9._-])+@([a-zA-Z0-9._-])+\.([a-zA-Z0-9._-])([a-zA-Z0-9._-])+', $Email)) { email_error = true; } else { list($Email, $domain) = split('@', $Email, 2); if (! checkdnsrr($domain, 'MX')) { email_error = true; } else { $array = array($Email, $domain); $Email = implode('@', $array); } } if (email_error) { return false; } else{return true;} } |
۲ – اعتبارسنجی و پاکسازی اعداد با PHP
اعتبارسنجی اعداد:
برای بررسی اعداد در یک فرم میتوانیم از توابع داخلی PHP استفاده کنیم:
1 2 3 4 5 6 7 8 |
function fnValidateNumber($value) { #is_ double($value); #is_ float($value); #is_ int($value); #is_ integer($value); return is_numeric($value); } |
و یا استفاده از تابع filter_var : (اعتبارسنجی فرم ها در php با تابع زیر بسیار آسان است !)
1 2 3 4 5 |
function fnValidateNumber($value) { #return filter_var($value, FILTER_VALIDATE_FLOAT); // float return filter_var($value, FILTER_VALIDATE_INT); # int } |
پاکسازی اعداد:
با استفاده از تابع زیر میتوانیم اعداد داخل فرم را پاکسازی کنیم:
1 2 3 4 5 |
function fnSanitizeNumber($str) { #letters and space only return preg_match('/[^0-9]/', '', $str); } |
و در php 5.2 به بالا :
1 2 3 4 5 |
function fnSanitizeNumber($value) { #return filter_var($value, FILTER_SANITIZE_NUMBER_FLOAT); // float return filter_var($value, FILTER_SANITIZE_NUMBER_INT); # int } |
۳ – اعتبارسنجی و پاکسازی رشته ها در PHP
اعتبار سنجی رشته ها:
بیشتر در اعتبار سنجی نام و نام خانوادگی و .. به کار میرود و فقط حروف و فاصله را قبول میکند:
1 2 3 4 5 |
function fnValidateStringr($str) { #letters and space only return preg_match('/^[A-Za-z\s ]+$/', $str); } |
پاکسازی رشته ها:
برای پاک کردن فرم از کاراکترهای غیر رشته ای به کار میرود:
1 2 3 4 5 |
function fnSanitizeStringr($str) { #letters and space only return preg_replace('/[^A-Za-z\s ]/', '', $str); } |
و یا استفاده از توابع قدرتمند و داخلی php :
1 2 3 4 |
function fnSanitizeStringr($str) { return filter_var($str, FILTER_SANITIZE_STRIPPED); # only 'String' is allowed eg. '<br>HELLO</br>' => 'HELLO' } |
۴ – اعتبارسنجی و پاکسازی اعداد و حروف در PHP:
اعتبارسنجی اعداد و حروف:
تابع زیر فرم را بررسی میکند تا فقط حروف و اعداد به کار رفته باشد:
1 2 3 4 |
function fnValidateAlphanumeric($string) { return ctype_alnum ($string); } |
پاکسازی حروف و اعداد:
با تابع زیر میتوان داده گرفته شده از فرم را پاکسازی کرد به طوری که فقط حروف و اعداد باقی بمانند، به این صورت که کارکترهایی مانند (! و @ و ؟ و…) حذف میشوند:
1 2 3 4 |
function fnSanitizeAlphanumeric($string) { return preg_replace('/[^a-zA-Z0-9]/', '', $string); } |
۵ – اعتبارسنجی و پاکسازی و بررسی وجود URL در PHP
اعتبارسنجی URL:
تابع زیر از صحیح بودن فرمت آدرس URL اطمینان حاصل میکند:
1 2 3 |
function fnValidateUrl($url){ return preg_match('/^(http(s?):\/\/|ftp:\/\/{1})((\w+\.){1,})\w{2,}$/i', $url); } |
و در PHP 5.2 به بالا به صورت:
1 2 3 4 |
function fnValidateUrl($url) { return filter_var($url, FILTER_VALIDATE_URL); } |
پاکسازی URL:
در PHP 5.2 به بالا به صورت زیر است:
1 2 3 4 |
function fnSanitizeUrl($url) { return filter_var($url, FILTER_SANITIZE_URL); } |
بررسی وجود URL:
با تابع زیر میتوانید از وجود یک url اطمینان حاصل کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
function url_exist($url) { $url = @parse_url($url); if (!$url) { return false; } $url = array_map('trim', $url); $url['port'] = (!isset($url['port'])) ? 80 : (int)$url['port']; $path = (isset($url['path'])) ? $url['path'] : ''; if ($path == '') { $path = '/'; } $path .= (isset($url['query'])) ? '?$url[query]' : ''; if (isset($url['host']) AND $url['host'] != @gethostbyname($url['host'])) { if (PHP_VERSION >= 5) { $headers = @get_headers('$url[scheme]://$url[host]:$url[port]$path'); } else { $fp = fsockopen($url['host'], $url['port'], $errno, $errstr, 30); if (!$fp) { return false; } fputs($fp, 'HEAD $path HTTP/1.1\r\nHost: $url[host]\r\n\r\n'); $headers = fread($fp, 4096); fclose($fp); } $headers = (is_array($headers)) ? implode('\n', $headers) : $headers; return (bool)preg_match('#^HTTP/.*\s+[(200|301|302)]+\s#i', $headers); } return false; } |
بررسی وجود عکس در URL:
با تابع زیر میتونید متوجه بشوید که در Url گرفته شده عکسی وجود دارد یا خیر:
1 2 3 |
function image_exist($url) { if(@file_get_contents($url,0,NULL,0,1)){return 1;}else{ return 0;} } |
۶ – اعتبارسنجی آدرس IP در PHP
تابع زیر آدرس IP خاصی را بررسی میکند:
1 2 3 |
function fnValidateIP($IP){ return preg_match('/^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/',$IP) } |
و در php 5.2 به بالا :
1 2 3 4 |
function fnValidateIP($ip) { return filter_var($ip, FILTER_VALIDATE_IP); } |
۷ – اعتبارسنجی نام کاربری در PHP:
قبل از مقایسه نام کاربری در پایگاه داده از این اعتبار سنجی برای کمتر کردن فشار بر روی پایگاه داده استفاده میشود:
1 2 3 4 |
function fnValidateUsername($username){ #alphabet, digit, @, _ and . are allow. Minimum 6 character. Maximum 50 characters (email address may be more) return preg_match('/^[a-zA-Z\d_@.]{6,50}$/i', $username); } |
۸ – اعتبارسنجی امنیت رمز عبور در PHP
برای بررسی امنیت رمزعبور داده شده توسط کاربر میتوانید از تابع زیر استفاده کنید که بررسی میکند تا رمز عبور حداقل ۸ کاراکتر تشکیل شود واز حروف بزرگ و کوچک و اعداد نیز استفاده کند.
1 2 3 4 |
function fnValidatePassword($password){ #must contain 8 characters, 1 uppercase, 1 lowercase and 1 number return preg_match('/^(?=^.{8,}$)((?=.*[A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z]))^.*$/', $password); } |
۹ – اعتبارسنجی کدپستی برای ایران در PHP
با تابع زیر میتوانید از صحیح بودن قالب بندی کد پستی اطمینان حاصل کنید:
1 2 3 4 |
function fnValidateIRPostal($postalcode){ #eg. 56789-01234 return preg_match('/^([0-9]{5})(-[0-9]{5})?$/i',$postalcode); } |
۱۰ – ایمن سازی و پاکسازی Query و Data قبل از ارسال به پایگاه داده در PHP
تابع زیر داده های ما را برای جلوگیری از Sql Injection پاکسازی میکند:
1 2 3 4 5 6 7 8 |
function _clean($str){ return is_array($str) ? array_map('_clean', $str) : str_replace('\\', '\\\\', htmlspecialchars((get_magic_quotes_gpc() ? stripslashes($str) : $str), ENT_QUOTES)); } //usage call it somewhere in beginning of your script _clean($_POST); _clean($_GET); _clean($_REQUEST);// and so on.. |
و این تابع از حملات XSS و JS و Sql Injection با پاک کردن تگ ها جلوگیری میکند:
1 2 3 4 5 6 7 8 |
function _clean($str){ return is_array($str) ? array_map('_clean', $str) : str_replace('\\', '\\\\', strip_tags(trim(htmlspecialchars((get_magic_quotes_gpc() ? stripslashes($str) : $str), ENT_QUOTES)))); } //usage call it somewhere in beginning of your script _clean($_POST); _clean($_GET); _clean($_REQUEST);// and so on.. |
خب همانطور که دیدی اعتبارسنجی فرم ها در php با استفاده از عبارت های با قاعده و توابع از پیش ساخته خود php مثل filter_var بسیار آسان است.
سعی کنید حتما و حتما در هر جایی از سایت و پروژه خود که از کاربر از طریق فرم اطلاعاتی را دریافت می کنید اعتبار سنجی های بالا را انجام بدید تا هم اینکه ورودی های عجیب و غریب وارد دیتابیس شما نشود و همچنین جلوی هک شدن را بگیرید.
هیچوقت به اعتبار سنجی سمت کلاینت با استفاده از جاواسکریپت اکتفا نکنید چونکه براحتی قابل دور زدن است و حتی در بعضی مرورگر ها با غیرفعال بودن جاواسکریپت ممکن است کدهای شما به درستی کار نکند.
موفق و پیروز باشید
جیطور در در php فارم را ولدید کنیم که نفر دلش بود نام خوده فارسی تایب کند و دلش که انگلیسی تایب می کند
سلام. باید مقادیر رو داخل یه ارایه قرار بدید و از in_array استفاده کنید
سلام
من از تابع fnSanitizeAlphanumeric واسه پاکسازی حروف و اعداد استفاده میکنم و همینطور از htmlspecialchars و
وقتی اطلاعات به صورت encrypt میشه یه سری علامت ها مثل = یا / یا + حذف میشه و به مشکل میخوره .
به نظرتون باید چیکار کرد؟
سلام.اول ووردی/خروجی رو پاکسازی کنید بعد اینکریپت
سلام مهندس شفیعی من میخوام تو سایت آدرس شبکه های اجتماعی کاربران رو دریافت کنم برای ثبت آگهی و کاربران سایت مستقیم به اونا وصل بشن این کار از نظر امنیتی اشتباه نیست ؟
پاکسازی و اعتبار سنجی url رو با تابع خود php انجام دادم این بررسی وجود عکس در url رو باید انجام بدم ؟
میشه بفرمایید چرا باید تشخیص بدیم عکس در url هست یا نه
اگه باشه چه خطری وبسایت رو تهدید میکنه
سلام حسن جان خدا قوت من میخوام موقع پاکسازی اعداد اعداد فارسی رو هم قبول کنه ولی تو vscode اعداد رو فقط انگلیسی مینویسه چیکار باید کرد تشکر از سایت خوبتون
سلام ممنون.
بنده با این ادیتور کار نکردم یا داخل تنظیمات هست یا اینکه بعد اینکه اعداد فارسی رو کپی کردید فایل تون رو جداگانه با نوت پد باز کنید ببینید تبدیل نکرده باشه
یا اگر منظورتون چیز دیگه ای هست از اینجا میتونید اعداد فارسی رو بگیرید :https://kitset.ir/numbers/translate
کارت عالیه
خیلی به زبان آسان و رسا توضیح میدی
برخی از این آموزشها رو من بلدم ولی علت واقعیش رو نمی دونستم
شما دقیقاً مثل لغت نامه بیان می کنی استاد خوبی هستی
درود بر تو
لطف داری خوشحالم که استفاده کردی
سلام حسن جان فکر کنم تو بخش پاکسازی اعداد باید از preg_replace استفاده کنید شما preg_match نوشتید درسته ؟
سلام. بله برای جایگزین هرچیزی به جز عدد از preg_replace(‘/[^0-9]/’, ”, $str) استفاده میشه
سلام حسن جان من برای حروف فارسی میخوام مثل انگلیسی فقط حروف اول و آخر رو بنویسم وتمام حروف رو ننویسم اما درست کار نمیکنه اصلا میشه اینکار رو کرد مثلا بنویسیم آ – ی
با سلام
کاراکترهای فارسی چگونه اعتبارسنجی میشند؟
در نام و نام خانوادگی و ….
سلام.
مهم نیست چون تابع مورد نظر کاراکتر ها رو بصورت utf8 پشتیبانی می کنید پس :
if(preg_match(“/^[آ ا ب پ ت ث ج چ ح خ د ذ ر ز ژ س ش ص ض ط ظ ع غ ف ق ک گ ل م ن و ه ی]/”, $_POST[‘name’]))
موفق باشید.
من میخواستم آدرس رو اعتبار سنجی کنم که حروف فارسی و اعداد و همچنین چند کاراکتر خاص فارسی نظیر ، – داره .
اما ارور میده یعنی اعداد رو قبول نمیکنه:
if (!preg_match(“/^[آإأابپتثجچحخدذرزژسشصضطظعغفقکگلمنهۀةوؤیيئءًٌٍَُِّ،-\s ]+$/u”,$address)){
اصولا در نام و شهر کار میکنه ولی در آدرس کار نمیکنه
سلام. از این استفاده کنید
if(preg_match(“/^[آ ا ب پ ت ث ج چ ح خ د ذ ر ز ژ س ش ص ض ط ظ ع غ ف ق ک گ ل م ن و ه ی]/”, $address))