لاراول کمک میکنه تا امنیت وبسایت شما تامین بشه. در این مقاله می خواهیم نحوه برخورد لاراول با سه ریسک امنیتی مهم : نفوذ sql, جعل درخواست cross-site و اسکریپت نویسی cross-site رو شرح میدیم.
SQL Injection
ORM در Laravel Eloquent از پارامترهای PDO برای جلوگیری از نفوذ SQL استفاده میکنه. اتصال پارامترها بصورت مستقیم در مدل باعث میشه کاربران خراب کار نتوانند روی اطلاعات کوئری تاثیری بگذارند. برای مثال یک فیلد فرم رو در نظر بگیرید که آدرس ایمیل رو برای جستجوی جدول کاربران دریافت میکنه. اما بجای آدرس ایمیل کاربر برای jason@example.com or 1=1 جستجو کنه, اینجاست که امنیت زیر سوال میره. کوئری شبیه زیر میشه :
SELECT * FROM users WHERE email = 'jason@example.com' or 1=1
مقدار 1=1 که همواره true برمی گردونه باعث میشه تمام رکوردهای جدول کاربران برگردانده بشه.
یک کاربر خراب کار رو در نظر بگیرید که بجای ایمیلش دستور drop table users رو بزنه. کوئری بصورت زیر در میاد :
SELECT * FROM users WHERE email = 'jason@example.com'; drop table users;
اگر اکانت mysql مسئول اجرای کوئری های اپلیکیشن باشه پس براحتی دستور بالا رو اجرا میکنه و جدول کاربران با تمام اطلاعات داخلش در یک لحظه حذف میشه.
اگرچه وقتی از اتصال پارامتری اطلاعات استفاده میکنیم, کل ورودی تگ ' رو میگیرند و این یعنی خروجی کوئری چیزی شبیه زیر میشه :'
SELECT * FROM users WHERE email = 'jason@example.com or 1=1
چون هیچ آدرس ایمیلی با jason@example.com or 1=1 برابر نیست کوئری هیچ نتیجه ای رو برنمی گردونه.
همینطور که میدونید لاراول یک راه دوم برای ارتباط با دیتابیس داره, اون استفاده از raw sql هست. بعضی از توسعه دهندگان ممکنه نخواهند وقت اضافه برای یادگیری Eloquent بگذارند, بهرحال تلاش بیشتر باعث میشه راه بهتری برای جلوگیری از حملات sql injection باشه و خیال توسعه دهنده رو از این بابت راحت کنه.
جعل درخواست Cross-site
موقعیتی رو فرض کنید که یک مخرب خودش رو به شکل یک لینک در بیاره که وقتی روش کلیک کنید یک درخواست رو به وبسایت دیگری که ثبت نام کردید راه اندازی میکنه و باعث میشه از راه session cookie تایید اعتبار بشه. فرض کنید این لینک یک وظیفه حساس مثل آپدیت پروفایل رو انجام میده و پیام اسپم وارد اون میکنه. چون تایید اعتبار رو انجام داده سیستم فکر میکنه درخواست از طرف شما بوده و اون آپدیت رو انجام میده.
توکن های CSRF - cross-site request forgery به سیستم ها اطمینان می دهد تا افراد خارجی نتوانند از طریق روش هایی مثل درخواست request پیاده سازی کند. این کار از طریق ارسال توکن کنار محتوای فرم صورت می گیره. این توکن با توکنی که در session کاربر ذخیره شده مقایسه میشه. اگر برابر بود درخواست معتبر هست وگرنه اون بعنوان غیرمعتبر شناخته می شود.
اگر شما فرم رو از طریق html استاندارد می سازید, باید توکن رو بصورت دستی بفرستید :
<form ...>
{!! csrf_field() !!}
</form>
و اگر از پکیج LaravelCollective/html برای ساخت فرم استفاده کنید (روش پیشنهادی) توکن csrf بصورت خودکار به فرم اضافه میشه. من استفاده از این پکیج رو برای ساخت فرم ها پیشنهاد میدم.
اسکریپت نویسی Cross-site
در لاراول syntax {{}} بصورت خودکار از اجرای محتوای html جلوگیری میکنه. این یک چالش بزرگ هست, ممکنه یک کاربر مخرب رشته ای مثل زیر در کامنت خا یا پروفایل کاربر وارد کنه :
My list <script>alert("spam spam spam!")</script>
اگر به این رشته اجازه داده بشه که بدون هیچ فیلتری وارد دیتابیس بشه, و سپس متعاقبا در صفحه وب بدون هیچ مشکلی نمایش داده بشه, این میتونه یک پنجره ی هشدار نشون بده. این یک نمونه از حمله هایی هست که بعنوان cross-site scripting شناخته میشه. این طرح میتونه موجب مشکلات اساسی بشه - حملاتی که باعث می شوند اطلاعات حساسی با کدهای جاوا اسکریپت دستکاری بشوند و یا به یک سایت دیگر فرستاده شوند.
خوشبختانه وقتی یک متغیر در {{}} رندر میشه, لاراول دقیقا همون متغیر رو نمایش میده و از گرفتار شدن در خطر cross-site scripting خودداری می کنه :
My list <script>alert("spam spam spam!")</script>
اما اگر شما بخواهید محتوای html رندر کنید میتونید از این syntax استفاده کنید :
{!! Some hopefully not dangerous string here. !!}
در حقیقت شما میتونید از این syntax برای مواردی مثل تولید label های پکیج LaravelCollective استفاده کنید :
{!! Form::label('Your Notebook Name') !!}
نتیجه گیری
قطعا کارهای بیشتری هستند که برای امن کردن وب سایتتون باید انجام بدید, بهرحال لاراول به شما اطمینان میده که اپلیکیشن تون از این سه حمله مصون خواهد بود.
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید