آموزش PHP قسمت چهارم

  • September 16, 2022 9:25 pm
  1. متغیرهای جهانی Superglobals
  2. عبارات با قاعده

۲۰. متغیرهای جهانی Superglobals

Superglobal ها در PHP 4.1.0 معرفی شدند. آنها متغیرهای داخلی هستند که همیشه در همه حوزه ها در دسترس هستند.
 
برخی از متغیرهای از پیش تعریف شده superglobal ها هستند، به این معنی که آنها همیشه بدون توجه به محدوده قابل دسترسی هستند و شما می توانید از هر تابع، کلاس یا فایلی بدون نیاز به انجام کار خاصی به آنها دسترسی داشته باشید.
 
متغیرهای superglobal عبارتند از:
  • GLOBALS$
  • SERVER_$
  • REQUEST_$
  • POST_$
  • GET_$
  • FILES_$
  • ENV_$
  • COOKIE_$
  • SESSION_$

GLOBALS$

متغیرهای Super global ، متغیرهای داخلی هستند که همیشه در همه حوزه‌ها در دسترس هستند.
 
GLOBALS$ یک متغیر Super global است که برای دسترسی به متغیرهای سراسری از هر نقطه در اسکریپت PHP ( همچنین از درون توابع یا متدها ) استفاده می‌شود.
 
PHP همه متغیرهای سراسری را در آرایه ای به نام GLOBALS[index]$ ذخیره می کند. ایندکس نام متغیر را نگه می دارد.
 
مثال زیر نحوه استفاده از متغیر سوپر گلوبال GLOBALS$ را نشان می دهد:
<?php
 
$x = 75;
$y = 25; 

function addition() {
  $GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];
}

addition();
echo $z;

?>
flesh

100

در مثال بالا، از آنجایی که z یک متغیر موجود در آرایه GLOBALS$ است، از خارج از تابع نیز قابل دسترسی است!

SERVER_$

SERVER_$ یک متغیر سوپر گلوبال PHP است که اطلاعات مربوط به سرصفحه‌ها، مسیرها و مکان‌های اسکریپت را در خود نگه می‌دارد.
 
مثال زیر نحوه استفاده از برخی از عناصر موجود در SERVER_$ را نشان می دهد:
<!DOCTYPE html>
<html>
<body>

<?php

echo $_SERVER['PHP_SELF'];
echo "<br>";
echo $_SERVER['SERVER_NAME'];
echo "<br>";
echo $_SERVER['HTTP_HOST'];
echo "<br>";
echo $_SERVER['HTTP_REFERER'];
echo "<br>";
echo $_SERVER['HTTP_USER_AGENT'];
echo "<br>";
echo $_SERVER['SCRIPT_NAME'];

?>

</body>
</html>
flesh

/phptest.com/public_html/index.php
PhpStorm 2021.3
localhost:63342

Warning: Undefined array key “HTTP_REFERER” in C:\xampp\htdocs\phptest.com\public_html\index.php on line 13

Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36
/phptest.com/public_html/index.php

REQUEST_$

متغیرهای سوپر گلوبال، متغیرهای داخلی هستند که همیشه در همه حوزه‌ها در دسترس هستند.
 
REQUEST_$ یک متغیر سوپر گلوبال PHP است که برای جمع آوری داده ها پس از ارسال فرم HTML استفاده می شود.
مثال زیر فرمی را با فیلد ورودی و دکمه ارسال نشان می دهد. هنگامی که کاربر داده ها را با کلیک بر روی “ارسال” ارسال می کند، داده های فرم به فایل مشخص شده در ویژگی عملکرد تگ <form> ارسال می شود. در این مثال برای پردازش داده های فرم به خود این فایل اشاره می کنیم. اگر می خواهید از فایل PHP دیگری برای پردازش داده های فرم استفاده کنید، آن را با نام فایل انتخابی خود جایگزین کنید. سپس، می‌توانیم از متغیر سوپر گلوبال REQUEST_$ برای جمع‌آوری مقدار فیلد ورودی استفاده کنیم:
<html>
<body>

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    Name: <input type="text" name="fname">
    <input type="submit">
</form>

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    // collect value of input field
    $name = $_REQUEST['fname'];
    if (empty($name)) {
        echo "Name is empty";
    } else {
        echo $name;
    }
}
?>

</body>
</html>
flesh

Name:  

POST_$

متغیرهای سوپر گلوبال، متغیرهای داخلی هستند که همیشه در همه حوزه‌ها در دسترس هستند.
 
PHP $_POST یک متغیر سوپر گلوبال PHP است که برای جمع‌آوری داده‌های فرم پس از ارسال یک فرم HTML با روش = “post” استفاده می‌شود. $_POST همچنین به طور گسترده ای برای انتقال متغیرها استفاده می شود.
مثال زیر فرمی را با فیلد ورودی و دکمه ارسال نشان می دهد. هنگامی که کاربر داده ها را با کلیک بر روی “ارسال” ارسال می کند، داده های فرم به فایل مشخص شده در ویژگی عملکرد تگ <form> ارسال می شود. در این مثال برای پردازش داده های فرم به خود فایل اشاره می کنیم. اگر می خواهید از فایل PHP دیگری برای پردازش داده های فرم استفاده کنید، آن را با نام فایل انتخابی خود جایگزین کنید. سپس، می‌توانیم از متغیر super global $_POST برای جمع‌آوری مقدار فیلد ورودی استفاده کنیم:
<html>
<body>

<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
  Name: <input type="text" name="fname">
  <input type="submit">
</form>

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
  // collect value of input field
  $name = $_POST['fname'];
  if (empty($name)) {
    echo "Name is empty";
  } else {
    echo $name;
  }
}
?>

</body>
</html>
flesh

Name:  

GET_$

متغیرهای سوپر گلوبال، متغیرهای داخلی هستند که همیشه در همه حوزه‌ها در دسترس هستند.
 
GET_$ یک متغیر سوپر گلوبال PHP است که برای جمع‌آوری داده‌های فرم پس از ارسال فرم HTML با متد=”get” استفاده می‌شود.
 
GET_$ همچنین می تواند داده های ارسال شده در URL را جمع آوری کند.
فرض کنید یک صفحه HTML داریم که حاوی یک لینک با پارامترهای زیر است:
<html>
<body>

<a href="test_get.php?subject=PHP&web=W3schools.com">Test $GET</a>

</body>
</html>
هنگامی که کاربر روی پیوند “Test $GET” کلیک می کند، پارامترهای “subject” و “web” به “test_get.php” ارسال می شوند و سپس می توانید با GET_$ به مقادیر آنها در “test_get.php” دسترسی پیدا کنید.
 
مثال زیر کد موجود در “test_get.php” را نشان می دهد:
<html>
<body>

<?php
echo "Study " . $_GET['subject'] . " at " . $_GET['web'];
?>

</body>
</html>

۲۱. عبارات با قاعده

عبارات با قاعده (regular expression) یا به اختصار رجکس، دنباله ای از کاراکترها است که با الگوی مشخص مطابقت دارد. وقتی داده‌ها را در یک متن جستجو می‌کنید، می‌توانید از این الگوی جستجو برای توصیف آن استفاده کنید.
 
یک عبارت با قاعده می تواند یک کاراکتر واحد یا یک الگوی پیچیده تر باشد.
 
از عبارات منظم می توان برای انجام انواع عملیات جستجوی متن و جایگزینی متن استفاده کرد.
 

سینتکس:

در PHP، عبارات منظم رشته‌هایی هستند که از جداکننده‌ها، یک الگو و اصلاح‌کننده‌های اختیاری تشکیل شده‌اند.
$exp = "/raiatec/i";
در مثال بالا، سه قسمت وجود دارد:
 
 
   /             جداکننده ( delimiter ) است،
raiatec   الگویی ( pattern ) است که جستجو می‌شود، و
    i          اصلاح‌کننده‌ ( modifier )  است که جستجو را به حروف بزرگ و کوچک حساس می‌کند.
 
  • جداکننده ( delimiter ) می تواند هر کاراکتری باشد بجز حرف، عدد، بک اسلش و فاصله.  متداول ترین جداکننده، اسلش (/) است، اما زمانی که الگوی شما حاوی اسلش است، از جداکننده های دیگر مانند # یا ~ استفاده می شود.

توابع عبارات با قاعده

PHP توابع مختلفی را ارائه می دهد که به شما امکان می دهد از عبارات منظم استفاده کنید. توابع preg_match()، preg_match_all() و ()preg_replace برخی از متداول ترین آنها هستند:
تابع شرح
()preg_match
اگر الگو در رشته پیدا شد 1 و در غیر این صورت 0 برمی گرداند
()preg_match_all
تعداد دفعاتی که الگو در رشته پیدا شده است را برمی‌گرداند که ممکن است 0 نیز باشد
()preg_replace
یک رشته جدید را برمی‌گرداند که در آن الگوهای همسان با رشته دیگری جایگزین شده‌اند

()preg_match

تابع ()preg_match به شما می گوید که آیا یک رشته دارای مطابقت های یک الگو است یا خیر.
مثال:
از یک regular expression ( رجکس ) برای انجام جستجوی غیر حساس به حروف بزرگ برای “raiatec” در یک رشته استفاده کنید:
<?php
$str = "Visit Raiatec";
$pattern = "/raiatec/i";
echo preg_match($pattern, $str); // Outputs 1
?>
flesh

1

()preg_match_all

تابع ()preg_match_all به شما می گوید که چه تعداد مطابق برای یک الگو در یک رشته پیدا شده است.

مثال:

از یک رجکس برای انجام شمارش غیرحساس به حروف بزرگ جهت شمارش تعداد دفعات “ain” در یک رشته استفاده کنید:
<?php

$str = "The rain in SPAIN falls mainly on the plains.";
$pattern = "/ain/i";
echo preg_match_all($pattern, $str);

?>
flesh

4

()preg_replace

تابع ()preg_replace تمام مطابقت های الگوی یک رشته را با رشته دیگری جایگزین می کند.

مثال:

برای جایگزینی مایکروسافت با W3Schools در یک رشته از یک رجکس غیر حساس به حروف کوچک و بزرگ استفاده کنید:
<?php

$str = "Visit Microsoft!";
$pattern = "/microsoft/i";
echo preg_replace($pattern, "W3Schools", $str);

?>
flesh

Visit W3Schools!

اصلاح کننده ها ( Modifiers ) در عبارات باقاعده

اصلاح‌کننده‌ها می‌توانند نحوه انجام جستجو را تغییر دهند.
Modifiers شرح
i
جستجوی غیر حساس به حروف بزرگ را انجام می دهد
m
جستجوی چند خطی را انجام می دهد (الگوهایی که ابتدا یا انتهای یک رشته را جستجو می کنند با ابتدا یا انتهای هر خط مطابقت دارند)
u
تطابق صحیح الگوهای رمزگذاری شده UTF-8 را فعال می کند

الگوهای عبارات باقاعده

از براکت ها برای یافتن طیف وسیعی از کاراکترها استفاده می شود:
عبارت شرح
[abc]
یک کاراکتر از گزینه های بین پرانتز را پیدا می کند
[^abc]
هر کاراکتری را که بین پرانتزها نباشد را پیدا می کند
[0-9]
یک کاراکتر از محدوده 0 تا 9 را پیدا می کند

متا کاراکترها

متاکاراکترها کاراکترهایی با معنای خاص هستند:
متا کاراکتر شرح
|
برای هر یک از الگوهای جدا شده با | مطابقت پیدا می کند مانند: گربه|سگ|ماهی
.
فقط یک نمونه از هر کاراکتر را پیدا می کند
^
مطابقت را به عنوان ابتدای یک رشته پیدا می کند مانند: Hello^
$
مطابقت را در انتهای رشته پیدا می کند مانند: $World
d\
یک رقم پیدا می کند
s\
یک کاراکتر فضای خالی پیدا می کند
b\
یک مطابقت در ابتدای کلمه ای مانند این پیدا می کند: bWORD\ یا در انتهای کلمه ای مانند این: WORD\b
uxxxx\
کاراکتر یونیکد مشخص شده با عدد هگزادسیمال xxxx را پیدا می کند

شمارشگرها ( Quantifiers )

برای سنجش تعداد از شمارشگرها استفاده می شود.

شمارشگر شرح
+n
با هر رشته ای که حداقل یک n داشته باشد مطابقت دارد
*n
با هر رشته ای که حاوی صفر یا بیشتر از n باشد مطابقت دارد
?n
با هر رشته ای که شامل صفر یا یک وقوع n باشد مطابقت دارد
n{x}
با هر رشته ای که دارای دنباله ای از X n است مطابقت دارد
n{x,y}
هر رشته ای را که حاوی دنباله ای از X تا Y n باشد مطابقت می دهد
n{x,}
با هر رشته ای که دارای دنباله ای از حداقل X n باشد مطابقت دارد

توجه: اگر عبارت شما نیاز به جستجوی یکی از کاراکترهای خاص دارد، می‌توانید از بک اسلش ( \ ) برای فرار از آنها استفاده کنید. به عنوان مثال، برای جستجوی یک یا چند علامت سوال می توانید از عبارت زیر استفاده کنید:  ‘/+?\/’ = pattern$

گروه بندی

می‌توانید از پرانتز ( ) برای اعمال کمیت‌نماها به کل الگوها استفاده کنید. همچنین می توان از آنها برای انتخاب قسمت هایی از الگوی مورد استفاده به عنوان یک مطابقت استفاده کرد.
 
مثال:
از گروه بندی برای جستجوی کلمه “banana” با جستجوی ba به دنبال دو نمونه na استفاده کنید:
<?php

$str = "Apples and bananas.";
$pattern = "/ba(na){2}/i";
echo preg_match($pattern, $str);

?>
flesh

1

۲۲. فرمها در PHP

سوپر گلوبال های GET_$ و POST_$ برای جمع آوری داده های فرم استفاده می شود.

ایجاد یک فرم ساده HTML

مثال زیر یک فرم ساده HTML با دو فیلد ورودی و یک دکمه ارسال را نمایش می دهد:
<!DOCTYPE HTML>
<html>  
<body>

<form action="welcome.php" method="post">
Name: <input type="text" name="نام"><br>
E-mail: <input type="text" name="ایمیل"><br>
<input type="ارسال">
</form>

</body>
</html>
flesh

Name:
 Email:

هنگامی که کاربر فرم بالا را پر می کند و روی دکمه Submit کلیک می کند، داده های فرم برای پردازش به فایل PHP به نام “welcome.php” ارسال می شود. داده های فرم با روش HTTP POST ارسال می شود.
 
برای نمایش داده های ارسالی، می توانید همه متغیرها را به خروجی بفرستید. “welcome.php” به شکل زیر است:
<html>
<body>

Welcome <?php echo $_POST["name"]; ?><br>
Your email address is: <?php echo $_POST["email"]; ?>

</body>
</html>
خروجی می تواند چیزی شبیه به این باشد:
Welcome John
Your email address is john.doe@example.com
همین نتیجه را می توان با استفاده از روش HTTP GET نیز به دست آورد:
<!DOCTYPE HTML>
<html>  
<body>

<form action="welcome_get.php" method="get">
Name: <input type="text" name="name"><br>
E-mail: <input type="text" name="email"><br>
<input type="submit">
</form>

</body>
</html>
flesh

Name: 
E-mail: 

و “welcome_get.php” به شکل زیر است:
<html>
<body>

Welcome <?php echo $_GET["name"]; ?><br>
Your email address is: <?php echo $_GET["email"]; ?>

</body>
</html>
کد بالا بسیار ساده است. با این حال، مهمترین چیز از قلم افتاده است. برای محافظت از اسکریپت خود در برابر کدهای مخرب باید داده های فرم را تأیید کنید.

نکته: هنگام پردازش فرم های PHP به امنیت فکر کنید!
کد بالا حاوی هیچ گونه اعتبارسنجی فرم نیست، فقط نشان می دهد که چگونه می توانید داده های فرم را ارسال و بازیابی کنید.
در ادامه نحوه پردازش فرم های PHP با در نظر گرفتن امنیت را بررسی می کنیم. اعتبارسنجی صحیح داده های فرم برای محافظت از فرم شما در برابر هکرها و هرزنامه ها مهم است!

مقایسه GET و POST

هم GET و هم POST یک آرایه ایجاد می کنند (به عنوان مثال آرایه:
(
key1 => value1
key2 => value2
key3 => value3
).
این آرایه جفت‌های کلید/مقدار را نگه می‌دارد. کلیدها نام کنترل‌های فرم و مقادیر داده‌های ورودی کاربر هستند.
 
هم GET و هم POST به عنوان GET_$ و POST_$ در نظر گرفته می شوند. یعنی superglobal بوده و همیشه بدون توجه به حوزه قابل دسترسی هستند و شما می توانید از هر تابع، کلاس یا فایلی بدون نیاز به انجام کار خاصی به آنها دسترسی داشته باشید.
 
GET_$ آرایه ای از متغیرها است که از طریق پارامترهای URL به اسکریپت فعلی ارسال می شود.
 
POST_$ آرایه ای از متغیرها است که از طریق روش HTTP POST به اسکریپت فعلی ارسال می شود.

چه زمانی از GET استفاده کنیم؟

اطلاعات ارسال شده از فرم با متد GET برای همه قابل مشاهده است (همه نام ها و مقادیر متغیرها در URL نمایش داده می شوند). همچنین GET محدودیت هایی در میزان ارسال اطلاعات دارد. محدودیت حدود 2000 کاراکتر است. با این حال، به دلیل اینکه متغیرها در URL نمایش داده می شوند، می توان صفحه را bookmark کرد.
 
GET می تواند برای ارسال داده های غیر حساس استفاده شود.
 
توجه: GET هرگز نباید برای ارسال رمز عبور یا سایر اطلاعات حساس استفاده شود!

چه زمانی از POST استفاده کنیم؟

اطلاعات ارسال شده از فرم با متد POST برای دیگران نامرئی است (همه نام ها/مقادیر در بدنه درخواست HTTP تعبیه شده است) و محدودیتی در میزان اطلاعات ارسالی ندارد.
 
علاوه بر این POST از عملکردهای پیشرفته مانند پشتیبانی از ورودی باینری چند قسمتی در هنگام آپلود فایل ها به سرور پشتیبانی می کند.
با این حال، به دلیل اینکه متغیرها در URL نمایش داده نمی شوند، امکان bookmark کردن صفحه وجود ندارد.

نکته: توسعه دهندگان POST را برای ارسال داده های فرم ترجیح می دهند.

در مرحله بعد، بررسی می کنیم که چگونه می توانیم فرم های PHP را به روش ایمن پردازش کنیم!

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

در این قسمت و قسمت های بعدی نحوه استفاده از PHP برای اعتبارسنجی داده های فرم را بررسی می کنیم.
فرم HTML که در این فصل ها روی آن کار خواهیم کرد، شامل فیلدهای ورودی مختلف است: فیلدهای متنی ضروری و اختیاری، دکمه های رادیویی و یک دکمه ارسال:

مثال اعتبارسنجی فرم:

* required field

Name:  *

E-mail:  *

Website: 

Comment: 

Gender: Female Male Other *

 

Your Input:

قوانین اعتبار سنجی فرم فوق به شرح زیر است:
فیلد قوانین اعتبارسنجی
Name
ضروری.  فقط باید شامل حروف و فضای خالی باشد
E-mail
ضروری.  باید دارای یک آدرس ایمیل معتبر (با @ و .) باشد.
Website
اختیاری. در صورت وجود، باید دارای یک URL معتبر باشد
Comment
اختیاری. فیلد ورودی چند خطی (textarea)
Gender
ضروری. باید جنسیت را انتخاب کرد
ابتدا به کد HTML ساده برای فرم نگاه می کنیم:
فیلدهای متنی
فیلدهای نام، ایمیل و وب سایت عناصر ورودی متن هستند و فیلد Comment یک ناحیه متنی است. کد HTML به شکل زیر است:
Name: <input type="text" name="name">
E-mail: <input type="text" name="email">
Website: <input type="text" name="website">
Comment: <textarea name="comment" rows="5" cols="40"></textarea>
دکمه های رادیویی
فیلدهای جنسیت دکمه های رادیویی هستند و کد HTML به شکل زیر است:
Gender:
<input type="radio" name="gender" value="female">Female
<input type="radio" name="gender" value="male">Male
<input type="radio" name="gender" value="other">Other
المان فرم
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
هنگامی که فرم ارسال می شود، داده های فرم با روش = “post” ارسال می شود.

متغیر SERVER[“PHP_SELF”]_$ چیست؟
SERVER[“PHP_SELF”]_$ یک متغیر سوپر گلوبال است که نام فایل اسکریپت در حال اجرا را برمی گرداند.

بنابراین، SERVER[“PHP_SELF”]_$ به جای پرش به صفحه دیگری، داده های فرم ارسال شده را به خود صفحه ارسال می کند. به این ترتیب کاربر در همان صفحه فرم پیغام خطا دریافت می کند.

تابع ()htmlspecialchars چیست؟
تابع ()htmlspecialchars کاراکترهای خاص را به موجودیت های HTML تبدیل می کند. این بدان معنی است که کاراکترهای HTML مانند < و > را با < و > جایگزین می کند. این مانع از سوء استفاده مهاجمان از کد با تزریق کد HTML یا Javascript (حملات Cross-site Scripting) در فرم ها می شود.

نکته مهم در مورد امنیت فرم PHP

متغیر SERVER[“PHP_SELF”]_$ می تواند توسط هکرها استفاده شود!
 
اگر از PHP_SELF در صفحه شما استفاده می شود، کاربر می تواند یک اسلش (/) و سپس چند دستور Cross Site Scripting (XSS) را برای اجرا وارد کند.

نکته: برنامه نویسی متقابل سایت (XSS) نوعی آسیب پذیری امنیتی رایانه است که معمولاً در برنامه های کاربردی وب یافت می شود. XSS مهاجمان را قادر می سازد تا اسکریپت سمت سرویس گیرنده را به صفحات وب که توسط سایر کاربران مشاهده می شود تزریق کنند.

فرض کنید فرم زیر را در صفحه ای به نام “test_form.php” داریم:
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
اکنون، اگر کاربر URL معمولی را در نوار آدرس مانند “http://www.example.com/test_form.php” وارد کند، کد بالا به این صورت ترجمه می شود:
<form method="post" action="test_form.php">
تا اینجای کار خیلی خوبه.
با این حال، در نظر بگیرید که یک کاربر URL زیر را در نوار آدرس وارد می کند:
http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
در این صورت کد بالا به صورت زیر ترجمه می شود:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>
این کد یک تگ اسکریپت و یک فرمان هشدار اضافه می کند. و هنگامی که صفحه بارگذاری می شود، کد جاوا اسکریپت اجرا می شود (کاربر یک جعبه هشدار را مشاهده می کند). این فقط یک مثال ساده و بی ضرر است که چگونه می توان از متغیر PHP_SELF سوء استفاده کرد.
 
توجه داشته باشید که هر کد جاوا اسکریپت را می توان در تگ <script> اضافه کرد! یک هکر می‌تواند کاربر را به فایلی در سرور دیگری هدایت کند، و آن فایل می‌تواند کد مخربی را در خود نگه دارد که می‌تواند متغیرهای سراسری را تغییر دهد یا فرم را به آدرس دیگری ارسال کند تا داده‌های کاربر را ذخیره نماید.

چگونه از سوء استفاده‌های SERVER[“PHP_SELF”]_$ جلوگیری کنیم؟

با استفاده از تابع ()htmlspecialchars می توان از سوء استفاده های SERVER[“PHP_SELF”]_$ اجتناب کرد.
 
کد فرم باید به شکل زیر باشد:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
تابع ()htmlspecialchars کاراکترهای خاص را به موجودیت های HTML تبدیل می کند. حال اگر کاربر سعی کند از متغیر PHP_SELF سوء استفاده کند، خروجی زیر را به همراه خواهد داشت:
<form method="post" action="test_form.php/&quot;&gt;&lt;script&gt;alert('hacked')&lt;/script&gt;">
تلاش برای سوء استفاده شکست می خورد و هیچ آسیبی وارد نمی شود!

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

اولین کاری که انجام می دهیم این است که همه متغیرها را از طریق تابع htmlspecialchars() PHP پاس دهیم.
 
وقتی از تابع ()htmlspecialchars استفاده می کنیم، اگر کاربر سعی کند موارد زیر را در یک فیلد متنی ارسال کند:
<script>location.href('http://www.hacked.com')</script>
– این کد اجرا نمی شود، زیرا به عنوان کد فرار (escaped)  از HTML ذخیره می شود، مانند این:
&lt;script&gt;location.href('http://www.hacked.com')&lt;/script&gt;
اکنون کد برای نمایش در یک صفحه یا داخل یک ایمیل امن است.
 
همچنین زمانی که کاربر فرم را ارسال کرد، دو کار دیگر نیز باید انجام داد:
 
  1. کاراکترهای غیر ضروری (فضای اضافی، تب، خط جدید) را از داده های ورودی کاربر حذف کنید (با تابع PHP trim())
  2. حذف بک اسلش (\) از داده های ورودی کاربر (با تابع PHP stripslashes())
مرحله بعدی ایجاد تابعی است که تمام بررسی ها را برای ما انجام می دهد (که بسیار راحت تر از نوشتن یک کد یکسان است).
 
نام تابع را ()test_input  می گذاریم.
اکنون می‌توانیم هر متغیر POST_$ را با تابع ()test_input بررسی کنیم و اسکریپت به شکل زیر است:
<!DOCTYPE HTML>  
<html>
<head>
</head>
<body>  

<?php
// define variables and set to empty values
$name = $email = $gender = $comment = $website = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  $name = test_input($_POST["name"]);
  $email = test_input($_POST["email"]);
  $website = test_input($_POST["website"]);
  $comment = test_input($_POST["comment"]);
  $gender = test_input($_POST["gender"]);
}

function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
?>

<h2>PHP Form Validation Example</h2>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">  
  Name: <input type="text" name="name">
  <br><br>
  E-mail: <input type="text" name="email">
  <br><br>
  Website: <input type="text" name="website">
  <br><br>
  Comment: <textarea name="comment" rows="5" cols="40"></textarea>
  <br><br>
  Gender:
  <input type="radio" name="gender" value="female">Female
  <input type="radio" name="gender" value="male">Male
  <input type="radio" name="gender" value="other">Other
  <br><br>
  <input type="submit" name="submit" value="Submit">  
</form>

<?php
echo "<h2>Your Input:</h2>";
echo $name;
echo "<br>";
echo $email;
echo "<br>";
echo $website;
echo "<br>";
echo $comment;
echo "<br>";
echo $gender;
?>

</body>
</html>

flesh

مثال اعتبار سنجی فرم PHP

 
Name: 

E-mail: 

Website: 

Comment: 

Gender: Female Male Other

 

Your Input:

توجه داشته باشید که در ابتدای اسکریپت، بررسی می‌کنیم که آیا فرم با استفاده از SERVER[“REQUEST_METHOD”]_$ ارسال شده است یا خیر. اگر REQUEST_METHOD POST باشد، فرم ارسال شده است – و باید اعتبارسنجی شود. اگر ارسال نشده است، از تأیید اعتبار رد شده و یک فرم خالی نمایش می دهد.
 
با این حال، در مثال بالا، تمام فیلدهای ورودی اختیاری هستند. اسکریپت به خوبی کار می کند حتی اگر کاربر هیچ داده ای را وارد نکند.
مرحله بعدی این است که فیلدهای ورودی را ضروری (required) قرار دهید و در صورت نیاز پیام های خطا ایجاد کنید.
 

فیلدهای ضروری (required)

از جدول قوانین اعتبارسنجی صفحه قبل می بینیم که فیلدهای “Name”، “E-mail” و “Gender” الزامی هستند. این فیلدها نمی توانند خالی باشند و باید در فرم HTML پر شوند.
فیلد قوانین اعتبارسنجی
Name
ضروری.  فقط باید شامل حروف و فضای خالی باشد
E-mail
ضروری.  باید دارای یک آدرس ایمیل معتبر (با @ و .) باشد.
Website
اختیاری. در صورت وجود، باید دارای یک URL معتبر باشد
Comment
اختیاری. فیلد ورودی چند خطی (textarea)
Gender
ضروری. باید جنسیت را انتخاب کرد
در قسمت قبل، تمام فیلدهای ورودی اختیاری بودند.
 
در کد زیر چند متغیر جدید اضافه کرده‌ایم: nameErr، $emailErr، $genderErr$، و websiteErr$. این متغیرهای خطا پیام های خطا را برای فیلدهای مورد نیاز نگه می دارند. ما همچنین برای هر متغیر POST_$ یک عبارت if else اضافه کرده ایم. این بررسی می‌کند که آیا متغیر POST_$ خالی است یا نه (با تابع ()PHP vala). اگر خالی باشد، یک پیام خطا در متغیرهای خطای مختلف ذخیره می‌شود و اگر خالی نباشد، داده‌های ورودی کاربر را از طریق تابع ()test_input ارسال می‌کند:
<?php

// define variables and set to empty values
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  if (empty($_POST["name"])) {
    $nameErr = "Name is required";
  } else {
    $name = test_input($_POST["name"]);
  }

  if (empty($_POST["email"])) {
    $emailErr = "Email is required";
  } else {
    $email = test_input($_POST["email"]);
  }

  if (empty($_POST["website"])) {
    $website = "";
  } else {
    $website = test_input($_POST["website"]);
  }

  if (empty($_POST["comment"])) {
    $comment = "";
  } else {
    $comment = test_input($_POST["comment"]);
  }

  if (empty($_POST["gender"])) {
    $genderErr = "Gender is required";
  } else {
    $gender = test_input($_POST["gender"]);
  }
}

?>
مرحله بعدی اعتبارسنجی داده های ورودی است، یعنی «آیا فیلد نام فقط شامل حروف و فضای خالی است؟» و «آیا فیلد ایمیل حاوی یک نحو آدرس ایمیل معتبر است؟» و اگر پر شود، « آیا فیلد وب سایت حاوی یک URL معتبر است؟».

اعتبارسنجی نام ، ایمیل و URL

در این قسمت نحوه تأیید اعتبار نام ها، ایمیل ها و URL ها را بررسی می کنیم.
 

اعتبارسنجی نام

کد زیر یک راه ساده برای بررسی اینکه آیا فیلد نام فقط شامل حروف، خط تیره، آپستروف و فضاهای سفید است را نشان می دهد.
اگر مقدار فیلد نام معتبر نیست، یک پیام خطا ذخیره کنید:
$name = test_input($_POST["name"]);
if (!preg_match("/^[a-zA-Z-' ]*$/",$name)) {
  $nameErr = "Only letters and white space allowed";
}

