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

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

کاشی زاده  10 سال پیش  8 سال پیش
+56 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 هست.

0 0
ممنون محمد حسین جان ، خیلی مفید بود ، اما یه سوال ! ، من واسه یه CMS اختصاصی 27 تا متد کار با بانک دارم ، حالا برای هرکدوم از این 27 تا باید یک پروسیجر تعریف بشه ؟ ، و اینکه خروجی دقیقا مثل کوئری های معمولی هست ؟ ، یعنی باید با fetch_array طی کنیم ؟! (10 سال پیش)
+1 0
دقیقا مثل کوئری های هست که تو php مینویسی اگر تو php شما 27 متد داری اینجا هم همینطور هست . البته من اطلاعی از پروژه شما ندارم ولی اگر شی ء گرا بنویسید میتونید تعداد ر. کاهش هم بدید (10 سال پیش)
0 0
من با کوئری های معمولی ، اما متغییر های اسکیپ شده کار میکنم ، با این حساب باید متغییر ها رو معمولی کنم ، کوئری ها رو خاص !؟ (10 سال پیش)
+1 0
اصن لزومی دیگه به اسکیپ کردن نیست متغیر ها رو معمولی میفرستید و تو روتین نوع ورودی ها رو مشخص میکنید یه جور کست کردن هست . کوئری ها رو خاص!؟ =====> این قسمت رو متوجه نشدم :/ (10 سال پیش)
0 0
بزار دوباره بگم ! ، من تو کوئری های معمولیم ، باید همه رو اسکیپ کنیم ، اما تو روش شما نیازی به اسکیپ نیست :) ، اما اون کد نسبتا تکراری برای بخش امنیت حذف میشه - اما برای هر کوئری باید یک پروسیجر تعریف کرد ؟ ، مثلا یک کوئری ثبت دارم در جدول1 ، کوئری ثبت در جدول 2 و.. ، همه ی اینها بروزرسانی هم دارند ، حذف هم دارند ! (10 سال پیش)
+2 0
ببنید اسکیپ کردن یه روش قدیمی و الان تغریبا استفاده نمیشه معمولا از PDO استفاده میکنن ولی در هر حال شما وقتی از پروسیجر استفاده میکنید نیازی نیست اینکار رو انجام بدید. ببنید شما برای هر کوری یک پروسیجر نمیسازید دقیقا کاری که میکنید کوئری رو به پروسیجر تبدیل میکنید .یعنی اگر 10 تا کوئری مختلف دارید اینا رو میبرید تو پروسیجر :) (10 سال پیش)
+1 0
تشکر ، واقعا مفید بود ، باید سر فرصت تست کنم ! (10 سال پیش)
+2 0
آره تو استفاده متوجه منظورم میشه . این نکته رو هم بگم شما در تعریف یک پارامتر برای روتین کاملا اطلاعات رو میدید که نوعش چی هست مثلا شما میگید int دیگه هیچ پارامتری بجز این نمیگیره یا مثلا varchar اگر بررسی کنید متوجه میشید خیلی بهتر عمل میکنه (10 سال پیش)
0 0
ممنون مفید بود. الان که درگیر نوشتن یه CMS هستم واقعا این امنیت خیلی برام مهمه. فقط یه چیزو نفهمیدم. اپه چند تا ورودی داشته باشیم چطور باید اون بخش begin و end رو باید چطور بنویسیم؟ (10 سال پیش)
+2 0
ببنید شما موقع ساخت روتین کدی که به صورت php برای کئوری نوشتید رو میادرید داخل bigin , end و پارامتر های ورودی همون مقادیری هست که کلاینت برای دریافت اطلاعات از سرور ارسال میکنه . مثلا برای مشاهده اطلاعات یک شخص نام اون شخص رو براتون میفرسته که این نام میشه یک پارامتر (10 سال پیش)
0 0
خب اینو فهمیدم ولی میگم اگه 2 پارامتر بخوام ارسال کنم چی؟ مثلا username و password رو میخوام بفرستم به اونProcedure توی اون کدهای php چطور مشخص کنم که اولی و دومین پارامتر کدوم پارامتر ها توی ون Procedure تعریفی توی phpmyadmin هستن؟ (10 سال پیش)
+2 0
شما پارمتر ها رو براساس ترتیب که در روتین ساختین میفرستید مثلا در روتین هست یوز و پس در ارسال هم اول یوزر بعد پسورد رو میفرستید (10 سال پیش)
0 0
آهاااان. گرفتم چی شد. ممنون :) (10 سال پیش)
0 0
چرا سینتکس mysql انقدر ضعیفه: کل قابلیت های دستور if همینه؟ //dev.mysql.com/doc/refman/5.5/en/control-flow-functions.html#function_if نه begin داره و نه end. من میخام بگم در یه صورت کلا یه کاری کنه و در صورت دیگه یه کار دیگه ای. مثلا در صورت درست بودن شرط از یه جدول خروجی بده و توی یه جدول اینسرت کنه. و در صورت غلط بودن شرط روی جدول های دیگه ای. (8 سال پیش)
0 0
منبع واسه سنتکس کامل مای اس کیو ال میشناسید معرفی کنید؟ - کلی دنبال سینتکس بودم پیدا نکردم :( دنبال سینتکس کامل if بودم. هرکسی یه چیزی گفته. هیچ منبعی پیدا نکردم اگه تو منبع کد های ورژن های مختلف رو جدا کرده باشه عالی میشه (8 سال پیش)
0 0
لینک بالاخره پیدا کردم. ممنون (8 سال پیش)
0 0
آقا کاشی زاده فارغ از آموزش، چرا ویدئو های سایتتون دانلود نمیشه؟ ثبت نام هم کردم (قبلا میشد ) (8 سال پیش)
0 0
مشکلی نیست میتونید دانلود کنید تست شده . (8 سال پیش)
 برای این سوال پاسخی وجود ندارد.

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