ارتباط امن ، سریع و استاندارد با دیتابیس (آموزش)
روشی امن ، سریع و آسان برای ارتباط با دیتابیس
خُب دوستانی که میترسن سرورشون دچار حملات اینجکشن بشه ، راه های مختلفی برای مبارزه باهاش وجود داره .
یکی از راه های جلوگیری از اینجکشن طبق گفته های عزیزان استفاده از کست اینتیجر هست و یا اسکیپ کردن داده ها.
این راه جلو اینجکشن رو میگیره ولی پروژه شما رو کثیف میکنه از پروژه شما یه جور اسپاگتی میسازه. البته در صورتی که این روش را به درستی انجام دهید کد تمیزی خواهید داشت .
راه دیگر استفاده از پروسیجر (Stored Procedure) هست .
پروسیجر (Stored Procedure) چیست ؟
به طور خلاصه Stored Procedure یک روش اجرای دستورات در بانک های اطلاعاتی هست که با استفاده از آن میتوان دستورات select,insert,delete و... را در آن نوشت و با استفاده از پارامتر های ورودی یا خروجی می شه اطلاعاتی از اون گرفت یا به آن داد.
مزایای استفاده از پروسیجر چیست ؟
*- با استفاده از Stored Procedure می توانیم به میزان قابل ملاحضه ای Performance و بازدهی Query ها را بیشتر کنیم، با اولین باری که یک Procedure اجرا می شود، MySql یک Execution Plan (نقشه ی اجرایی) برای آن ایجاد می کند و در اجراهای بعدی با استفاده از همان EP اقدام به اجرای Stored Procedure می نماید و در نتیجه بازدهی و سرعت Query بالاتر می رود.
- استفاده از SP علاوه بر اینکه در نگهداری و ارائه ی داده های دیتابیس به ما کمک می کند، لازمه برنامه نویسی چند لایه (Multi-Tier Programming) نیز محسوب می شود. Stored Procedure های دیتابیس لایه دیتا (Data Layer) در برنامه نویسی سه لایه (three-tier programming) می باشد.
- درصد امنیت داده ها در کار با دیتابیس بیشتر می شود، زیرا MySql این امکان را دارد تا برای هر SP تنظمیات امنیتی (Security Setting) جداگانه در نظر بگیریم.
*- کوئری های نوشته شده در php از نظر امنیتی ضعیف بوده و سایت را در برابر حملات موسوم به SQL Injection Attack آسیب پذیر می کنند.
- استفاده از SP و جدا کردن SQL Logic از کد php باعث می شود تا مدیریت کدها راحت تر باشد، قطعا فراخوانی یک StoredProcedure بسیار راحتر و منطقی تر از ایجاد کوئری با چسباندن چندین String بهم می باشد.
خوب موارد بالا به صورت کتابی بود ولی به صورت خودمونی بخوایم بگیم میشه این :
شما با استفاده از پروسیجر سرعت انجام عملیات در وب سرویس رو بالا میبرید و مشکل اینجکشن رو هم حل میکنید .
آموزش کار با sp به زبان خودمانی :
بعد از ایجاد دیتابیس وارد پنل مدیریت دیتابیس (phpMyAdmin) بشید .
طبق عکس زیر بر روی Routines کلیک کنید .
بعد از کلیک صفحه جدیدی باز میشه ، داخل این صفحه بر روی Add routine کلیک کنید تا پنجره افزودن یک روتین جدید باز بشه مثل عکس زیر :
همونطور که مشخصه در قسمت Routine name نام روتین رو وارد میکنید .
در قسمت Type گزینه Procedure رو انتخاب کنید .
در بخش وارد کردن Parameters مقادیری که به انواع پارامت نیاز دارید به پروسیجر بدید رو میسازید
**** نکته : Parameters دقیقا همون مقادیری هستند که ما نیاز داریم تا با اون ها اطلاعاتی رو به کار بر بدیم مثل id، شما زمانی که با php به دیتابیس درخواست میدید مستقیما id رکورد مورد نظر رو به دیتابیس میدید تا اطلاعات مربوط به اون id رو نشون بده و اینجاست که یه نفر میتونه به دیتابیس شما حمله کنه .
در ادامه توضیحات کامل تر داده خواهد شد .
در قسمت Definition دستورات لازم برای نمایش یک داده رو مینویسم ، من یک نمونه ساده از این دستورات رو مینویسم :
begin select id, title from table_name where id = inputId ; end
حالا میریم سراغ بررسی دستور ، کاملا واضح هست چون دقیقا همون کد های sql هستن تنها نکاتی که داره begin, end که برای شروع و پایان دستورات استفاده میشن.
همینطور متغیر inputId که پارامتری هست که ما برای این روتین تعریف کردیم تا از این طریق Id که کلاینت ارسال میکنه رو به پروسیجر بدیم .
همین :)
Definer همون آدرس دیتابیس شماست که به اینصورت میدید :
myDataBase@localhost
در قسمت SQL data access هم مقدار CONTAINS SQL رو انتخاب کنید (بسته به نیاز البته)
به بقیشم کاری نداریم فقط روی دکمه Go بزنید و تمام !
به همین سادگی شما یه پل ارتباطی امن ما بین وب سرویس و دیتابیس درست کردید و از نظر اینجکشن هم کاملا در امان هستید :)
اما نکته ای که باقی مونده این هست که شما چطوری از این پل ارتباطی استفاده کنید .
اینم خیلی ساده هست شما به جای query php که برای اتصال به دیتابیس مینوشتید این دستور رو مینویسید.
$query = "CALL `SP_NAME`(inputId)";
توضیح کد بالا :
SP_NAME همون اسم روتینی هست که داخل دیتابیس ساختید و inputId هم همون ID هست که کاربر به سرور میده .
شما با استفاده از این روش چندین چیز رو به دست آوردید :
از همه مهمتر امنیت دیتابیس شما ، بعد سرعت بیشتر در پردازش ، تمیزی کد ها و یک نکته که قبلا یادم رفت بگم باعث کاهش مصرف پهنای باند شما هم میشه .
البته در نهایت باید اینو بگم که استفاده کردن از Procedure باعث میشه کمی تست و دیباگ رو سخت تر شود. معمولا برنامه نویس های سمت سرور ترجیح میدن مدیر کامل دیتابیس رو خودشون در کد انجام بدند ولی متخصصین دیتابیس تمایل دارند مدیریت دیتابیس رو در خود دیتابیس ایجاد کنند .
در رابطه با مباحث مدیریت دیتابیس مطالب بسیار گسترده ای وجود داره که یکی از اون ها Procedure هست.
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .