
اعتبارسنجی و تمیز دادن اطلاعات ورودی یکی از موضوعات مهم برنامه نویسی ( حال در هر زبانی ) است . ما در این مقاله به بررسی تکه کدهای مورد نیاز برای ایمن سازی و اعتبارسنجی اطلاعات ورودی می پردازیم استفاده مناسب از توابع زبان و دانستن کدهای موردنیاز یکی از ابزارهای مهم برنامه نویسی است .
گاهی پیش آمده است که بنده نیز به دنبال یک تکه کد که قبلا از آن استفاده کردم و در فرم ها بکار می بردم باشم و پس از مدتی وقت جستجو در اینترنت آن را بیابم . اما هدف از این مقاله جمع آوری این توابع ضروری PHP در یکجا است .
در ادامه مطلب شما شاهد 20 تکه کد ( تابع ) زبان php هستید که بصورت خیلی ساده برای شما آورده شده است .
اعتبار سنجی ایمیل
با تابع زیر می توان اعتبار یک ایمیل را سنجید . این کد زمانی به کار می آید که بخواهید در یک فرم ایمیل ورودی را از نظر اعتبار تست کنید :
function isValidEmail($email){
return eregi('^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,3})$', $email);
}
و برای PHP نسخه 5.2 به بالا :
function fnValidateEmail($email)
{
return filter_var($email, FILTER_VALIDATE_EMAIL);
}
تمیز کردن ایمیل ورودی
حالا با تابع زیر می توان به راحتی ایمیل ورودی را از یکسری فیلتر رد کنیم و آن را تمیز کنیم .
function fnSanitizeEmaill($string) {
return preg_replace( '((?:n|r|t|%0A|%0D|%08|%09)+)i' , '', $string );
}
و برای PHP نسخه 5.2 به بالا :
function fnSanitizeEmaill($url)
{
return filter_var($url, FILTER_SANITIZE_EMAIL);
}
بررسی موجودیت ایمیل
از نظر نظری این امکان عملی نیست اما با یک سری توابع می توان چنین عملی را به واقعیت نزدیک کرد :
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 می تواند پی به عدد بودن ورودی برد :
function fnValidateNumber($value)
{
#is_ double($value);
#is_ float($value);
#is_ int($value);
#is_ integer($value);
return is_numeric($value);
}
و برای PHP نسخه 5.2 به بالا :
function fnValidateNumber($value)
{
#return filter_var($value, FILTER_VALIDATE_FLOAT); // float
return filter_var($value, FILTER_VALIDATE_INT); # int
}
تمیز کردن اعداد
می توان با تابع زیر ورودی را از فیلتر استاندارد رد کرد :
function fnSanitizeNumber($str)
{
#letters and space only
return preg_match('/[^0-9]/', '', $str);
}
و برای PHP نسخه 5.2 به بالا :
function fnSanitizeNumber($value)
{
#return filter_var($value, FILTER_SANITIZE_NUMBER_FLOAT); // float
return filter_var($value, FILTER_SANITIZE_NUMBER_INT); # int
}
اعتبارسنجی حروف
گاهی نیاز است از ورودی جز حروف و خط فاصله جلوگیری کرد مانند نام خانوادگی که نیازی به ب
function fnSanitizeStringr($str)
{
#letters and space only
return preg_match('/[^A-Za-zs ]/', '', $str);
}
تمیز کردن حروف
گاهی اصلا لزومی ندارد اعتبار ورودی را از نظر حرف بودنش بررسی کرد و کافی است ورودی را تمیز کرد و اگر کارکتری جز کارکترهای مجاز حروف بود آن را تمیز کرد.
function fnSanitizeStringr($str)
{
#letters and space only
return preg_replace('/[^A-Za-zs ]/', '', $str);
}
و برای PHP نسخه 5.2 به بالا :
function fnSanitizeStringr($str)
{
return filter_var($str, FILTER_SANITIZE_STRIPPED); # only 'String' is allowed eg. '<br>HELLO</br>' => 'HELLO'
}
اعتبارسنجی کارکترهای الفبایی (a-z و 0-9)
این تابع می تواند اعتبار ورودی را از بودن کارکترهای الفبایی بررسی کنید a-z و 0-9
function fnValidateAlphanumeric($string)
{
return preg_match('/[^a-zA-Z0-9s]/', '', $string);
}
تمیز دادن کارکترهای الفبایی
برخلاف اعتبار سنجی که جوابش بلی یا خیر است این تابع می تواند تمیز بدهد و مثلا ؟ را از یک جمله حذف کند
function fnSanitizeAlphanumeric($string)
{
return preg_replace('/[^a-zA-Z0-9s]/', '', $string);
}
اعتبارسنجی موجودیت آدرس اینترنتی
این تابع می توان موجودیت آدرس اینترنتی را بررسی کند .
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.1rnHost: $url[host]rnrn');
$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 ورودی
تابع زیر می تواند ساختار صحیح آدرس ورودی را بررسی کند.
function fnValidateUrl($url){
return preg_match('/^(http(s?)://|ftp://{1})((w+.){1,})w{2,}$/i', $url);
}
و برای نسخه بالاتر 5.2
function fnValidateUrl($url)
{
return filter_var($url, FILTER_VALIDATE_URL);
}
تمیز دادن آدرس URL
تنها برای PHP 5.2 امکانش هست :
function fnSanitizeUrl($url)
{
return filter_var($url, FILTER_SANITIZE_URL);
}
اعتبارسنجی موجودیت عکس
تابع زیر می تواند عکس مورد نظر را از نظر موجودیت آن تست کند .
function image_exist($url) {
if(@file_get_contents($url,0,NULL,0,1)){return 1;}else{ return 0;}
}
اعتبارسنجی آدرس IP
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)
}
و برای نسخه بالاتر 5.2
function fnValidateIP($ip)
{
return filter_var($ip, FILTER_VALIDATE_IP)
}
اعتبارسنجی پراکسی
این تابع می تواند بررسی کند که بازدیدکننده شما از پراکسی استفاده می کند یا خیر . حتی کسانی که از پراکسی های ناشناس استفاده می کنند.
function fnValidateProxy(){
if ($_SERVER['HTTP_X_FORWARDED_FOR']
|| $_SERVER['HTTP_X_FORWARDED']
|| $_SERVER['HTTP_FORWARDED_FOR']
|| $_SERVER['HTTP_VIA']
|| in_array($_SERVER['REMOTE_PORT'], array(8080,80,6588,8000,3128,553,554))
|| @fsockopen($_SERVER['REMOTE_ADDR'], 80, $errno, $errstr, 30))
{
exit('Proxy detected');
}
}
اعتبارسنجی نام کاربری
واضح است که نام کاربری در هر سایتی یکسری قوانین لازم دارد . حداقل 6 حرف و حداکثر 50 کارکتر خوب برای تست اعتبار نام کاربری می توان مثال زیر را زد :
function fnValidateUsername($username){
#alphabet, digit, @, _ and . are allow. Minimum 6 character. Maximum 50 characters (email address may be more)
return preg_match('/^[a-zA-Zd_@.]{6,50}$/i', $username);
}
اعتبارسنجی قدرت رمزعبور ورودی
خوب این تابع بسیار می تواند مفید باشد . چرا که انتخاب یک رمز مناسب و با کفیت می تواند در امنیت سایت ما نیز مفید واقع شود . بر فرض مثال همین نیوک لرن که اعضای ویژه دارد یکی از مسائل مهمش استفاده کاربران از رمزهای قوی است تا فرد دومی به رمز آن ها دست پیدا نکند .
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 بررسی می کند .
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);
}
و این تابع می تواند تاریخ را بر اساس YYYY-DD-MM یا YY-MM-DD بررسی کند
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);
}
اعتبارسنجی شش تایی ( هگزا دسیمال ) کدهای رنگ
function fnValidateColor($color){
#CCC
#CCCCC
#FFFFF
return preg_match('/^#(?:(?:[a-f0-9]{3}){1,2})$/i', $color);
}
ایمن کردن کوئری ( درخواست به بانک اطلاعاتی )
یکی از توابع مفید برای تمیز دادن ورودی ها برای جلوگیری از حملات بانک اطلاعاتی این مورد است که با هم مشاهده می کنیم :
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..
ایمین کردن اطلاعات
با تابع زیر می توان اطلاعات مورد نظر خود را از حملات JS و XSS و بانک اطلاعاتی تمیز داد
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..