۰۸-دى-۱۳۹۲, ۰۰:۵۷:۵۵
یکی از مهمترین قسمتهای برنامه نویسی وب با PHP، اعتبار سنجی و کنترل داده های ورودی توسط کاربر است؛ فرم ها، اصلی ترین ابزار برقراری ارتباط با کاربران سایت میباشند و اطمینان از اینکه کاربر فرم را در قالب صحیح پر کرده باشد از مشکلات آتی جلوگیری میکند. علاوه بر این در مواقعی، فردی که فرم را پر میکند، لزوما کاربر اصلی سایت نیست و هدفی به غیر از هدف اصلی فرم دارد. باید توجه داشت که اگر داده های ورودی از فرم ها به خوبی بررسی و پاکسازی نشوند، میتوانند به عنوان مهمترین وسیله نفوذ به سیستم تلقی شوند. برای جلوگیری از این مسائل باید داده های ورودی از فرم ها را قبل از پردازش و ارسال به پایگاه داده، بررسی و پاکسازی کنیم. استفاده از عبارات منظم (Regular Expressions) میتواند برای این موضوع مناسب باشد، که در زیر به انواع داده های فرم و نحوه اعتبار سنجی آن توسط عبارات منظم در PHP اشاره شده است:
۱- اعتبار سنجی و پاکسازی و بررسی وجود ایمیل با PHP
اعتبار سنجی فرم ایمیل:
اعتبار سنجی فرم ایمیل را میوانید به ۳ روشی که در زیراشاره میشود انجام دهید. اولین روش به این صورت است:
یک روش بهتر هم هست که میتوانید ازآن استفاده کنید:
و اگر از PHP 5.2 به بالا استفاده میکنید میتوانید از این روش فرم ایمیل رو اعتبار سنجی کنید:
پاکسازی ایمیل:
ما حتی میتوانیم برای اطمینان بیشتر ایمیل گرفته شده را پاکسازی کنیم:
و یا در PHP 5.2 به بالا از روش زیر برای پاکسازی استفاده کنید:
بررسی وجود ایمیل با php :
این کار امکان پذیر نیست ولی میشود تا حد زیادی با بررسی دامنه ایمیل از وجود آن مطلع شد:
۲ – اعتبار سنجی و پاکسازی اعداد با PHP
اعتبار سنجی اعداد:
برای بررسی اعداد در یک فرم میتوانیم از توابع داخلی PHP استفاده کنیم:
و در PHP 5.2 وبالاتر به این شکل عمل میکنیم:
پاکسازی اعداد:
با استفاده از تابع زیر میتوانیم اعداد داخل فرم را پاکسازی کنیم:
و در PHP 5.2 به بالا:
۳ – اعتبار سنجی و پاکسازی رشته ها در PHP
اعتبار سنجی رشته ها:
بیشتر در اعتبار سنجی نام و نام خانوادگی و .. به کار میرود و فقط حروف و فاصله را قبول میکند:
پاکسازی رشته ها:
برای پاک کردن فرم از کاراکترهای غیر رشته ای به کار میرود:
در PHP 5.2 و بالاتر میتوان از توابع قدرتمند داخلی PHP استفاده کرد:
۴ – اعتبار سنجی و پاکسازی اعداد و حروف در PHP:
اعتبار سنجی اعداد و حروف:
تابع زیر فرم را بررسی میکند تا فقط حروف و اعداد به کار رفته باشد:
پاکسازی حروف و اعداد:
با تابع زیر میتوان داده گرفته شده از فرم را پاکسازی کرد به طوری که فقط حروف و اعداد باقی بمانند، به این صورت که کارکترهایی مانند (! و @ و ؟ و…) حذف میشوند:
۵ – اعتبار سنجی و پاکسازی و بررسی وجود URL در PHP
اعتبار سنجی URL:
تابع زیر از صحیح بودن فرمت آدرس URL اطمینان حاصل میکند:
و در PHP 5.2 به بالا به صورت:
پاکسازی URL:
در PHP 5.2 به بالا به صورت زیر است:
بررسی وجود URL:
با تابع زیر میتوانید از وجود یک url اطمینان حاصل کنید:
بررسی وجود عکس در URL:
با تابع زیر میتونید متوجه بشوید که در Url گرفته شده عکسی وجود دارد یا خیر:
۶ – اعتبار سنجی آدرس IP در PHP
تابع زیر آدرس IP خاصی را بررسی میکند:
و در PHP 5.2 و بالاتر:
۷ – اعتبار سنجی نام کاربری در PHP:
قبل از مقایسه نام کاربری در پایگاه داده از این اعتبار سنجی برای کمتر کردن فشار بر روی پایگاه داده استفاده میشود:
۸ – اعتبار سنجی امنیت رمز عبور در PHP
برای بررسی امنیت رمزعبور داده شده توسط کاربر میتوانید از تابع زیر استفاده کنید که بررسی میکند تا رمز عبور حداقل ۸ کاراکتر تشکیل شود واز حروف بزرگ و کوچک و اعداد نیز استفاده کند.
۹ – اعتبار سنجی تاریخ در PHP
اعتبار سنجی تاریخ با فرمت “MM-DD-YYYY” یا “MM-DD-YY” از ۰۰۰۰ تا ۹۹۹۹ :
اعتبار سنجی تاریخ با فرمت “YYYY-DD-MM” یا “YY-MM-DD” از ۰۰۰۰ تا ۹۹۹۹ :
۱۰ – اعتبار سنجی کدپستی برای ایران در PHP
با تابع زیر میتوانید از صحیح بودن قالب بندی کد پستی اطمینان حاصل کنید:
۱۱ – ایمن سازی و پاکسازی Query و Data قبل از ارسال به پایگاه داده در PHP
تابع زیر داده های ما را برای جلوگیری از Sql Injection پاکسازی میکند:
و این تابع از حملات XSS و JS و Sql Injection با پاک کردن تگها جلوگیری میکند:
۱- اعتبار سنجی و پاکسازی و بررسی وجود ایمیل با PHP
اعتبار سنجی فرم ایمیل:
اعتبار سنجی فرم ایمیل را میوانید به ۳ روشی که در زیراشاره میشود انجام دهید. اولین روش به این صورت است:
کد php:
function isValidEmail($email){
return eregi('^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$', $email);
}
کد php:
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:
function fnValidateEmail($email)
{
return filter_var($email, FILTER_VALIDATE_EMAIL);
}
ما حتی میتوانیم برای اطمینان بیشتر ایمیل گرفته شده را پاکسازی کنیم:
کد php:
function fnSanitizeEmaill($string) {
return preg_replace( '((?:\n|\r|\t|%0A|%0D|%08|%09)+)i' , '', $string );
}
کد php:
function fnSanitizeEmaill($url)
{
return filter_var($url, FILTER_SANITIZE_EMAIL);
}
این کار امکان پذیر نیست ولی میشود تا حد زیادی با بررسی دامنه ایمیل از وجود آن مطلع شد:
کد php:
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:
function fnValidateNumber($value)
{
#is_ double($value);
#is_ float($value);
#is_ int($value);
#is_ integer($value);
return is_numeric($value);
}
کد php:
function fnValidateNumber($value)
{
#return filter_var($value, FILTER_VALIDATE_FLOAT); // float
return filter_var($value, FILTER_VALIDATE_INT); # int
}
با استفاده از تابع زیر میتوانیم اعداد داخل فرم را پاکسازی کنیم:
کد php:
function fnSanitizeNumber($str)
{
#letters and space only
return preg_match('/[^0-9]/', '', $str);
}
کد php:
function fnSanitizeNumber($value)
{
#return filter_var($value, FILTER_SANITIZE_NUMBER_FLOAT); // float
return filter_var($value, FILTER_SANITIZE_NUMBER_INT); # int
}
اعتبار سنجی رشته ها:
بیشتر در اعتبار سنجی نام و نام خانوادگی و .. به کار میرود و فقط حروف و فاصله را قبول میکند:
کد php:
function fnValidateStringr($str)
{
#letters and space only
return preg_match('/^[A-Za-z\s ]+$/', $str);
}
برای پاک کردن فرم از کاراکترهای غیر رشته ای به کار میرود:
کد php:
function fnSanitizeStringr($str)
{
#letters and space only
return preg_replace('/[^A-Za-z\s ]/', '', $str);
}
کد php:
function fnSanitizeStringr($str)
{
return filter_var($str, FILTER_SANITIZE_STRIPPED); # only 'String' is allowed eg. '<br>HELLO</br>' => 'HELLO'
}
اعتبار سنجی اعداد و حروف:
تابع زیر فرم را بررسی میکند تا فقط حروف و اعداد به کار رفته باشد:
کد php:
function fnValidateAlphanumeric($string)
{
return ctype_alnum ($string);
}
با تابع زیر میتوان داده گرفته شده از فرم را پاکسازی کرد به طوری که فقط حروف و اعداد باقی بمانند، به این صورت که کارکترهایی مانند (! و @ و ؟ و…) حذف میشوند:
کد php:
function fnSanitizeAlphanumeric($string)
{
return preg_replace('/[^a-zA-Z0-9]/', '', $string);
}
اعتبار سنجی URL:
تابع زیر از صحیح بودن فرمت آدرس URL اطمینان حاصل میکند:
کد php:
function fnValidateUrl($url){
return preg_match('/^(http(s?):\/\/|ftp:\/\/{1})((\w+\.){1,})\w{2,}$/i', $url);
}
و در PHP 5.2 به بالا به صورت:
کد php:
function fnValidateUrl($url)
{
return filter_var($url, FILTER_VALIDATE_URL);
}
در PHP 5.2 به بالا به صورت زیر است:
کد php:
function fnSanitizeUrl($url)
{
return filter_var($url, FILTER_SANITIZE_URL);
}
با تابع زیر میتوانید از وجود یک url اطمینان حاصل کنید:
کد:
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 گرفته شده عکسی وجود دارد یا خیر:
کد php:
function image_exist($url) {
if(@file_get_contents($url,0,NULL,0,1)){return 1;}else{ return 0;}
}
تابع زیر آدرس IP خاصی را بررسی میکند:
کد php:
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:
function fnValidateIP($ip)
{
return filter_var($ip, FILTER_VALIDATE_IP);
}
قبل از مقایسه نام کاربری در پایگاه داده از این اعتبار سنجی برای کمتر کردن فشار بر روی پایگاه داده استفاده میشود:
کد php:
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:
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);
}
اعتبار سنجی تاریخ با فرمت “MM-DD-YYYY” یا “MM-DD-YY” از ۰۰۰۰ تا ۹۹۹۹ :
کد php:
function fnValidateDate($date){
#05/12/2109
#05-12-0009
#05.12.9909
#05.12.99
return preg_match('/^((0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])[- /.][0-9]?[0-9]?[0-9]{2})*$/', $date);
}
کد php:
function fnValidateDate($date){
#2009/12/11
#2009-12-11
#2009.12.11
#09.12.11
return preg_match('#^([0-9]?[0-9]?[0-9]{2}[- /.](0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01]))*$#'', $date);
}
با تابع زیر میتوانید از صحیح بودن قالب بندی کد پستی اطمینان حاصل کنید:
کد php:
function fnValidateIRPostal($postalcode){
#eg. 56789-01234
return preg_match('/^([0-9]{5})(-[0-9]{5})?$/i',$postalcode);
}
تابع زیر داده های ما را برای جلوگیری از Sql Injection پاکسازی میکند:
کد php:
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..
کد php:
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..