پنج شنبه, 19 آذر 1394 22:19

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

نوشته شده توسط
این مورد را ارزیابی کنید
(0 رای‌ها)

اعتبارسنجی داده ها در PHP

در این مطلب آموزشی از سری آموزش های برنامه نویسی به زبان PHP به اعتبارسنجی داده های فرم یا Form Data Validation می پردازیم. اعتبارسنجی داده های فرم یکی از مهمترین بخش های یک برنامه تحت وب (Web application) است. همیشه باید انتظار دریافت داده های عجیب و غریب، اشتباه و یا حتی ناکافی از سوی کاربر را داشته باشید. برخی کاربران بی دقت هستند، برخی دیگر سوء نیست دارند، و برخی نیز بطور باورنکردنی بیشتر از آن چه تصورش را بکنید، از شما خلاق ترند. از همین رو اعتبارسنجی هر نوع داده ای که از سوی کاربر یا هر منبع بیرونی (External source) به برنامه تحت وب شما وارد می شود جنبه حیاتی دارد. بسیاری از این منابع مشخص هستند. بیشتر ورودی ها به برنامه تحت وب شما احتمالا از یک فرم وب (Web form) می آید. اما داده ها از راه های زیاد دیگری نیز می توانند به درون برنامه تحت وب شما جاری شوند؛ مثلا از راه پایگاه های داده ای که با افراد یا برنامه های دیگر به اشتراک می گذارید، از راه وب سرویس ها (Web services) و سرورهای راه دور (Remote servers)؛ حتی از راه url ها و پارامترهای درون آنها.

بعضی از استراتژی های اعتبارسنجی که در این مطلب به آنها پرداخته ایم از عبارات باقاعده regular expressions استفاده می کنند. regular expressions الگوهای متنی بسیار قدرتمندی برای اعتبارسنجی داده ها هستند. در ادامه به بررسی چند نوع اعتبارسنجی داده ها می پردازیم.

1) اعتبارسنجی داده های الزامی (Required data validation)

گاهی ورود برخی داده ها توسط کاربر الزام آور (Required) و برخی دیگر اختیاری (Optional) است. داده های الزامی داده هایی هستند که کاربر حتما باید آنها را وارد کند و در غیر این صورت می بایست به او پیغام خطایی نشان داده شود تا کاربر متوجه شود داده مورد نظر را وارد نکرده است. کد زیر بررسی می کند که آیا کاربر فیلد ایمیل (email) درون فرم وب را وارد کرده است یا نه؟

if (strlen($_POST['email']) == 0) {

   $errors[] = 'You must enter an email address.';

}

دستور if در کد بالا با استفاده از تابع strlen طول رشته متن email را بررسی می کند و اگر طول رشته متن برابر صفر باشد نتیجه می گیریم که کاربر عبارتی را وارد نکرده است.

بیشتر مواقع هنگام اعتبارسنجی داده ها نیاز داریم تا با استفاده از تابع trim فضاهای خالی (whitespace) را برداریم. فرض کنید کاربر به جای وارد کردن آدرس ایمیل خود، عبارت ' ' که شامل سه فضای خالی است را برایمان ارسال کند. در این صورت کد بالا false برمی گرداند چون مقدار برگشتی تابع strlen برابر 3 خواهد بود نه 0. با استفاده از کد زیر اطمینان حاصل می کنیم که عبارت ارسال شده فاقد فضای خالی است.

if (strlen(trim($_POST['email'])) == 0) {

   $errors[] = 'You must enter an email address.';

}

2) اعتبارسنجی داده های عددی و متنی (Numeric and string data validation)

بسیاری مواقع پیش می آید که انتظار داریم کاربر یک مقدار عددی برای ما ارسال کند. مثلا از کاربر می خواهیم سن خودش را در فرم وب وارد کند اما او به جای عدد، سن خودش را به حروف می نویسد.

جهت کسب اطمینان از اینکه مقدار ارسال شده توسط کاربر یک عدد صحیح (integer number) و یا یک عدد اعشاری (floating-point number) است می توانیم به ترتیب از توابع تبدیل intval() و floatval() استفاده کنیم. کار این توابع این است که یک پارامتر ورودی میگیرند و آن را به نوع عدد صحیح و یا نوع اعشاری تبدیل کنند. در صورتی که پارامتر ورودی قابلیت تبدیل به نوع عددی نداشته باشد مقدار برگشتی دو تابع intval و floatval صفر خواهد بود. کد زیر بررسی می کند که آیا کاربر فیلد سن (age) درون فرم وب را صحیح وارد کرده است یا نه؟

if ($_POST['age'] != strval(intval($_POST['age'])) {

    $errors[] = 'Please enter a valid age.';

}

در کد بالا ابتدا با استفاده از تابع intval مقدار متنی $_POST['age'] به نوع عدد صحیح تبدیل می شود و سپس برای اینکه بتوانیم مقدار بازگشتی از تابع intval را با $_POST['age'] مقایسه کنیم دوباره نیاز است تا با استفاده از تابع strval آن را به نوع متنی تبدیل کنیم. اگر دو طرف مقایسه برابر نباشند می توانیم نتیجه بگیریم که در مقدار ارسال شده مشکلی وجود دارد و آن را نمی پذیریم.

کد زیر بررسی می کند که آیا کاربر فیلد قیمت (price) درون فرم وب را صحیح وارد کرده است یا نه؟ مقدار قیمت می بایست از نوع عدد اعشاری باشد.

if ($_POST['price'] != strval(floatval($_POST['price']))) {

    $errors[] = 'Please enter a valid price.';

}

3) اعتبارسنجی محدوده اعداد (Number range validation)

برای اینکه بررسی کنید مقدار عددی ارسال شده در محدوده خاصی از اعداد واقع شده است یا نه ابتدا باید مطمئن شوید مقدار ارسال شده از نوع عددی هست یا نه؛ اگر از نوع عددی بود براحتی می توانید آن را با استفاده از عملگرها مورد آزمون قرار دهید.

if ($_POST['age'] != strval(intval($_POST['age']))) {

    $errors[] = 'Your age must be a number.';

}
elseif (($_POST['age'] < 18) || ($_POST['age'] > 65)) {

    $errors[] = 'Your age must be at least 18 and no more than 65.';

}

4) اعتبارسنجی آدرس ایمیل (Email address validation)

هنگام برنامه نویسی کردن برنامه های تحت وب، یکی از متداول ترین کارهایی که انجام می دهید مسلما، اعتبارسنجی کردن آدرس ایمیل است با این حال، هیچ راه کامل و یک-مرحله ای وجود ندارد که بتوانیم از آن طریق مطئن شویم یک آدرس ایمیل معتبر هست یا نه چون "معتبر" در اینجا بسته به هدفی که دارید می تواند معانی مختلفی داشته باشد. اگر واقعا می خواهید مطمئن شوید آدرس ایمیل که از سوی کاربر برای شما ارسال شده، آدرس ایمیل معتبری هست، می بایست هنگامی که کاربر آن را ارسال کرد، پیامی حاوی یک رشته متن تصادفی (Random) به آن آدرس ایمیل بفرستید و از کاربر بخواهید تا آن رشته متن تصادفی را درون فرمی در سایت شما ارسال کند. یا در پیامی که به کاربر ارسال می کنید یک url به همراه آن رشته متن تصادفی قرار دهید تا کاربر روی آن کلیک کند. اگر آن کد به سایت شما ارسال شد (و یا کاربر روی لینک کلیک کرد)، آن گاه می توانید مطمئن باشید شخصی که آن کد را برای شما ارسال کرده است، صاحب آن آدرس ایمیل است.

اگر نمی خواهید خودتان را با چنین فرایندی برای اعتبارسنجی آدرس ایمیل به دردسر بیندازید، می توانید آدرس ایمیل را فقط از جنبه اشتباه تایپی مورد بررسی کنید. عبارت باقاعده ^[^@\s][email protected]([-a-z0-9]+\.)+[a-z]{2,}$ بیشتر آدرس های ایمیل را مورد مطابقت قرار می دهد و چنانچه آدرس ایمیل درون رشته متن اشتباه تایپ شده باشد، موفق به تطبیق دادن نشده و در نتیجه مقدار false برمی گرداند. می توانید از این عبارت باقاعده (Regular expression) در تابع preg_match() استفاده کنید. کد زیر متغیر $_['email'] را از نظر اینکه حاوی آدرس ایمیل صحیح هست یا نه مورد بررسی قرار می دهد.

if (! preg_match('/^[^@\s][email protected]([-a-z0-9]+\.)+[a-z]{2,}$/i', $_POST['email'])) {

    $errors[] = 'Please enter a valid e-mail address';

}

تنها خطر استفاده از این عبارت باقاعده این است که هیچ گونه فضای خالی (Whitespace) را در بخش نام کاربری ایمیل مجاز نمی داند. به عبارتی اگر نام کاربری یک آدرس ایمیل دارای فضای خالی باشد - مثلا some این آدرس ایمیل توسط spambots حفاظت می شود. برای دیدن شما نیاز به جاوا اسکریپت دارید، نتیجه شرط بالا false خواهد بود حال آنکه این آدرس بر طبق استاندارد تعریف آدرس ایمیل اینترنتی کاملا معتبر است. خوشبختانه آدرس های ایمیل که بخش نام کاربری آنها دارای فضای خالی باشد آن قدر نادر است که شما می توانید اصلا نگران این مسئله نباشید.

اگر از PHP 5.2 به بالا استفاده می کنید، می توانید به جای استفاده از عبارات باقاعده، از تابع filter_var هم برای اعتبارسنجی ایمیل به صورت زیر استفاده کنید.

if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
  $errors[] = "Invalid email format";
}

5) اعتبارسنجی منوهای انتخاب (<select> Menus validation)

وقتی از منوهای <select> در فرمی استفاده می کنید لازم است تا مطمئن شوید که مقدار ارسال شده برای المان منو یکی از گزینه های مجاز درون منو است. گرچه یک کاربر عادی که از مرورگرهای امنی مثل Mozilla یا Internet Explorer استفاده می کند نمی تواند مقداری که خارج از منوی <select> نیست را انتخاب کند، اما یک هکر مهاجم می تواند بدون استفاده از یک مرورگر، درخواست هایی حاوی مقادیر دلخواه بسازد و ارسال کند.

برای پیشگیری کردن از چنین خطری بهتر است ابتدا گزینه های منوی <select> را در یک آرایه نگه دارید و سپس در میان آنها iterate کرده و آنها را نمایش دهید.

<?php
$fruits = array("apple", "orange", "grapes", "banana", "pear");
?>

<form method="POST" action="">
	<select name="fruit">
	<?php foreach($fruits as $fruit): ?>
		<option><?php echo $fruit; ?></option>
	<?php endforeach; ?>
	</select>
	<br/>
	<input type="submit" name="submit" />
</form>

پس از اینکه فرم ارسال شد با استفاده از تابع in_array می توانیم بررسی کنیم که آیا مقدار ارسال شده درون آرایه وجود دارد یا نه و بدینوسیله از دریافت مقداری که خارج از گزینه های منوی <select> است جلوگیری می کنیم.

<?php
if (isset($_POST["submit"]))
{
	if (!in_array($_POST["fruit"], $fruits)) {

		echo "Please choose a valid fruit.";
	}
	else
	{
		echo $_POST["fruit"]." was selected";
	}
}
?>

 

همچنین بخوانید


کار کردن با رشته متن ها در PHP

تابع substr در PHP

تابع substr_replace در PHP

آموزش کار با پروتکل FTP در PHP

بازدید 2040 بار آخرین ویرایش در دوشنبه, 17 اسفند 1394 14:33

اضافه کردن نظر


کد امنیتی
تازه سازی

جدیدترین های آندروید

جدیدترین های آموزش زبان فرانسوی

جدیدترین های آموزش زبان انگلیسی

جدیدترین های صوتی

جدیدترین های ویندوزفون

جدیدترین های الگوریتم

جدیدترین های آموزش PHP

جدیدترین های پیامک

ورود

رضایت از بهگذر را به گوش گوگل برسانید
Web Analytics

بیشتر بخوانید

اضافه کردن ویجت های قفل صفحه نمایش روی گوشی Galaxy S4

ویجت های قفل صفحه نمایش را به آسانی می توان روی Galaxy S4 فعال کرد اما لازم است تا یکی دو تنظیمات اضافی را به این منظور اعمال کنید.

ولی برای نخستین بار سامسونگ گالاکسی S4 استفاده می کنید ممکن است به نظر برسد که ویجت های قفل صفحه نمایش در آن موجود نیست.

 قفل پیش فرض صفحه نمایش ویجتی از یک ساعت بزرگ همراه با متن "life companion" یا متن دیگری در بالای است. اما S4 بعنوان یک دستگاه مجهز به آندروید 4.2 پشتیبانی کاملی از ویجت های قفل صفحه نمایش دارد. موضوع این است که باید آنها را در تنظیمات قفل صفحه نمایش فعال کنید.

بیشتر بخوانید

بیشتر بخوانید

Windows Phone Lumia 

برای خریداران گوشی های تلفن همراه بسیار مهم است که بدانند آیا گوشی که در حال خریدن آن هستند براستی نو و دست اول یا به اصطلاح آکبند هست و یا یک گوشی کارکرده را با عنوان گوشی نو خریداری می کنند. به همین منظور تصمیم گرفتیم تا در این آموزش ترفندی را به شما معرفی کنیم که با انجام دادن آن می توانید از نو بودن و صحت مشخصه ی گوشی با سیستم عامل WP9 - از خانواده لومیا (Lumia) - که در حال خریدن آن هستید باخبر شوید.

بیشتر بخوانید

الگوریتم

در این مطلب آموزشی ابتدا الگوریتم مجموع 20 عدد را برای حل توسط کامپیوتر طراحی و سپس نمونه کد آن را برای زبان های برنامه نویسی سی شارپ C# پیاده سازی می کنیم.

رضایت از بهگذر را به گوش گوگل برسانید