آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

ارتباط امن ، سریع و استاندارد با دیتابیس (آموزش)

کاشی زاده  11 سال پیش  11 سال پیش
+15 0

روشی امن ، سریع و آسان برای ارتباط با دیتابیس
خُب دوستانی که میترسن سرورشون دچار حملات اینجکشن بشه ، راه های مختلفی برای مبارزه باهاش وجود داره .
یکی از راه های جلوگیری از اینجکشن طبق گفته های عزیزان استفاده از کست اینتیجر هست .
این راه جلو اینجکشن رو میگیره ولی پروژه شما رو کثیف میکنه از پروژه شما یه جور اسپاگتی میسازه.
راه بهتر استفاده از پروسیجر (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 هست.

+2 0
البته این کار هم نیاز نیست. کافیه اگه از mysql یا mysqli استفاده میکنیم از فانکشن mysql(i)_real_escape_string استفاده کنیم و اگر از pdo و mysqli بصورت شی گرا استفاده میکنیم از متد prepare ستفاده کنیم. البته mysql (تابع ها) دیگه deprecate شده و در نسخه های بعدی php حذف میشه.. بهتره از mysqli و pdo استفاده کنیم. (11 سال پیش)
0 0
ممنون ، ولی تو این روش هم باید مسائل امنیتی رعایت بشه و صرفا استفاده از sp پاسخگو نیست ، نمونه کدت هم رعایت نکرده این موضوع رو و این جمله هم که از نظر اینجکشن هم کاملا در امان هستید :) ، کاملا اشتباه هست ، (11 سال پیش)
+2 0
@BiDak دوست من شما با استفاده از این روش نیازی به اسکیپ کردن ورودی ها ندارید و خود سیستم امکان بررسی نوع متغیر ها رو داره که در صورت عدم مطابقت با پارامتر ورودی خطا میده و هیچ اطلاعاتی از دیتابیس خارج نمیشه . تنها مشکلی که در استفاده از این روش وجود داره اینه که اگر شما پارامتر های ورودی رو تغییر بدید و فراموش کنید در php هم این تغییر رو اعمال کنید مدتی به دنبال یک ارور نا معلوم میگردید که ناشی از این اشتباه هست ولی قابلیت های زیادی داره که میتونه این عیب رو بپوشونه. (11 سال پیش)
 برای این سوال 1 پاسخ وجود دارد.
پاسخ به سوال 
محسن موحد  11 سال پیش
+2 0

راحتتر کدوم راهه؟

شما سایت owasp.org رو یه سر بزنین...این لینک ... راه اول prepare... 

bindParam پارامتر type هم  داره.

این لینک از سایت stackoverflow هم ببینید که اکثرا بعنوان اولین راه پیشنهاد دادن.

+2 0
شما میتونید از pdo در sp هم استفاده کنید . بنده هم عرض کردم یکم ممکنه در صورت اشتباه وارد کردن پارامتر اذیت کنه ولی شما با استفاده از sp هم میتونید پهنای باند رو بهینه تر مصرف کنید هم سرور سریع تر پردازش ها رو انجام بده ولی از نظر امنیت دقیقا در همون لینکی که دادید یکی از روش های توصیه شده هست . (11 سال پیش)
+2 0
call کردنش مهم نیست. performance متد prepare هم بالاس ولی اینکه بخوایم بگیم sp سریعتره این موضوع به optimize بودن دیتابیس هم مربوط میشه. در کل کار مرسومی نیست این روش. کافیه اسکریپتهای مختلفو ببینید.حتی همون لینک سایت stack...داخل php اصلا این متدها و فانکشن ها واسه چی اومدن؟یعنی sp واسه جلوگیری از sql injection از نسخه ی 5 به بعد اومد؟؟قبل از نسخه ی 5 چیکار میکردن؟ بنظرم این راه لقمرو فقط از پشت گردن میاره... (11 سال پیش)
+3 0
راستی من روش شمارو رد نکردم...فقط دو روزه دارم میگم راه حل آسونترش اینه :دی (11 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .