اعتبارسنجی فرم در PHP
در این بیاموز و همچنین بیاموز بعدی، نحوه ی اعتبارسنجی داده های فرم با استفاده از PHP آموزش داده خواهد شد.
اعتبارسنجی فرم در PHP
زمان پردازش فرم های PHP، به امنیت بیاندیشید! در این بیاموز نحوه ی پردازش فرم های PHP بصورتی که حداقل موارد امنیتی که در ذهن دارید حفظ شود، نشان داده خواهد شد. اعتبار سنجی مناسب اطلاعات فرم، بمنظور جلوگیری از حمله هکرها دارای اهمیت است. |
فرم HTMLی که در این بیاموز روی آن کار خواهیم کرد شامل فیلدهای مختلفی است: فیلدهای متنی الزامی و اختیاری، radio button و یک دکمه submit:
در جدول زیر قوانین اعتبارسنجی ذکر شده است:
فیلد | قوانین اعتبارسنجی |
---|---|
نام | الزامی است. فقط باید شامل حروف الفبا و خط فاصله باشد. |
ایمیل | الزامی است. باید شامل فرمت صحیح ایمیل باشد (همراه با علامت @ و .) |
وب سایت | اختیاری است. اگر پر شد، باید شامل فرمت صحیح URL باشد. |
توضیحات | اختیاری است. می تواند شامل چند خط متن باشد (textarea) |
جنسیت | الزامی است. یکی از دو مورد باید انتخاب شود. |
اجازه دهید تا در ابتدا نگاهی به کد HTML فرم بیاندازیم.
فیلدهای متنی
برای فیلدهای متنی "نام"، "ایمیل" و "وب سایت" از عنصر متنی <input> و برای فیلد "توضیحات" از عنصر <textarea> استفاه می کنیم:
ایمیل: <input type="text" name="email">
وب سایت: <input type="text" name="website">
توضیحات: <textarea name="comment" rows="5" cols="40"></textarea>
فیلد "جنسیت"
برای فیلد "جنسیت" از Radio Button استفاده می کنیم: (عنصر <input> از نوع radio)
<input type="radio" name="gender" value="female">Female
<input type="radio" name="gender" value="male">Male
عنصر <form>
کد HTML فرم شبیه زیر است:
زمانی که روی دکمه submit کلیک می شود، اطلاعات با متد "post" به سرور ارسال می شود.
متغییر SERVER_$ متغییر SERVER_$ یکی از متغییرهای عمومی از پیش تعریف شده است (آرایه). "PHP_SELF" نام فایلِ اسکریبت جاری را برمی گرداند. |
بنابراین زمانی که کاربر روی دکمه submit کلیک می کند، بجای اینکه داده ها به یک فایل متفاوت دیگر ارسال شود به خودش ارسال خواهد شد. در این روش، کاربر خطاها را در همان صفحه ای که فرم وجود دارد مشاهده خواهد کرد.
تابع ()htmlspecialchars با استفاده از تابع ()htmlspecialchars، می توان کاراکترهای خاص را به HTML entity تبدیل نمود. منظور این است که کاراکترهایی مثل علامت کوچکتر(<) و بزرگتر(>) در پارامتر ورودی را به ;lt$ و ;gt$ تبدیل می کند. با این کار از حمله ی هکرهایی که می خواهند از طریق تزریق HTML یا JavaScript اخلال ایجاد کنند، جلوگیری می شود. |
یک تذکر مهم درباره امنیت فرم PHP
PHP_SELF می تواند توسط هکرها مورد استفاده قرار گیرد.
یک هکر می تواند در آدرس بار مرورگرش بعد از آدرس فایل، یک اسلش (/) قرار دهد و سپس دستورات XSS را برای اجرا تایپ کند.
XSS یا Cross-site scripting دلیل به وجود آمدن این آسیب پذیری عدم اعتبارسنجی ورودیهای کاربر می باشد، و مهاجم می تواند با تزریق اسکریپتهای مخرب در سایت از این آسیب پذیری سو استفاده کند. |
فرض کنید، فرم زیر را در یک فایل بنام "test_form.php" داریم:
حالا اگر یک کاربر در آدرس بار مرورگرش "http://www.example.com/test_form.php" را وارد کند، کد بالا بصورت زیر ترجمه خواهد شد:
خوب تا اینجا همه چیز خوب است.
اما درنظر بگیرید که کاربری URL زیر را در آدرس بار وارد کند:
در این صورت کد بالا بصورت زیر ترجمه خواهد شد:
دومین URL، باعث اضافه شدن تگ <script> و یک دستور alert در بین کدهای ما شده است. و زمانی که صفحه لود می شود، کد JavaScript اجرا می شود (کاربر یک جعبه پیغام خواهد دید). این فقط یک مثال ساده و بی ضرر است که نحوه هک کردن متغییر PHP_SELF را نشان می دهد.
توجه داشته باشید که هر کد JavaScript دیگری را می توان در تگ <script> قرار داد...! یک هکر می تواند کاربر را به یک فایل دیگر روی سروری دیگر redirect کند، و از طریق آن فایل، اطلاعات کاربر را ذخیره کند.
نحوه مقابله با هک از طریق"PHP_SELF"
با استفاده از تابع ()htmlspecialchars، می توان با هک از طریق "PHP_SELF" مقابله نمود.
کد آن شبیه زیر است:
تابع ()htmlspecialchars، کاراکترهای خاص را به HTML entity تبدیل می کند. حالا اگر کاربر بخواهد از متغییر "PHP_SELF" سوء استفاده کند، با نتیجه زیر روبرو خواهد شد:
و از این طریق هیچ آسیبی وارد نخواهد شد...!
اعتبارسنجی داده های فرم با PHP
اولین کاری که باید انجام دهید این است که تمام متغییرها را به تابع ()htmlspecialchars پاس دهیم.
حالا اگر کاربر تلاش کند که متنی مانند زیر را ارسال کند:
<script>location.href('http://www.hacked.com')</script>
در اینصورت اسکریپت بالا اجرا نخواهد شد، چونکه کاراکترهای خاص در متن بالا به HTML entity معادلاشان تبدیل شده اند:
<script>location.href('http://www.hacked.com')</script>
حالا این کد برای نمایش در یک صفحه یا داخل یک ایمیل، امن شده است.
همچنین ما دو کار دیگر را هنگام ارسال داده ها به سرور انجام می دهیم:
- با استفاده از تابع ()trim کاراکترهای غیرضروری (مثل: فاصله های اضافی، tab و خطوط خالی) را حذف می کنیم.
- با استفاده از تابع ()stripslashes، بک اسلش ها (\) را حذف می کنیم
گام بعدی، ایجاد یک تابع، برای انجام تمام کارهای بالاست (بجای اینکه کدهای مربوط به این قسمت را بارها و بارها بنویسیم، مناسب تر است که از یک تابع استفاده کنیم)
ما این تابع را ()test_input می نامیم.
حالا ما می توانیم به ازای هر متغییر POST_$ مقدار آنرا با تابع ()test_input چک کنیم و کد آن شبیه زیر است:
مثال (اعتبارسنجی فرم در PHP)
<html>
<head>
<style>
span{min-width: 200px;float: right;}
</style>
</head>
<body style="direction:rtl;">
<?php
$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</h2>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
<div><span>نام:</span><input type="text" name="name"></div>
<div><span>ایمیل:</span><input type="text" name="email"></div>
<div><span>وب سایت:</span><input type="text" name="website"></div>
<div><span>توضیحات:</span><textarea name="comment" rows="5" cols="40"></textarea>
</div>
<div><span>جنسیت:</span>
<input type="radio" name="gender" value="female">زن
<input type="radio" name="gender" value="male">مرد
</div>
</div><input type="submit" name="submit" value="ارسال اطلاعات"></div>
</form>
<?php
if (isset($name) || isset($email) || isset($gender) || isset($comment) || isset($website))
{
echo "<br /><h2>خروجی کدتان</h2>";
echo "نام :$name";
echo "<br />";
echo "ایمیل: $email";
echo "<br />";
echo "وب سایت: $website";
echo "<br />";
echo "توضیحات: $comment";
echo "<br />";
echo "جنسیت: $gender";
}
?>
</body>
</html>
خروجی کد بالا:
مثال اعتبارسنجی فرم ها در PHP
توجه داشته باشید که در ابتدای اسکریپت، با استفاده از متغییر "REQUEST_METHOD" نحوه ارسال داده های فرم را چک می کنیم. اگر نحوه ی ارسال داده های فرم، از طریق متد "POST" است، اطلاعات فرم پردازش خواهد شد وگرنه با یک صفحه خالی روبرو خواهیم شد.
توجه: برای بار اول که کاربر درخواست مشاهده فایل مثال بالا را به سرور ارسال می کند، بدلیل اینکه متد پیش فرض برای مشاهده صفحات از نوع get است، بنابراین شرط "$_SERVER["REQUEST_METHOD"] == "POST درست نخواهد بود و دستورات داخل شرط اجرا نخواهد شد. اما بعد از اینکه کاربر اطلاعات فرم را پر کرده و روی دکمه ارسال (submit) کلیک کرد، چون ویژگی method فرم را با مقدار "post" تنظیم کرده ایم، شرط ذکر شده درست خواهد بود و دستورات داخل آن اجرا خواهد شد.
اما در مثال بالا، تمام فیلدهای ورودی اختیاری است. حتی اگر کاربر هیچ کدام از فیلدها را پر نکند، اسکریپت بالا باز هم کار خواهد کرد.
در بیاموز بعدی برای فیلدهای الزامی، یک پیغام مناسب نمایش خواهیم داد.
برای مشاهده فیلم ها و آموزش های پروژه محور برنامه نویسی PHP کلیک کنید.
- نوشته شده توسط امیر پهلوان صادق
- بازدید: 42608
دیدگاهها
سلام خدمت سایت خوبتون .خسته نباشین.
ببخشید من وقتی تمام دستورات رو مو به مو اجرا می کنم یه همچین اروری میده:
Fatal error: cannot use isset() on the result of an Exppression(you can use "null!==express ion"insted)in ..... on line 76
خط 76 مربوط به خطی است که تابع isset() رو نوشتم!
ممنونم از سایت خوبتون.
سلام اگر کد مربوطه رو ارسال کرده بودید بهتر می شد راهنمایی کرد. اما با توجه به متن خطا احتمالا مشکل سینتکسی دارید ...!
ممکنه از تابع isset ببصورت زیر استفاده کرده باشید، که نیاز به بستن پرانتز در انتهای دستور هست:
isset($_POST['idPresented']
سلام و خسته نباشید
1- وقتی برای اعتبار سنجی فرم از htmlspecialchar s استفاده می کنیم که اطلاعات به جای ارسال به یک فایل به خود صفحه ارسال می شود.
2- فرض کنید شخصی اطلاعات خودش را برای ثبت نام در سایتی وارد کرده، دکمه Submit را می زند در این لحظه ادمین چطور میتونه به این اطلاعات دسترسی داشته باشه یا این اطلاعات در کجا ذخیره می شه؟
3- خصوصیت action فرم فقط زمانی کاربرد دارد که کاربر دکمه Submit را فشار دهد و اطلاعات فرم به فایلی که برای action تنظیم کرده ایم ارسال شود؟؟؟؟
سلام
1- خیر برداشت شما درست نیست ...! تابع ()htmlspecialch ars، کاراکترهای خاص را به HTML entity تبدیل می کند، یعنی ">" را به ";lt&" تبدیل خواهد کرد.
2 و 3: در مثال های بالا، خصوصیت action را بنحوی تنظیم نموده ایم که اطلاعات به خود صفحه جاری ارسال می شود و این کار را بخاطر افزایش نیافتن تعداد فایل ها انجام دادیم، همچنین این روش به ما کمک می کند تا مطالب را برای کسانی که تازه کار هستند بهتر ارائه کنیم. بنابراین در پروژه های واقعی سعی می کنیم خصوصیت action را به نحوی تنظیم کنیم که اطلاعات فرم به یک فایل دیگر ارسال شود.
در مورد مثال آخر ؛ چجوری php قبل ار ابنکه تگ های html مربوطه تعریف بشه، ما با گذاشتن یک شرط مثلا if میتونیم مقدارش input رو بگیریم! "درحالی که شرط if ما قبل از تگ input قرار گرفته!" ؟
و سوال دیگه، چرا وقتی فانکشنمون رو در if بالاییش قرار میدیم، فانکشن کار نمیکنه؟
دقت کنید!
وقتی برای اولین بار فرم بالا میاد، شرط if کار نمیکنه. پس کاری بهش نداریم. کنترلها و فرم در صفحه ظاهر میشن. اکشن فرم همین صفحه هست، بنابراین وقتی فرم رو ارسال میکنیم، دوباره به همین صفحه بر میگردیم. با این تفاوت که فرم ارسال شده و مقادیر کنترلها از طریق متدی که در فرم مشخص شده (در اینجا post) پاس داده میشه.
اینجا شرط if درست میشه، بنابراین داخل if میشه و کارهای مربوطه رو انجام میده.
در اینجا شرط برابر این هست که اگر درخواست از طریق post بود، کار لازم رو انجام بده.
ممنون از توضیح و پاسختون واقعا همین که جوابگو هستین خیلی ارزشمند هست.
قضیه فانکشن رو نگفتید ! خط آخر
خواهش میکنم.
اگر به جواب قبلی خوب دقت کنید، میبینید که به این سوال هم به نوعی اشاره کردم.
فانکشن زمانی اجرا میشه که داخل شرط if بشه. وقتی که داخل شرط if نشیم، عملا کاری به تابع نداریم. بنابراین اجرا یا عدم اجراش فرقی نمیکنه.
در مورد تابع isset یه کم توضیح میدین؟!..مرسی.. .
با سلام.
این تابع چک میکنه که آیا متغیر موردنظر تعریف شده است یا خیر.
کاری به مقدار متغیر نداره، و فقط چک میکنه که تعریف شده باشه.
این نکته رو باید در نظر بگیرید.
اگه ممکنه بصورت چنتا نکته بهم بگید..سخته برام کد رو اینجوری بفرستم...من همه چیز رو هم رعایت کردم
مشکل از یه جایی تو کد شماست. اینطوری نمیشه دقیق راهنمایی کرد، اما اگ به صورت نکته وار بخوام بگم:
1) ببینید شما قصد ارسال یک فرم رو دارید. آدرس مقصد فرم میتونه همون آدرس یا یک آدرس دیگه در سایت باشه. این آدرس داخل خصوصیت action فرم نوشته میشه.
2) زمانی که شما فرم رو ارسال میکنید، با توجه به اینکه متد فرم چی بوده، اطلاعات باید در صفحه مقصد خونده بشه. (فرض میگیریم شما از متد POST_$ استفاده کردین.)
3) در آدرس مقصد اگه مقادیر ارسال شده باشند، توسط کد echo '<pre>' . print_r($_POST, true) . '</pre>'; //comment قابل مشاهده خواهند بود.
از اینجا به بعد میتونید مطمئن باشید که فرم شما درست ارسال شده. اگه این مرحله نشون داده نمیشه، مشکل رو باید از جای دیگه پیدا کرد...
با سلام
مشکل من اینه که وقتی اطلاعات رو سند میکنم..یه پیج دیگه برام باز نمیشه!
حتی توی خودش هم جواب نمیده..
جوابهایی که توی کادرها زدم رو توی آدرس بار مرورگر نشون میده!
چرا اینجوری میشه؟!
با سلام.
لطفا کد رو قرار بدید تا ببینم مشکل از کجاست.
به علامتهای > و < برای تگها دقت کنید. باید از عبارت :lt& برای > و ;gt& برای < استفاده کنید.
چرا از جاوا اسکریپت برای اعتبار سنجی استفاده نکنیم ایا استفاده از پی اچ پی بهتر است ؟
با سلام.
بهتر است برای اعتبارسنجی هم از جاوااسکریپت و هم از PHP استفاده کنیم. اما اگه بخوایم بین این دو اولویت قایل بشیم، اعتبارسنجی از طریق PHP از اهمیت خیلی بیشتری برخوردار هست.
دلیل این امر هم بر میگرده به ماهیت جاوااسکریپت و PHP.
جاوااسکریپت زبان سمت کلاینت هست. در واقع دادهها و اطلاعات در سمت کلاینت پردازش میشه. در این بین خیلی راحت میشه کدهای سمت جاوااسکریپت رو با استفاده از ابزارهایی مثل firebug و ... دور زد و یا حتی برخی مواقع نیاز به این ابزارها هم نیست و خیلی راحت میشه با تزریق یک اسکریپت در کد اعتبارسنجی از طریق جاوااسکریپت رو دور زد. وقتی هم که این اتفاق بیفته، میشه کدهای مخرب وارد سایت کرد و دیگه باقی ماجرا رو خودتون میتونید حدس بزنید.
اما PHP زبان سمت سرور هست. دادهها و اطلاعات در سمت سرور پردازش میشن. زمانی که شما در سمت سرور اعتبارسنجی رو انجام بدید، میتونید با استفاده از ابزارهای موردنیاز از تزریق کدها و دادههای مخرب جلوگیری کنید، حتی اگه کاربری اعتبارسنجی از طریق جاوااسکریپت رو دور زده باشه، تو اعتبارسنجی از طریق PHP گیر میفته.
بنابراین همیشه بهتر است اعتبارسنجی نهایی و اصولی رو در سمت سرور (PHP) انجام بدید. از اعتبارسنجی جاوااسکریپت برای زیبایی و عدم ارسال بیهوده اطلاعات به سرور استفاده کنید.
موفق باشید.
ممنون، آموزش اعتبار سنجی فرم عالی بود.
با سلام
آموزش اتون عالی بود.
ممنون عالی بود.
سلام!
من نظر رو کلا فارسی مینویسم که جاییش حذف نشه!
میخوام بدون نقش اچ تی ام ال اسپشیال چارس توی تابع تست اینپوت چیه؟ البته توضیحات رو خوندم! ولی چیزی که هست این قسمت درست کار نمیکنه!
البته توی کدی که شما نوشتید این مورد عمل میکنه! ولی نه توی سایت w3 و نه توی کدی که خودم مینویسم این قسمت کار نمیکنه و میتونم هر کاراکتری رو بنویسم مثل ;lt& .
اگه تو سایت w3 هم تست کنید میبینید!
سلام
تابع htmlspecialchar s کاراکترهای خاص را به معادل اچ تی ام ال آنها تبدیل می کند. مثلا کاراکتر علامت "کوچکتر از" را به معادل اچ تی ام ال آن که عبارت است از ;lt&، تبدیل می کند. با انجام این کار از ایجاد یک باگ به نام باگ xss جلوگیری میشه و هکرها نمی توانند به پایگاه داده از طریق فرم ، اطلاعات را تزریق کنند.
ممنون از توضیح شما! ولی من گفتم میدونم این تابع چکار میکنه! منتها در عمل اینکار نمیشه! شما میتونین توی سایت w3 بخش آموزش php قسمت Validation مثالشو ببینید و توی مثال name رو توش علامت کوچکتر بگذارید و مشاهده میکنید که علامت کوچکتر رو به به عنوان خروجی نشون میده!
خواهش می کنم
قسمت های قرمز رنگ رو در کد زیر مشاهده کنید، این قسمت ها رو اگه به کد اصلی اضافه کنید اونوقت همه چیز درست میشه:
<!DOCTYPE HTML>
<html>
<head>
<style>
.error {color: #FF0000;}
</style>
</head>
<body>
<?php
// define variables and set to empty values
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQU EST_METHOD"] == "POST") {
if (empty($_POST[" name"])) {
$nameErr = "Name is required";
} else {
$name = test_input($_PO ST["name"]);
// check if name only contains letters and whitespace
if (!preg_match("/ ^[a-zA-Z ]*$/",$name)) {
$nameErr = "Only letters and white space allowed";
$name ="";
}
}
if (empty($_POST[" email"])) {
$emailErr = "Email is required";
} else {
$email = test_input($_PO ST["email"]);
// check if e-mail address is well-formed
if (!filter_var($e mail, FILTER_VALIDATE _EMAIL)) {
$emailErr = "Invalid email format";
$email="";
}
}
if (empty($_POST[" website"])) {
$website = "";
} else {
$website = test_input($_PO ST["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";
$website="";
}
}
if (empty($_POST[" comment"])) {
$comment = "";
} else {
$comment = test_input($_PO ST["comment"]);
}
if (empty($_POST[" gender"])) {
$genderErr = "Gender is required";
} else {
$gender = test_input($_POST["gender"]);
$gender="";
}
}
function test_input($dat a) {
$data = trim($data);
$data = stripslashes($d ata);
$data = htmlspecialchar s($data);
return $data;
}
?>
<h2>PHP Form Validation Example</h2>
<p><span class="error"&g t;* required field.</span></p>
<form method="post" action="<?ph p echo htmlspecialchar s($_SERVER["PHP _SELF"]);?>" >
Name: <input type="text" name="name">
<span class="error"&g t;* <?php echo $nameErr;?>& lt;/span>
<br><b r>
E-mail: <input type="text" name="email"> ;
<span class="error"&g t;* <?php echo $emailErr;?> </span>
<br><b r>
Website: <input type="text" name="website"& gt;
<span class="error"&g t;<?php echo $websiteErr;?&g t;</span>
<br><b r>
Comment: <textarea name="comment" rows="5" cols="40">&l t;/textarea>
<br><b r>
Gender:
<input type="radio" name="gender" value="female"& gt;Female
<input type="radio" name="gender" value="male"> ;Male
<span class="error"&g t;* <?php echo $genderErr;?> ;</span>
<br><b r>
<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>
در واقع وقتی که یک error ایجاد میشه باید متغیر مربوطه رو خالی کرد...
اگه توضیحی نیاز بود همین جا اعلام کنید
با سلام خدمت شما و عرض خسته نباشید...
بابت مطالب واقعاااا ممنون واینکه سوالم اینه که آیا مطالب آموزش php با فصل شی گرایی بسته میشه یا نیاز به این است که بعد از یادگیری مطالب شما ,من باید به دنبال مطالب بیشتر باشم یا کار آموزش در شی گرایی به ٰاتمام می رسد؟؟؟؟
ممنون میشم اگه راهنمایی کنید
سلام
در آموزش PHP سایت بیاموز، از مقدماتی تا پیشرفته، مطالب گفته شده است، فقط دو تا پیشنهاد براتون دارم:
1- برای طراحی فرم ها و جداول اطلاعاتی می توانید از Kendo UI استفاده کنید، بنابراین پیشنهاد می کنم که حتماً فریم ورک Kendo UI را نیز مطالعه فرمایید. برای کسب اطلاعات بیشتر در مورد Kendo UI به لینک زیر مراجعه فرمایید:
beyamooz.com/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-kendo-ui
2- به سایت رسمی PHP یعنی www.php.net هم سر بزنید و با نحوه ی استفاده از آن کاملاً آشنا بشید، در آینده اگر پروژه ای را شروع کردید، مطمئن باشید که زیاد به سراغش می رید.
سلام ، توی این فرمی که درست کردین ، اگه بخواهیم از چند تا چک باکس استفاده کنیم ، کدش چه جوری میشه ؟
سلام، سوال خیلی خوبی رو پرسیدید...!
کنترل مورد نظر شما با نام "چک باکس لیست" معروف است و طریقه ساخت آن بصورت زیر است:
1- کد HTML چک باکس لیست:<input type="checkbox" name="fruit[]" value="apple" />
<input type="checkbox" name="fruit[]" value="grapefru it" />
همان طور که در مثال بالا مشاهده می کنید لیستی از میوه ها موجود است و قرار است کاربر از بین چند میوه مختلف، آنهایی که دوست دارد را انتخاب یا تیک بکند. اما تنها نکته ای که باید به آن دقت کنید، مقدار ویژگی name است که با مقدار []fruit تنظیم شده است، با این روش یعنی استفاده از آکولاد باز و بسته یک آرایه ایجاد می شود و سمت سرور به راحتی می توانید انتخاب شدن یا نشدن هر کدام از میوه ها را بدست آورید.
2- گرفتن مقادیر سمت سرور (PHP):if( isset($_POST['f ruit']) && is_array($_POST ['fruit']) ) {
foreach($_POST[ 'fruit'] as $fruit) {
// برای مثال، تصور فرمایید می خواهیم جمله "من یک سیب دارم" را چاپ کنیم.
echo "I have a {$fruit}!";
// کد مربوط به درج در پایگاه داده اینجا قرار می گیرد.
}
// تصور فرمایید، میخواهیم، تمام میوه ها را با کاما از هم جدا کنیم.
$fruitList = implode(', ', $_POST['fruit'] );
// کد مربوط به درج در پایگاه داده اینجا قرار می گیرد.
}
سلام
لطفا اگه ممکنه در مورد خط زیر بیشتر توضیح بدید ممنون:
اولين کاري که بايد انجام دهيد اين است که تمام متغیيرها را به تابع ()htmlspecialch ars پاس دهيم.
سلام، همان طور که در مطلب بالا و در قسمت "اعتبارسنجي داده هاي فرم با PHP" توضیح داده شد، برای اعتبار سنجی داده های فرم، ابتدا با استفاده از تابع ()htmlspecialch ars مقادیر ارسال شده به سرور را از وجود کاراکترهای خاص مثل > یا < خلاص می کنیم، یعنی این کاراکترها به معادل HTML entity شان تبدیل می شوند:
برای کسب اطلاعات بیشتر در مورد کاراکترهای خاص و HTML entity به لینک زیر مراجعه فرمایید:
beyamooz.com/html/138-advanced/358-%DA%A9%D8%A7%D8%B1%D8%A7%DA%A9%D8%AA%D8%B1%D9%87%D8%A7%DB%8C-%D8%B1%D8%B2%D8%B1%D9%88-%D8%B4%D8%AF%D9%87-%D8%AF%D8%B1-html
توجه داشته باشید، در همین سایت و در قسمت دیدگاه ها، کاربران مجاز به وارد کردن مثلاً تگ <script> نیستند و بصورت اتوماتیک حذف خواهد شد. بنابراین رعایت این نکته مهم است و باید مقادیر ارسال شده از طریق فرم را از لحاظ کاراکترهای خاص، چک کنیم.
زماني كه فرممون به يه صفحه ي ديگه ارسال ميشه باز هم ميشه از اين روش استفاده كرد؟مثلا فرم قراره به result.php ارسال بشه و به اين صورت آدرس بديم:
متأسفانه کد شما کامل ارسال نشده است، اما اگر قرار است بعد از submit شدن فرم، اطلاعات آن به فایلی دیگر غیر از صفحه جاری ارسال شود دیگر نیازی به استفاده از متد ()htmlspecialch ars در ویژگی action مربوط به تگ form نیست ...!
برای حفظ امنیت سایت، زمان ثبت دیدگاه، تمام کلماتی که با علامت کوچکتر و بزرگتر محصور شده باشند، حذف می شوند. بنابراین برای ارسال کدی که شامل علامت های ذکر شده است باید از HTML Entity مربوطه استفاده کنید. (علامت بزرگتر: ;lt& و علامت کوچکتر: ;gt&)
سلام واقعا خسته نباشید.
چرا شرط میگذاریم که وقتی فرم با متد post میاد اعتبار سنجی بشه؟پس تکلیف فرم هایی با متد get چی میشه اونا نیاز به اعتبار سنجی ندارن؟
البته میدونم که این فرم از متد post استفاده کرده ولی حالا اگه برنامه رو بدون اون شرط اولی بنویسیم که فقط برای متد post باشه مشگلی داره؟
سلام
یک سوال؟ برای اولین بار که فرم بالا لود می شود، آیا کدهای PHP مربوط به اعتبارسنجی باید اجرا شوند؟
خیر نباید اجرا شوند ...! حالا چه کار کنیم که اجرا نشوند ...!؟
همان طور که می دانید زمانی که آدرس یک صفحه را در مرورگرتان تایپ می کنید و Enter می کنید، درخواست شما با استفاده از متد get به سرور ارسال می شود، بنابراین با قرار دادن شرط زیر می توانیم از اجرای کدهای مربوط به اعتبارسنجی جلوگیری کنیم:if ($_SERVER["REQU EST_METHOD"] == "POST")
{
...
}
همان طور که در مثال بالا مشاهده می کنید، کدهای PHP و HTML در کنار هم قرار گرفته اند و اطلاعات فرم بعد از submit به همین فرم جاری ارسال می شود ...
سلام...تو اين مثال خطاها و اطلاعات ثبت شده تو همين صفحه نمايش داده ميشه اما تو خيلي از سايتا وقتي فرمي رو پر ميكني خطاها تو همون صفحه نمايش داده ميشه اما وقتي فرم صحيح پر شده باشه اطلاعات تو صفحه ي ديگه اي نمايش داده ميشه...چطور اين كارو ميكنن؟
سلام
در روش ذکر شده توسط شما، قبل از اینکه داده های فرم به سرور ارسال شود (submit)، داده های فرم یکی یکی با استفاده از JavaScript یا jQuery بررسی می شوند و اگر مشکلی وجود داشت، پیغام خطا سمت کاربر تولید و نمایش داده خواهد شد. و تا زمانی که خطایی وجود داشته باشد، فرم به سرور ارسال نمی شود.
و زمانی که تمام فیلدها درست و صحیح مقدار دهی شوند، اطلاعات فرم اینبار به سمت فایلی که در قسمت action فرم گفته اید ارسال خواهد شد. و در ادامه این شمایید که بعنوان برنامه نویس چگونگی برگشت دادن اطلاعات را مشخص می کنید، شاید بخواهید کاربر در انتهای فایل مذکور به صفحه دیگری ارجاع داده شود.
بله... ولي جاوا اسكريپت زماني ك ميخوايم با سرور اطلاعات رد و بدل كنيم كاربرد نداره... به فرض ما يك فرم ورود داريم ........كه شخص يوزر نيم و پسورد وارد ميكنه و اطلاعات بايد به سرور فرستاده شه و بعد تاييد شه.تو اينطور مواقع جاوااسكريپت كاربرد نداره...مثلا من ميخوام زماني كه فرد دكمه رو زد اول با آژاكس اطلاعات بررسي شه اگه صحيح بود بعدش به صفحه ي مورد نظر بره....ولي من نميدونم چطور بايد به فرم اينو بفهمونم!!!!!!وا قعا گير كردم!!!!!
يه موضوع ديگه اينكه قبلا زماني كه شما ما رو راهنمايي ميكردين جواب براي بنده ايميل ميشد اما جديدا اين اتفاق نميافته
اظهارنظرتون درباره JavaScript صحیح نیست...! لطفاً به لینک زیر برید و اعتبارسنجی فرم با استفاده از جاوا اسکریبت رو بیشتر مطالعه فرمایید:
beyamooz.com/javascript/107-basic/407
برای دریافت ایمیل به ازای تغییر در دیدگاه ها باید در انتهای لیست دیدگاه ها روی لینک "می خواهم مشترک شوم" کلیک کنید.
من عذرخواهي ميكنم ازتون...فكر ميكنم منظورمو خوب بيان نكردم....فرض كنيد ما يك ليستي از افراد به همراه كلمه ي عبور آنها در database داريم...هدف من اينه زماني ك فرد فرم ورود رو پر ميكنه و دكمه ي ورود رو ميزنه سيستم بررسي بكنه كه يوزرنيم و پسورد صحيح وارد شده يا نه....مثلا اگه غلط بود خطايي بده و بگه يوزرنيم يا پسورد اشتباه وارد شده.اين فيلتر ورودي رو بايد چطور به فرم بدم؟
به کد زیر توجه کنید:
if ($stmt = $conn->prepare( "SELECT u_id FROM users WHERE u_username=? and u_password=? and u_usertype='admin'"))
{
//بایند کردن پارامترها
$stmt->bind_param("ss", $u_username, $u_password);
//اجرای کوئری
$stmt->execute();
//ذخیره کردن نتیجه
$stmt->store_result();
//اگر تعداد رکوردها بزرگتر از صفر باشد، کاربر بدرستی اطلاعات را وارد کرده است
if($stmt->num_rows>0)
{
$_SESSION['u_username_admin']=$u_username;
header('Location: all_reserve.php');
}
else
{
$error = "نام کاربری یا کلمه عبور اعتبار ندارد";
display_form_login();
return;
}
}
اگر نام کاربری و کلمه عبور وارد شده توسط کاربر صحیح باشد، با استفاده از تابع header، کاربر را به صفحه ای دیگر منتقل می کنیم و اگر اطلاعات ارسال شده صحیح نباشد، در همان صفحه ی جاری یعنی صفحه ای که فرم لاگین در آن قرار دارد، پیغام خطا نمایش داده می شود.
این روش در پروژه رزرو هتل استفاده شده است: beyamooz.com/php/339-project-hotel/2594
متوجه شدم...مشكل حل شد....خيلي ممنون بابته توضيح كاملتون
خيلي ممنون از اينكه وقت ميذاريد و ب سوالات مخاطبان كامل جواب ميديد....اما متاسفانه مشكل بنده هنوز حل نشده....همونطور ك شما گفتين فايل html و php كنار هم هستن و من فقط اسم فايل رو با پسوند php در قسمت action مينويسم اما باز هم وقتي submit زده ميشه دستورات php خونده نميشه....مثلا وقتي ب صفحه ي php ميره مرورگر اين آدرس رو نشون ميده:
file:///C:/xamp p/htdocs/Untitl ed3.php
اصلا وقتي اينطور آدرس داده ميشه ب مرورگر برنامه ي xampp درست كار نميكنه انگار....امكان داره از تنظيمات برنامه ي xampp باشه؟من بايد چكار كنم تا اين مشكل حل بشه؟مراحلي رو ك قبلا گفتين تست كردم و همش صحيح بود اما باز هم مشكل حل نشد!
احتملا سرویس APACHE برنامه XAMPP روی سیستم شما اتوماتیک فعال نمیشه . برای فعال کردنش به کنترل پنل برنامه XAMPP برید و دکمه Start مقابل گزینه APACHE رو فعال کنید بعد توی آدرس بار مرورگر آدرس پروژتون رو اینجوری وارد کنید :
نقل قول:
اینطوری نمی تونم درست راهنماییتون کنم و باید پروژه رو برام ارسال کنید.
اما همان طور که گفتم برای اجرای پروژه باید در آدرس بار مرورگر ابتدا localhost رو تایپ کنید. با این کار مرورگر می ره داخل پوشه htdocs و اگر در ادامه آدرس localhost اسم فایلتون رو ندید، بصورت پیش فرض فایل index.php رو اجرا می کنه ...!
حالا با تصور اینکه، پروژه شما داخل یک پوشه بنام Myproj است و اون رو گذاشید داخل htdocs برای اجرای پروژه در آدرس بار مرورگر تایپ می کنیم، localhost://myp roj/login.php در این صورت فرم لاگین پروژه شما به نمایش در می یاد. که شامل یک فرم با دوتا تکس باکس است.
حالا اگر بخواهیم توضیحی کلی درباره ساختار HTML فرم لاگین بدیم، به این صورت هست که از تگ form برای محصور کردن دو تا تکس باکس و یک دکمه submit استفاده کرده ایم، نکته بسیار مهم در مورد سوال شما همین جاست که باید دقت کنید خصوصیت action فرم را با مقدار مثلاً process.php تنظیم کنید.
در این صورت بعد از کلیک شدن روی دکمه submit اطلاعات کاربر به فایل process.php ارسال خواهد شد و بعد از پردازش اطلاعات توسط این فایل، نتیجه هر چیزی که بود برای نمایش در مرورگر، ارسال خواهد شد.
ببخشيد چنتا سوال راجبه مثال آخر دارم...
1-اولين سوال اينكه چرا دستورات php وسط html نوشته شده؟از مطالب قبل بنده اينطور برداشت كردم ك زماني ك كاربر فرمي رو پر ميكنه (البته طبق مثال بالا)فرم به يك صفحه ي ديگه ارسال ميشه ك ما قبلا دستورات php رو اونجا وارد كرديم .اما تو اين مثال ب نظر ميرسه ك ب سرور ديگه احتياج نيست...
2-اين قسمت براي چيه؟(اگه نذاريم چي ميشه؟):
// define variables and set to empty values
$name = $email = $gender = $comment = $website = "";
3-زماني ك از trimو htmlspecialchar s و ... استفاده كرديم باز هم در فرم تغييري ايجاد نشد.
در كل مثال يكم پيچيدست....اگه ميشه بيشتر راجبش توضيح بديد....با تشكر
1- محسن عزیز، هیچ اشکالی نداره که با توجه به نیازت تصمیم بگیری که کدهای PHP رو داخل یک صفحه ی جدا بنویسی و یا همراه با کدهای HTML استفاده کنی ...! البته اگر کدهای PHP جدا باشه و با دستور include به کدهای HTML اضافه بشن، نظم کار حفظ خواهد شد. در ضمن قبل از اینکه فایل مثال بالا به سمت کاربر ارسال بشه، ابتدا هر چیزی که بین علامت php?> و ... باشه اجرا می شه و همراه با کدهای HTML بسمت کاربر ارسال می شه ...
2 و 3- برای بار اول که کاربر درخواست مشاهده فایل مثال بالا را به سرور ارسال می کند، بدلیل اینکه متد پیش فرض برای مشاهده صفحات از نوع get است، بنابراین شرط $_SERVER["REQUE ST_METHOD"] == "POST درست نخواهد بود و دستورات داخل شرط اجرا نخواهد شد. و البته وقتی به انتهای فایل می رسیم، یک شرط دیگر وجود دارد که در صورت خالی نبودن متغییرها، مقادیر مربوط به هر کدوم رو چاپ می کند، حالا شاید متوجه بشید که چرا در ابتدای فایل، متغییرهامون را با مقدار خالی تنظیم کردیم، اما بعد از اینکه کاربر اطلاعات فرم را پر کرده و روی دکمه ارسال (submit) کلیک کرد، چون ویژگی method فرم را با مقدار "post" تنظیم کرده ایم، شرط ذکر شده در ابتدا درست خواهد بود و دستورات داخل آن اجرا خواهد شد.
پهلوان صادق عزيز خيلي ممنون ك ب سوالم جواب دادين...اما ي مساله اي هست!
زماني ك فرمي رو ميسازم و اونو به ي صفحه ي ديگه منتقل ميكنم اطلاعاتي ك بر ميگرده ب صورت متن مياد....طوري ك ب نظر ميرسه اصلا دستورات php رو تفصير نكرده....(يعني تمام دستورات رو ب صورت متن مينويسه!)
من موقع نصب برنامه ي xampp هر دو گزينه ي ,apache و mysql رو هم نصب كردم و فعالن اما باز هم اين مشكل هست....حتي بنده مثال شما رو هم عينا اجرا كردم....اما باز هم قسمت هاي مربوط ب دستورات php ب صورت متن مينويسه....دليل ش چي هست؟
برای رفع این مشکل چندتا چیز را باید چک کنید:
1- نصب صحیح xampp: در آدرس بار مرورگرتون localhost رو تایپ کنید و Enter کنید، اگر صفحه ی نارنجی رنگ مربوط به برنامه Xampp اومد پس، همه چیز برای نصب xampp درست پیش رفته.
2- قرار دادن پروژه در پوشه htdocs: برای اجرای فایل های PHP توسط xampp حتما باید فایل های PHP تون رو در شاخه ی htdocs محل نصب xampp قرار بدید.
3- فایل با پسوند php.: فایل هاتون حتماً باید با فرمت یا پسوند php. باشند تا توسط سرور پردازش بشن ...!
حالا اگر همه چیز درست پیش رفته باشه، فقط کافی است، در آدرس بار مرورگرتون تایپ کنید localhost://tes t.php
يعني فقط بايد با localhost از طريق آدرس مرورگر مطالب php نمايش پيدا ميكنه؟
خب ميشه از طريق مرورگر راحت تو صفحه php مورد نظر رفت و همه چيز درسته...اما زماني ك ما ميخوايم ي فرم رو ب صفحه ي php خاصي ارتباط بديم ديگه نميشه در قسمت action فرم آدرس رو ب صورت localhost داد....زماني ك فرم ب صفحه ي php وصل ميشه آدرس ب اين صورت ميشه:مثلا
file:///C:/xampp/htdocs/Untitled3.php
كه در اين صورت هم دستورات php اصلا نمايش داده نميشه....پس بايد چطور آدرس داد؟
برای مقدار دهی ویژگی action در تگ form دیگر نیاز نیست که بصورت صریح یا مطلق آدرس فایل PHP را وارد نمایید. اگر فرض کنیم، بعد از submit شدن فرم جاری، اطلاعات به فایل myfile.php ارسال شود و این فایل از نظر مکانی در کنار فایل فرم ورود اطلاعات باشد. بنابراین فقط کافی است ویژگی action در تگ form را با "myfile.php" مقدار دهی کنیم.
خيلي ممنووون
سلام
موفق باشید :)
فعالیت خیلی خوبی شروع کردید