7 نکته کلیدی برای ایمن سازی لاراول
تیم قدرتمند لاراول همواره ویژگی های امنیتی بسیاری در نسخه های مختلف آن به خصوص 5، پیش بینی کرده و همواره در حال بروزرسانی است. با این حال هنوز راه هایی برای سوء استفاده وجود دارد که در صورت عدم توجه به آن هها ممکن است پروژه لاراولی شما مورد نفوذ قرار گیرد. در این مقاله ضمن تشریح ویژگی های امنیتی لاراول، به 7 نکته طلایی در ایمن سازی و ارتقا امنیت لاراول پرداخته ایم، اینکه چگونه می توانیم Laravel را امن و بیش از پیش قابل اعتماد کنیم…
هاست لاراول هاست حرفهای لینوکس با قابلیت پشتیبانی از لاراول
1- جلوگیری از حملات SQL Injection
با توجه به اینکه لاراول به طور پیشفرض از PDO برای اجرای Queryهای سمت دیتابیس استفاده می کند بنابراین تا حد بسیار زیادی ورودی ها را بررسی و از عدم تزریق متغیر ناخواسته اطمینان حاصل می کند. اما گاها برخی از برنامه نویسان قصد دارند به جای استفاده از PDO از متد DB::raw استفاده کنند، در این صورت دیگر PDO نمی تواند همانند شرایط قبل از عدم تزریق متغیر ناخواسته اطمینان حاصل کند. اینجاست که لاراول در برابر SQL Injection آسیب پذیر می شود.
معمولا کاربران از نمونه زیر در این بخش استفاده می کنند:
Route::get('sql-injection-vulnerable', function() { $name = "'Bobby' OR 1=1"; return DB::select( DB::raw("SELECT * FROM cats WHERE name = $name")); });
حال اینکه جهت ایمن سازی آن لازم است نمونه بالا را با جایگزینی پارامترها با علامت سوال (؟) به شکل زیر بازنویسی کنید. در این روش مقادیر در یک آرایه به عنوان یک آرگومان دوم و به روش خام به دیتابیس ارسال می شوند:
Route::get('sql-injection-not-vulnerable', function() { $name = "'Bobby' OR 1=1"; return DB::select( DB::raw("SELECT * FROM cats WHERE name = ?", [$name])); });
2- فعال سازی SSL و پروتکل HTTPS
قبلا در مقالاتی دیگر به اهمیت استفاده از پروتکل HTTPS اشاره کرده ایم:
بیشتر بخوانید SSL و تاثیرات آن بر روی وبسایت
بیشتر بخوانید ضرب الاجل گوگل برای فعال سازی https و SSL
هنگامی که شما وبسایت خود را در بستر HTTP توسعه می دهید هر بیت از اطلاعات در شبکه ارتباطی سرور و مخاطبین به صورت متن ساده و قابل فهم ارسال می شود. بنابراین یک هکر می تواند اطلاعات دریافتی از سرور را تشخیص داده و از آن ها سوء استفاده کند. تنها راه جلوگیری از این اتفاق تهیه گواهینامه SSL و فعال سازی پروتکل HTTPS است.
گواهینامه SSL برای تهیه و خرید گواهینامه SSL کلیک کنید
نکته قابل توجه اینکه، طبق الگوریتم های جدید موتورهای جستجوگر از جمله Google وبسایت های برخوردار از HTTPS از درجه اهمیت بالاتر و SEO قوی تری بهره مند هستند. بنابراین با یک تیر 2 نشان میزنید. تامین امنیت و ارتقا SEO.
با تهیه گواهینامه SSL و فعال کردن HTTPS، لازم است با استفاده از نمونه فیلتر زیر، کاربران خود را به پروتکل امن HTTPS هدایت کنید:
Route::filter('https', function() { if ( ! Request::secure()) return Redirect::secure(URI::current()); });
3- جلوگیری از حملات XSS
حمله XSS زمانی اتفاق می افتد که به عنوان مثال مهاجم بتواند یک کد جاوا اسکریپت در صفحه ای که کاربران آن را مشاهده می کنند، قرار دهد. فرض کنید در صفحه ای از وبسایت یک فرم قرار گرفته که نام و نام وخانوادگی را درخواست می کند. حال چنانچه فرد مهاجم یک کد جاوا اسکریپت به شرح زیر در فیلد نام و نام خانوادگی قرار دهد و دکمه Submitt را اعمال کند. آن کد در صفحه دیگر کاربران آنلاین اجرا شده و در مثال ما پیام هک شدن وبسایت به کاربران وبسایت نمایش داده می شود:
<script>alert("You are hacked")</script>
این حفره امنیتی نه تنها می تواند مانند مثال بالا باعث نمایش یک جمله با محتوای منفی و بسیار بد شود بلکه می تواند اقدامی جهت اتصال به دیگر سرورها جهت اقدامات خرابکانه دیگر باشد. پس اگر از لاراول استفاده می کنید در بخش مقدار، کد را به شکل ({{ $variable }}) وارد کنید.
تنها زمانی از کد {!! $variable !!} استفاده کنید که اطمینان دارید محتوای فیلد بهتر است در معرض نمایش عموم قرار گیرد.
البته لاراول در نسخه 5 به طور خودکار از در این بخش ایمن شده است و لذا چنانچه فرم بخواهد اطلاعات را به دیتابیس ارسال کند یا خروجی آن در قالب HTML باشد کد مثال ما را به شکل زیر ارسال می کند که در واقع یک متن بدون قابلیت اجراییست:
<script>alert("You are hacked")</script>
جهت اطلاعات بیشتر در مورد این بروزرسانی به این لینک مراجعه کنید.
4- استفاده از هدر (Header)های امنیتی Laravel
توصیه می شود از هدرهای امنیتی لاراول موجود در GitHub استفاده کنید. با مراجعه به لینک زیر لیستی از Headerها و نحوه نصب و اضافه کردن آن ها به لاراول را مشاهده خواهید کرد.
هدرهای امنیتی لاراول در GitHub
پس از نصب و اضافه کردن هدرهای امنیتی، فراموش نکنید که نتیجه را در مرورگر تست کنید. برای اینکار حتی می توانید به سادگی با مراجعه به لینک زیر نسبت به تست فرایند اقدام کنید:
تست Security Header
5- استفاده از mass assignment با ملاحظات امنیتی
mass assignment یک ویژگی ساده است که به ما اجازه می دهد یک مدل مشخص برای ورودی فرم ایجاد کنیم. در این صورت نیاز نیست برای هر مقدار به صورت جداگانه اقدام کنیم.
اگر از این قابلیت در اپلیکیشن یا وبسایت خود استفاده کرده اید باید مراقب باشید که ملاحظات امنیتی آن را نیز رعایت کرده باشید در غیر اینصورت، هکر می تواند فرم را در طرف کاربر تغییر دهد و یک ورودی جدید به آن اضافه کند:
<input name="is_admin" type="text" value="1" />
در واقع از کد زیر پس از Submit فرم جهت ایجاد مدل استفاده می شود:
Cat::create(Request::all())
البته به لطف آرایه $fillable، می توانید یک White List حاوی فیلدهایی که می توانند با استفاده از قابلیت mass assignment پر شوند، ایجاد کنید. بر عکس این فرایند می تواند با استفاده از ویژگی $guarded یک Black List حاوی فیلدهایی که نمی توانند از قابلیت mass assignment استفاده کنند، بسازید.
6- محافظت در مقابل CSRF (Cross Site Request Forgery)
در بخش پایانی جلوگیری از حملات XSS یک پیشنهاد ارایه کردیم و آن استفاده از Token برای اعتبار سنجی ورودی فیلدهای یک فرم بود.
اگر برای ایجاد فرم از قالب های Blade در بستر HTML استفاده کرده اید، هر چند که این روش توصیه نمی شود اما حال که استفاده کردید باید برای استفاده از قابلیت CSRF token از کد زیر در فرم خود استفاده کنید:
<form name="test"> {!! csrf_field() !!} <!-- Other inputs can come here--> </form>
7- استفاده از Laravel Purifier
Raw HTML یک فایل خام html است که در آن از تگ هایی استفاده شده که در هیچ یک از زبان های برنامه نویسی نشانه گذاری شده تعریف نشده است. بنابراین امکان مخرب بودن محتوای این نوع فایل بسیار زیاد است. پسوندهای این فایل معمولا یکی از موارد asp, .php, .aspx, .cfs است.
برای جلوگیری از وجود فایل های اینگونه در وبسایت خود توصیه می شود از Laravel Purifier استفاده کنید. در این صورت فایل های حاوی کدهای ناشناس و مخرب شناسایی و حذف خواهند شد.
برای کسب اطلاعات بیشتر در مورد HTML Laravel Purifier به لینک زیر مراجعه کنید:
purifier-security
سلام خسته نباشید
یه سوال ؛ اگه در یک فرم ثبت نام به جای نام ، شخصی بیاد اسکریپت بفرسته ، عکس العمل لاراول پس از ارسال فرم چیه ؟ حالات گوناگونش بررسی کنید لطفا
عرض سلام و ادب،
در بندهای 3 و 6 به موضوع مورد نظر شما پرداخته شده است. لطفا دو بند فوق را مطالعه فرمایید.
عالی بود ممنون بابت پستتون
با تشکر از توجه شما، خوشحالیم که مفید واقع شده است.