سلام، به قسمت آخر آموزش طراحی سایت فروشگاهی با استفاده از زبان قدرتمند php خوش آمدید، در این قسمت همانطور که در جلسه قبل عرض کردم قصد داریم تا فایل های موجود در پنل مدیریت سایت را قفل کنیم و کلید این قفل قرار است متغییر سراسری $_SESSION['admin_email'] باشد. حالا چگونه عملیات قفل کردن انجام می شود و چگونه قرار است متغییر سراسری $_SESSION['admin_email']، نقش، کلید این قفل را بازی کند، در ادامه به طور مفصل خدمت شما عزیزان توضیح داده می شود.
توجه: شما می توانید فایل کامل این اسکریپت را که در طی ۶۰ جلسه آموزش داده ایم از طریق لینک زیر دریافت کنید:
در قسمت قبل، مشاهده نمودید که، وقتی ایمیل و پسورد به درستی وارد شود، برنامه به سمت پنل مدیریت سایت هدایت می شود؛ البته پارامتر MessageToAdmin نیز به این لینک تزریق می شود تا در ادامه از آن استفاده شود. برای درک بهتر به آدرس C:\wamp\www\ecommerce\admin_area مراجعه نمایید و فایل login.php را با استفاده از Notepad++ باز و کد زیر را در آن پیدا کنید.
<script>window.open('index.php?MessageToAdmin=سلام مدیر محترم ، مقدمتان گلباران. موفق باشید.','_self')</script>
همانطور که مشاهده می کنید، مقداری که برای پارامتر MessageToAdmin در نظر گرفته ایم برابر است با "سلام مدیر محترم ، مقدمتان گلباران. موفق باشید".
خب بعد از درک مفاهیم بالا، اکنون به آدرس C:\wamp\www\ecommerce\admin_area بروید و فایل index.php را باز کنید و کدهای زیر را در آن پیدا کنید.
<!-- start of ocntent left --> <div id="templatemo_content_left"> <?php
آنها را حذف کنید و به جای آنها کدهای زیر را قرار دهید.
<!-- start of ocntent left --> <div id="templatemo_content_left"> <?php if(isset($_GET['MessageToAdmin'])) { $message=$_GET['MessageToAdmin']; echo"<h1 style='width:500px;margin:150px auto;'>$message</h1>"; }
توضیح کدهای بالا، با توجه به قسمت های قبل فوق العاده ساده می باشد. ما در اینجا با استفاده از متغییر سراسری $_GET[' MessageToAdmin '] پیام موجود در لینک را استخراج کرده ایم و در معرض دید مدیر سایت قرار داده ایم.
بعد از انجام اقدام بالا، حالا زمان آن فرا رسیده که گزینه ی "خروج" که یکی از گزینه های سایدبار سمت راست پنل مدیریت است را با همدیگر فعال کنیم. به تصویر زیر نگاه کنید.
حالا برای دیدن پشت پرده گزینه "خروج" باید به آدرس C:\wamp\www\ecommerce\admin_area\include بروید و فایل Right_Sidebar.php را را باز کنید و کدی که در تصویر زیر قرار دارد را در آن پیدا کنید.
مطمئنم که شما، با اینگونه تصاویر، به طور کامل در طی این چند قسمت آشنا شده اید، بنابراین از توضیح اضافی در مورد آن خودداری می کنم. حالا با توجه به لینک بالا، باید به آدرس C:\wamp\www\ecommerce\admin_area برویم و فایل index.php را بار دیگر باز کنیم و کدهای زیر را در آن پیدا کنیم.
if(isset($_GET['view_payments'])) { include('view_payments.php'); }
آنها را حذف کنید و به جای آنها کدهای زیر را قرار دهید.
if(isset($_GET['view_payments'])) { include('view_payments.php'); } if(isset($_GET['logout_admin'])) { include('logout_admin.php'); }
همانطور که مشاهده می کنید، یک دستور شرطی قرار داده ایم به این معنی که " اگر در لینک متغییر سراسری $_GET['logout_admin']) وجود داشت، آنگاه فایل logout_admin.php را include کن"
البته با توجه به اینکه ما فایل logout_admin.php را تا اکنون نساخته ایم، باید آن را ایجاد کنیم.
لذا، ابتدا باید به آدرس C:\wamp\www\ecommerce\admin_area بروید و در آنجا فایلی تحت عنوان logout_admin.php بسازید. به تصویر زیر نگاه کنید.
حالا که فایل logout_admin.php را ایجاد کردید، آن را با استفاده از Notepad++ باز کنید و کدهای زیر را در آن قرار دهید.
<?php session_destroy(); echo"<script>window.open('login.php','_self')</script>"; ?>
در واقع در این فایل ما متغییر $_ SESSION که هنگام لاگین ساخته بودیم (منظور من متغییر سراسری $_SESSION['admin_email'] است که در قسمت قبل آن را ایجاد کردیم.) از بین می بریم و بعد از آن با استفاده از دستورات javascript مدیر سایت را به صفحه login.php می فرستیم.
خب وقت آن رسیده است که ببینیم در عمل آیا کدهای نوشته شده، کار خواهند کرد یا خیر؟
ابتدا wamp را روشن کنید و در مرورگر خودتان آدرس http://localhost/ecommerce/admin_area/login.php را وارد نمایید تا تصویر زیر برای شما نمایان شود.
حالا باید ایمیل و پسوردی را که برای مدیر درست کردید، در تگ های ورودی قرار دهید. به عنوان مثال ایمیل مدیر سایت برای من jahangirpachkam@gmail.com و پسورد نیز @jahangirpachkam می باشد که آنها را در تگ ورودی قرار داده ام. به تصویر زیر نگاه کنید.
حالا با زدن بر روی دکمه ی "ورود" به تصویر زیر هدایت می شوید. تغییرات جدید را می توانید در تصویر زیر مشاهده نمایید.
حالا، همانند تصویر زیر، بر روی گزینه "خروج" از سایدبار سمت راست کلیک می کنیم. به تصویر زیر دقت کنید.
با کلیک روی این گزینه، بار دیگر به صفحه لاگین باز می گردیم (در واقع از پنل مدیریت سایت خارج می شویم و اگر قصد ورود داشته باشیم باید از دوباره ایمیل و پسورد مدیر را وارد نماییم).
دقت کنید، همانطور که در تصویر زیر مشاهده می کنید، فولدر admi ، از یک سری فایل و فولدر تشکیل شده است که بعضی از این فایل ها دارای تگ های ورودی هستند، که می توانند برای یک هکر، بهترین راه برای ضربه زدن به سایت باشند. به تصویر زیر نگاه کنید.
در تصویر بالا، من فایل هایی که دارای تگ های ورودی هستند را با استفاده از کادر قرمز رنگ برجسته کرده ام. مثلا فرض کنید شما به عنوان یک هکر به جای اینکه به صفحه لاگین بروید و ایمیل و پسورد مدیر را وارد کنید، کافی است آدرس http://localhost/ecommerce/admin_area/index.php را در مرورگر بنویسید، تا به راحتی به پنل مدیریت سایت دسترسی داشته باشید. به تصویر زیر نگاه کنید.
یک هکر بدون اینکه به صفحه لاگین سایت وارد شود، فقط با نوشتن این آدرس به راحتی به تمام گزینه های مدیریت دسترسی پیدا می کند، و این یک ضعف امنیتی فوق العاده خطرناک می باشد. این نکته در مورد سایر فایلهایی که من آنها را با کادر قرمز رنگ برجسته کردم، نیز صادق می باشد.خب حالا با این ضعف امنیتی خطرناک چه باید کرد؟
راه حل برطرف کردن این عیب بزرگ، این است که به ابتدای هر کدام از فایل هایی که خدمت شما عرض کردم ( edit_brand.php ،edit_cat.php edit_product.php ،index.php ،insert_brand.php ،insert_cat.php ،insert_product.php)، کدهای زیر را اضافه نمایید.
<?php //start (condition enter admin) if(isset($_SESSION['admin_email'])){ ?>
و به انتهای هر کدام از همان فایل ها نیز ، کد زیر را اضافه کنید.
<?php //end( condition enter admin ) }else{ echo " <html lang='fa' dir='rtl'> <head> <meta http-equiv='Content-Type' content='text/html'; charset='utf-8' /> </head>"; echo "<script>window.open('login.php?not_admin=شما از مدیران سایت نیستید','_self')</script>"; } ?>
به همین راحتی یک خطر بزرگ را برطرف کردیم، در واقع فایل های حساس خود را که به صورت مستقیم با پایگاه داده در ارتباط بودند را قفل کردیم. نقش اساسی در فرآیند قفل سازی را متغییر سراسری $_SESSION['admin_email'] بازی می کند.
البته یک تغییر کوچک نیز باید در فایل login.php انجام بدهیم، بنابراین به آدرس C:\wamp\www\ecommerce\admin_area بازگردید و فایل login.php را با استفاده از Notepad++ باز کنید و کدهای زیر را در آن پیدا کنید.
<div class="login">
آن را حذف کنید و به جای آن کدهای زیر را قرار دهید.
<div class="login"> <h2> <?php if(isset($_GET['not_admin'])) {echo $_GET['not_admin'];} ?> </h2>
حالا، بیایید بار دیگر مانند یک هکر، تلاش کنیم که به صفحه index.php (پنل مدیریت سایت ) برویم، بنابراین آدرس http://localhost/ecommerce/admin_area/index.php را در مرورگر بنویسید و اینتر بزنید، تصویر زیر را مشاهده کنید و ببینید چه اتفاقی روی داد.
مشاهده می کنید که دیگر نمی شود به این راحتی وارد پنل مدیریت سایت (index.php) شد. هرکاری هم که بکنیم ما را به صفحه login هدایت می کند تا ایمیل و پسورد را وارد کنیم. این موضوع در مورد سایر صفحاتی که آنها را قفل کردیم نیز صادق می باشد. بنابراین دیگر از این به بعد هکرها نمی توانند از این طریق به سایت حمله کنند.
خب عزیزان به تمامی شما تبریک می گویم، آموزش ساخت فروشگاه اینترنتی با استفاده از php به پایان رسید، من در این آموزش، سعی کردم، یک مسیر برای رسیدن به مقصد را به شما نشان بدهم، شما با کمی انگیزه و تلاش بیشتر، می توانید، هزاران مسیر دیگر را خودتان کشف کنید؛ پس هرگز تنها به این آموزش اتکا نکنید و تلاش و کوشش کنید تا بهترین فروشگاه اینترنتی را بسازید.
من منکر این نمی شوم که ممکن است بعضی از جاها، کدها، می توانست بهتر از این باشد ولی این را به عنوان یک تمرین در نظر بگیرید و سعی کنید که کدها را بهینه تر کنید. موفق و مویید باشد.
فایل index.php که در آدرس C:\wamp\www\ecommerce\admin_area قرار دارد. دقت کنید من در این فایل به عنوان نمونه، فرایند قفل سازی را انجام داده ام، شما فرایند قفل سازی را باید خودتان در فایل های edit_brand.php ، edit_cat.php ، edit_product.php insert_brand.php ، insert_cat.php ، insert_product.php انجام دهید.
<?php //start (condition enter admin) if(isset($_SESSION['admin_email'])){ ?> <!-- start of Header --> <?php include('include/Header.php'); ?> <!-- end of Header --> <div id="templatemo_content"> <!-- start of ocntent left --> <div id="templatemo_content_left"> <?php if(isset($_GET['MessageToAdmin'])) { $message=$_GET['MessageToAdmin']; echo"<h1 style='width:500px;margin:150px auto;'>$message</h1>"; } if(isset($_GET['insert_pro'])) { include('insert_product.php'); } if(isset($_GET['view_pro'])) { include('view_product.php'); } if(isset($_GET['edit_pro'])) { include('edit_product.php'); } if(isset($_GET['insert_cat'])) { include('insert_cat.php'); } if(isset($_GET['view_cats'])) { include('view_cats.php'); } if(isset($_GET['edit_cat'])) { include('edit_cat.php'); } if(isset($_GET['insert_brand'])) { include('insert_brand.php'); } if(isset($_GET['view_brands'])) { include('view_brands.php'); } if(isset($_GET['edit_brand'])) { include('edit_brand.php'); } if(isset($_GET['view_customers'])) { include('view_customers.php'); } if(isset($_GET['view_orders'])) { include('view_orders.php'); } if(isset($_GET['order_customer'])) { include('order_customer.php'); } if(isset($_GET['view_payments'])) { include('view_payments.php'); } if(isset($_GET['logout_admin'])) { include('logout_admin.php'); } ?> <div class="cleaner_with_height"> </div> </div> <!-- end of ocntent left --> <!-- start of right content --> <?php include('include/Right_Sidebar.php'); ?> <!-- end of right content --> <div class="cleaner"> </div> </div> <!-- start of footer --> <?php include('include/Footer.php'); ?> <!-- end of footer --> <?php //end( condition enter admin ) }else{ echo " <html lang='fa' dir='rtl'> <head> <meta http-equiv='Content-Type' content='text/html'; charset='utf-8' /> </head>"; echo "<script>window.open('login.php?not_admin=شما از مدیران سایت نیستید','_self')</script>"; } ?>
فایل logout_admin.php که در آدرس C:\wamp\www\ecommerce\admin_area قرار دارد.
<?php session_destroy(); echo"<script>window.open('login.php','_self')</script>"; ?>
فایل login.php که در آدرس C:\wamp\www\ecommerce\admin_area قرار دارد.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html lang="fa" dir="rtl"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>صفحه ی ورود مدیریت</title> <link rel="stylesheet" href="styles/login.css"> </head> <body> <div class="login"> <h2> <?php if(isset($_GET['not_admin'])) {echo $_GET['not_admin'];} ?> </h2> <h1>ورود به مدیریت سایت</h1> <form method="post"> <input type="text" name="loginEmail" placeholder="لطفا ایمیل خود را وارد نمایید" required="required" /> <input type="password" name="loginPass" placeholder="لطفا پسورد خود را وارد نمایید" required="required" /> <button type="submit" name="login" class="btn btn-primary btn-block btn-large">ادامه</button> </form> </div> </body> </html> <?php session_start(); require('include/db.php'); if(isset($_POST['login'])){ $email= @mysql_real_escape_string($_POST['loginEmail']); $pass= @mysql_real_escape_string($_POST['loginPass']); $sel_admin = "select * from admin where admin_email='$email' AND admin_pass='$pass'"; $run_admin = mysqli_query($con,$sel_admin); $check_admin = mysqli_num_rows($run_admin); if($check_admin==0){ echo "<script>alert('نام کاربری و رمز عبور خود را اشتباه وارد کرده اید ، لطفا دوباره امتحان کنید.')</script>"; }else{ $_SESSION['admin_email'] = $email; echo "<script>window.open('index.php?MessageToAdmin=سلام مدیر محترم ، مقدمتان گلباران. موفق باشید.','_self')</script>"; } } ?>
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.