نکته: تابع ()preg_match یک رشته را برای الگو جستجو می کند، اگر الگو وجود داشته باشد true و در غیر این صورت false را برمی گرداند.

اعتبارسنجی ایمیل

ساده ترین و ایمن ترین راه برای بررسی درست بودن آدرس ایمیل، استفاده از تابع filter_var() است.
 
مثال:
کد زیر، اگر آدرس ایمیل درست نباشد، یک پیام خطا ذخیره می کند:
$email = test_input($_POST["email"]);
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
  $emailErr = "Invalid email format";
}

اعتبارسنجی URL

کد زیر روشی را برای بررسی اینکه آیا سینتکس آدرس URL معتبر است نشان می دهد ( این رجکس همچنین به خط تیره در URL اجازه می دهد ). اگر سینتکس آدرس URL معتبر نباشد، یک پیام خطا ذخیره می کند:
$website = test_input($_POST["website"]);
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) {
  $websiteErr = "Invalid URL";
}

مثال از اعتبارسنجی Name , Email و URL

حال، اسکریپت به شکل زیر است:
<?php

// define variables and set to empty values
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  if (empty($_POST["name"])) {
    $nameErr = "Name is required";
  } else {
    $name = test_input($_POST["name"]);
    // check if name only contains letters and whitespace
    if (!preg_match("/^[a-zA-Z-' ]*$/",$name)) {
      $nameErr = "Only letters and white space allowed";
    }
  }

  if (empty($_POST["email"])) {
    $emailErr = "Email is required";
  } else {
    $email = test_input($_POST["email"]);
    // check if e-mail address is well-formed
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
      $emailErr = "Invalid email format";
    }
  }

  if (empty($_POST["website"])) {
    $website = "";
  } else {
    $website = test_input($_POST["website"]);
    // check if URL address syntax is valid (this regular expression also allows dashes in the URL)
    if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) {
      $websiteErr = "Invalid URL";
    }
  }

  if (empty($_POST["comment"])) {
    $comment = "";
  } else {
    $comment = test_input($_POST["comment"]);
  }

  if (empty($_POST["gender"])) {
    $genderErr = "Gender is required";
  } else {
    $gender = test_input($_POST["gender"]);
  }
}

?>
flesh

PHP Form Validation Example

* required field

Name:  *

E-mail:  *

Website: 

Comment: 

Gender: Female Male Other *

 

Your Input:

گام بعدی نشان دادن نحوه جلوگیری از خالی شدن تمام فیلدهای ورودی فرم هنگام ارسال فرم توسط کاربر است.

حفظ مقادیر در فیلدهای ورودی

در این قسمت نحوه حفظ مقادیر در فیلدهای ورودی را هنگامی که کاربر دکمه ارسال را فشار می دهد، نشان می دهد.
 
برای نشان دادن مقادیر در فیلدهای ورودی پس از زدن دکمه ارسال توسط کاربر، ما یک اسکریپت PHP کوچک را در ویژگی مقدار فیلدهای ورودی زیر اضافه می کنیم: نام، ایمیل و وب سایت. در قسمت نظر textarea، اسکریپت را بین تگ‌های <textarea> و </textarea> قرار می‌دهیم. اسکریپت زیر مقدار متغیرهای:
 
name$ 
email$ 
website$
و
comment$
 
را خروجی می‌دهد.
 
سپس، ما همچنین باید نشان دهیم که کدام دکمه رادیویی بررسی شده است. برای این کار، ما باید ویژگی checked (نه ویژگی مقدار برای دکمه‌های رادیویی) را تغییر می دهیم:
Name: <input type="text" name="name" value="<?php echo $name;?>">

E-mail: <input type="text" name="email" value="<?php echo $email;?>">

Website: <input type="text" name="website" value="<?php echo $website;?>">

Comment: <textarea name="comment" rows="5" cols="40"><?php echo $comment;?></textarea>

Gender:
<input type="radio" name="gender"
<?php if (isset($gender) && $gender=="female") echo "checked";?>
value="female">Female
<input type="radio" name="gender"
<?php if (isset($gender) && $gender=="male") echo "checked";?>
value="male">Male
<input type="radio" name="gender"
<?php if (isset($gender) && $gender=="other") echo "checked";?>
value="other">Other

نمونه فرم کامل

 

* required field

Name:  *

E-mail:  *

Website: 

Comment: 

Gender: Female Male Other *

 

Your Input:

منبع:

w3schools.com