یکی از نکات مهم مدیریت یک پایگاه داده حصول اطمینان از امنیت اطلاعات است شما باید مطمئن باشید هر شخص که لازم است به طور قانونی به اطلاعات دسترسی داشته باشد می تواند به آنها را بدست آورد ولی هیچ کس نمی تواند بدون اجازه به آنها دسترسی داشته باشد .
نیاز به امنیت
قبل ازاینکه به بحث در مورد امنیت در SQL بپردازیم لازم است نیاز به امنیت را به درستی درک کنیم خطرات امنیتی از سه ناحیه مورد بحث قرار می گیرند .
1- فرامینی که از خارج به سیستم وارد می شوند : مزاحمین خارجی افرادی هستند که کوشش می کنند از خارج از شرکت به سیستم هایتان دستیابی پیدا کنند .
که این کاردلایلی مثل اذیت کردن شوخی ، فروش اطلاعات به شرکت دیگر باشد از آنجا که بیشتر شرکت ها اقدامات اصولی وساده ای را برای پیشگیری از این نوع مزاحمت انجام می دهد این نوع مزاحمت به ندرت پیش می آید.
2- افراد شرکت تان این نوع مزاحمت متداولترین نوع آن است این افراد معمولا انگیزه نهائی برای دستیابی به داده هایی دارند که نمی بایست آنها را ببیند .
که این انگیزه ممکن است کنجکاوی محض ویا سوء نیت باشد .
3- مزاحمت تصادفی : که نسبتا متداول است در اینجا کاربری دارد سیستم می شود وانتظار می رود که نتیجه خاص بدست آورد ولی آن نتیجه را بدست نمی آورد بلکه اطلاعات بسیار بیشتری نسبت به آنچه انتظار داشتند بدست می آورد .
اشخاصی که در شرکتتان کار می کنند ، احتمالا متداولترین نوع مزاحمت برای سیستم تا ن به شمار می آیند .
این افراد معمولا انگیزه نهائی برای دستیبای به داده هایی دارند که نمی بایست آنها را ببینند .
قدری از این انگیزه ممکن است کنجکاوی محض باشد ، و قدری از آن نیز ممکن است سوء نیت صرف باشد .
برای متوقف کردن در این نوع مزاحمت ، واقعا باید با سوء ظن به تمام سیستم های خود بنگرید و آنها را تا حد ممکن قفل کنید .
وقتی چنین کاری می کنید ، برخی از کاربران شکایت می کنند لازم است به تمامی این گونه مسائل پاسخ دهید وبه آنها توضیح دهید که چرا سیستم ها را قفل می کنید .
مزاحمت تصادفی نیز نسبتا متداول است چیزی که در این حالت رخ می دهد آن است که کاربری وارد سیستم می شود و انتظار دارد که نتیجه خاصی به دست آورد ، ولیکن آن نتیجه را به دست نمی آورد بلکه ، کاربران اطلاعات بسیار بیشتری نسبت به آنچه که انتظار داشتند به دست می آورند .
اصول امنیت SQL سرور
SQL سرور واژه ها و مفاهیم زیادی که باید با آنها آشنا شوید این مفاهیم شامل مراحلی می شوند که SQL سرور با انجام آنها به یک کاربر امکان می دهد تا تحت مدهای امنیتی مختلف ، که به زودی بررسی خواهند شد ،بایک بانک اطلاعاتی ارتباط برقرار کند ابتدا باید واژه های بیشتری را فرا بگیرید این واژه ها عبارتند از :
• ID برقراری ارتباط ID برقراری ارتباط بخشی از اطلاعات اعتبار کاربر است که کاربر برای دستیابی به SQL سرور ارائه می دهد بسته به مد امنیتی مورد استفاده در سرویس دهنده ، کاربر ممکن است مجبور به ارائه ID نباشد .
• کلمه عبور این امر ممکن است بارز باشد ، اما هر کلمه عبور صرفا رشته ای از کاراکترها است که برای اعلام اعتبار کاربری که با یک ID خاص با سرویس دهنده ارتباط برقرارمی کند ، به سرویس دهنده ارسال می شود .
بیشتر شما باید با قوانین یک کلمه عبور مناسب آشنا باشید اما لازم است از این امر مطمئن شویم ، کلمات عبور خوب باید حرفی – عددی باشند وطول آنها نیز حداقل شش کاراکتر باشد .
• ID کاربر – این هم یک مرحله دیگر برای دستیابی به یک بانک اطلاعاتی خاص است .
ID برقراری ارتباط و کلمات عبور که در بالا بررسی شدند ، شما را تنها به سرویس دهنده می رسانند .
اگر تنها تا به آن حد پیش روید ، به هیچ یک از بانک های اطلاعاتی آ”ن سرویس دهنده دستیابی نخواهید داشت .
هر کاربری که به یک بانک اطلاعاتی دستیابی داشته باشد یک ID کاربری در آن خواهد داشت .
در بیشتر موارد ID برقراری ارتباطID و کاربری یک چیز هستند .
پس از بررسی درستی ID برقراری ارتباط توسط SQL سرور وتعیین اینکه کاربر مجاز به دستیابی سرویس دهنده است .وی می بایست یک بانک اطلاعاتی را برای کار انتخاب کند SQL سرور سپس ID برقراری ارتباط با را تمام ID های کاربری آن بانک اطلاعاتی مقایسه می کند تا اطمینان حاصل شود که کاربر به بانک اطلاعاتی دستیابی دارد اگر هیچ ID کاربریی مطابق با ID برقراری ارتباط وجود نداشته باشد SQL سرور اجازه پیشروی بیشتر را به کاربر نمی دهد .
انواع نقش های مختلفی که می توانید به کاربربدهید عبارتند از : نقشهای از پیش تعریف شده سرویس دهنده نقش های از پیش تعریف شده کاربر نقش عمومی نقش های شخص بانک اطلاعاتی نقش – هر نقش روشی برای گروه بندی کاربران دارای کارهای مشابه به منظور آسان شدن مدیریت است نقش ها در نگارش های قدیمی تر SQL سرور تحت عنوان گروه مطرح بودند نقش ها درعمل هنوز همان کار را انجام می دهند .
به جای تخصیص مجوز به هر یک از کاربران بانک اطلاعاتی ، به راحتی میتوانید یک نقش ایجاد کنید و پس از قرار دادن کاربران در آن نقش مجوزها را به آن نقش تخصیص دهید انجام این کار سبب صرفه جویی در وقت مدیریت می شود تنها کاری که باید انجام دهید آن است که وی را دراین نقش قرار دهید چو ن بسیاری از مدیران قدیمی SQL سرور هنوز مشغول کار هستند ، بازهم خواهید دید که از واژه گروه به جای نقش استفاده می شود .
نقش برنامه کاربردی – این نقش یک نقش ویژه است که امکان دستیابی به داده های موجود در بانک اطلاعاتی را تنها به برنامه های کاربردی خاص می دهد .
بیشتر مدیران SQL سرور سالها این نوع ویژگی را درخواست کرده اند کار یکه این نقش انجام می دهد آن است که کاربران را مجاب می کند تا از طریق برنامه کاربردی به داده های بانک اطلاعاتی دستیابی پیدا کنند این ویژگی از اهمیت خاصی برخوردار است .
چرا که بیشتر کاربران قادر به استفاده از برنامه های کاربردی خاصی چون میکروسافت اکسس خواهند بود که می تواند با بانک اطلاعاتی ارتباط برقرار کند و دستیابی مستقیم به جداول موجود در آن را برای کاربران فراهم کند .
این کار کاربران را مجاب به استفاده از برنامه کاربردی می کند که خصوصا برای دستیابی به داده ها نوشته شده و از دستیابی برنامه های کاربردی دیگر جلوگیری می شود .
گروههای ویندوز NT امنیت SQL سرور شدیدا بر امنیت ویندوز NT بنا شده است گروههای ویندوز NT مستقیما به نقش های SQL سرور قابل نگاشت هستند ، از این رو هر کاربری که جزئی از آن گروه باشد ، به طور خودکار به SQL دستیابی خواهد داشت .
فرایند بررسی اعتبار وقتی کاربری اقدام به دستیابی به سرویس دهنده می کند چهار چیز کنترل میشود در هر مقطع کنترل می شود که کاربران مجاز به دستیابی هستند یا خیر .
اگر چنین باشد امکان پیشروی به آنها داده می شود در غیر این صورت کاربر ، پیام خطایی دریافت خواهد کرد وکار وی متوقف می شود .
نخستین سطح این امنیت ، در سطح شبکه است کاربران در بیشتر مواقع با یک شبکه ویندوز NT ارتباط برقرار خواهند کرد ،اما با هر شبکه دیگری که در کنار شبکه مذکور وجود داشته باشد نیز می توانند ارتباط برقرار کنند .
کاربر باید یک IDبرقراری ارتباط ویک کلمه عبور معتبر شبکه وارد کند ، در غیراین صورت پیشرفت کار وی در همین سطح متوقف خواهد شد به نظر می رسد که چند روش برای گذشتن از این سطح امنیتی وجوددارد ، اماواقعا این طور نیست یک حالت در مواقعی است که یک کاربر بخواهد با استفاده از یک بانک اطلاعاتی واکشی کند اگر چه کاربر برای دستیابی به شبکه ممکن است نیاز به وارد کردن اطلاعات برقراری ارتباط نداشته باشد اما account که برنامه کاربردی در سرویس دهنده تحت آن درحال اجرا است حتما باید با شبکه ارتباط برقرار کند.
دومین سطح امنیت در خود سرویس دهنده است وقتی کاربر به این سطح میرسد ، می بایست یکID برقراری ارتباط و یک کلمه عبور معتبر برای پیشروی ارائه کنید بسته به مد امنیتی که در سرویس دهنده به کار می برید ، SQL سرور ممکن است بتواندIDبرقراری ارتباط با ویندوزNT را تعیین نماید .
سومینسطح امنیت یک سطح جالب است وقتی کاربر از سطح دوم عبور میکند معمولا فرض براین است که مجوزهای لازم برای دستیابی به بانک اطلاعاتی در آن سرویس دهنده را دارد ، اما این امر حقیقت ندارد در عوض آنچه که رخ می دهد آن است که کاربر باید یک کاربریID در بانک اطلاعاتی که می خواهد به آن دستیابی داشته باشد نیز داشته باشد هیچ کلمه عبوری در این سطح مطرح نیست در عوضID برقراری ارتباط توسط مدیر سیستم باID کاربری نگاشت می شود چنانچه کاربری ID در بانک اطلاعاتی نداشته باشد ، کار زیادی نمی تواند انجام دهد مگر در این حالت ممکن است یک IDکاربری مهمان در یک بانک اطلاعاتی وجود داشته باشد در این حالت آنچه که رخ می دهد آن است که کاربر از طریق IDبرقراری ارتباط به سرویس دهنده دستیابی پیدا کرده است اما به بانک اطلاعاتی دستیابی ندارد و بانک اطلاعاتی حاوی یکID کاربری مهمان است مجوزها را میتوان به کاربریID مهمان تخصیص داد درست به همان گونه ای که به کاربران دیگر قابل تخصیص هستند بانک های اطلاعاتی جدید طبق پیش فرض فاقد IDکاربری مهمان هستند .
آخرین سطح امنیت SQL سرور با مجوزهای سرو کار دارد آنچه که در این سطح رخ می دهد آن است که SQLسرور کنترل می کند کهID کاربریی که کاربر از طریق آن به سرویس دهنده دستیابی پیدا کرده است مجوزهای دستیابی به شی ء های مورد نظر را داشته باشد این امکان وجود دارد که دستیابی تنها برای برخی از شی ء های آن بانک اطلاعاتی باشد ونه تمام شی ء ها که معمولا نیز اینگونه است .
همان گونه که ملاحظه می کنید ، سطوح امنیت می توانند دستیابی به سرویس دهنده را برای کاربران غیر مسئوول بسیار دشوار کنند .
SQL سرور دو روش مختلف برای بررسی اعتبار کاربران و معرفی آنها به سرویس دهنده دارد بررسی اعتبار ویندوز NT که برای انجام تمام کارها به ویندوز NT متکی است روش دوم بررسی اعتباراتی SQLسرور که به ویندوز NT امکان می دهد تا علاوه بر کارهای بررسی اعتبار خاص خود ، بررسی اعتبار را اساسی اطلاعاتی که وارد می کند برای SQL سرور انجام می دهد .
سیستم شناسایی ویندوز در این روش مدیر سیستم برای کاربران یا گروههای کاربری ویندوز حق دسترسی تعیین می کندکامپیوترهای مشتری که ازسرویس های کامپیوتر مرکزی استفاده می کنند به این کامپیوتر متصل شده اند کاربر توسط سیستم عامل Windows یا NT که بر روی کامپیوتر مرکزی نصب شده است شناسایی می شود واگر اجازه دسترسی داشته باشد به آن متصل می گردد در این حالتServer SQL تنها کافی است بررسی کند که آیا کاربر متصل شده حق دسترسی به سرویس دهنده وپایگاه داده را دارد یا خیر ؟
سیستم شناساییServer SQL در این روش هنگامی که یک درخواست برای اتصال فرستاده می شود Server SQL یکLogin ID او یک کلمه عبور دریافت می کند وسپس Login مزبور را با لیست Login های تعریف شده توسط مدیر سیستم مقایسه می کند .
برقراری ارتباط با سرویس دهنده و کاربران بانک اطلاعاتی همچون تمام کارهای دیگری که در SQL سرور انجام می دهید روشهای مختلف زیادی برای ایجادID های برقراری ارتباط وID های کاربری وجود دارد نخستین روش برای انجام این کار از طریق یک ویزارد درEnterprise Manager SQL است .
این ویزارد شما راگام به گام در ایجاد یکID برقراری ارتباط ویک IDکاربری یاری می کند دلیل یکی کردن آنها آن است که درواقع در ارتباط بایکدیگر ایجاد می شوند روش دوم برای ایجاد ID ها استفاده از رویه های ذخیره شده است اگر از این روش استفاده کنید ،درصورت نیاز می توانید همان ID ها را در تمام سرویس دهند ها ایجاد کنید آخرین روش ،ایجاد مجزای آنها درEnterprise Manager SQL است .
ساختن Login برای ساختن یک Login با مدل شناسایی SQL Server سرویس دهنده مورد نظر خود را درکنسول درختی انتخاب کنید سیستمی از اشیاء آن سرویس دهنده در منطقه جزییات ظاهر می شود .
( شکل 1) دکمه Wizard موجود بر روی نوار ابزار Enterprise Manager را کلیک کنید .Server SQL کاردرمحاوره ای Slect Wizard را نشان می دهد (شکل 2) آیتم Creat Login Wizard موجود در قسمت Data bases را انتخاب نمود سپس دکمه ok را کلیک کنید اولین صفحه این ویزارد توسطServer SQL به نمایش در می آید ( شکل 3) دکمه Next را کلیک کنید ویزارد صفحه ای رانشان می دهد که مدل شناسایی را از شما درخواست می کند (شکل 4) ایتم دوم را انتخاب نمایید .
( شکل 5) دکمه Next را کلیک کنید در صفحه بعدی شناسه کاربر و کلمه عبور را از شما درخواست می شود ( شکل 6) کلمه Test ID رابه عنوان نام وارد کرده و دکمه عبور دلخواه خود را نیز تایپ کنید ( شکل 7) دکمهNext را کلیک کنید ویزارد از شما سوال می کند که این Login را به کدامیک از رل های امنیتی نسبت دهد .
(شکل 8 ) این Login را به رل System Adminstrator نسبت دهید (شکل 9 ) دکمه Next را کلیک کنید درصفحه بعدی باید پایگاه هایی را که این Login به آنها دسترسی دارد مشخص نمایید ( شکل 10 ) این Login را به پایگاه داده Aromatherapy نسبت دهید ( شکل 11 ) دکمه Next را کلیک کنید در صفحه نهایی ویزارد انتخاب های شما نشان داده می شوند (شکل 12 ) توجه : Login هایی که به رل های مخصوص سرویس دهنده مثل رل System Adminstators نسبت داده می شوند به تمام پایگاه داده دسترسی خواهند داشت حتی اگر درمرحله 11 آنها را انتخاب نکنید .
(شکل 12) 13 دکمه Finish راکلیک کنید این ویزارد پیغامی مبنی بر اتمام کار و ساخته شدن Login جدید نمایش می دهد ( شکل 13 ) مدیریت Login ها همانطور که بقیه اشیاء پایگاه داده به مدیریت و نگهداری نیاز دارند شناسه های کاربران نیز ممکن است در طول زمان تغییر کنند مثلا ممکن است لازم باشد که رل امنیتی نسبت داده شده به یک Login ویا پایگاه داده قابل دسترس آن راتغییر دهیدویا در بعضی شرایط ممکن است بخواهید یک Login رابه طور کامل حذف کنید تمام این کار ها با استفاده از Enterprise Manager بسیار ساده هستند .
امنیت در سطح پایگاه داده در سطح پایگاه داده هر یک از Login ها به یک کاربر پایگاه داده مربوط می شوند اگر چه Login به یک شخص امکان میدهد که به یک نمونه ازServer SQL دسترس مجاز داشته باشند ولی باید بدانیم که به یک پایگاه داده خاص دسترسی نخواهد داشت مگر آنکه به عنوان یک کاربر آن پایگاه داده تعریف شود .
همانطور که Login ها به رل های سرویس دهنده نسبت داده می شوند به این ترتیب حق دسترسی آنها در سطح سرویس دهنده مشخص می گردد کاربران یک پایگاه داده نیز رل های آن پایگاه نسبت داده می شوند واز این طریق سطح دسترسی به پایگاه داده تعیین می گردد .
کاربران پایگاه داده هنگامی که با استفاده از ویزارد Login Creatیک Login می سازید ودسترسی به یک یا چند پایگاه داده را برای وی میسر می سازید این Login به طور اتوماتیک به لیست کاربران آن پایگاه ها اضافه می شود ولی وقتی یک پایگاه داده جدیدی می سازید Login های موجود به عنوان کاربران آن منظور نمی شوند بلکه خود شما باید Login های مورد نظر تان را به لیست کاربران آن پایگاه داده اضافه کنید .
خلاصه : در این مقاله اطلاعات مربوط به مدهای امنیتی SQL سرور و امنیت SQL سرور را بررسی نمودیم نکته ای که می بایست به هنگام تعیین امنیت در نظر داشته باشید آن است که باید شکاک باشید پس از آن با ID های برقراری ارتباط ID های کاربری ونقش ها آشنا شوید دانستن آنها برای چگونگی مدیریت مهم است چرا که چگونگی کنترل دستیابی به سرویس دهنده را تعیین می کند .
معرفی و مقدمه برنامه های کاربردی Web SQL njection, مرور کلی SQL njection شیوه ای است که برنامه های کاربردی Web به کار می رو د و مشتریان می توانند اطلاعات را از طریق query های SQL مرون اینکه ابتدا کاراکترهای مضرر را به صورت بالقوه ای stripping potentially جدا کنند فراهم می کند موضوع این مقاله در مورد آموزش تکنیکهای استفاده از برنامه های کاربردی Web که درمقابل SQLinjection آسیب پذیر هستند و مکانیسم محافظت در مقابل SQLinjection وبه طور کلی مشکلات معتبر سازی ورودی باشد .
سابقه قبل از خواندن این مقاله باید درک اولیه از چگونگی کار پایگاههای داده ای و استفاده ازSQL برای دستیابی به آنها داشته باشیم .
به رمز در آوردن کاراکترها در بیشترbrowser Web ها کاراکترهای نشانه گذاری وبسیاری سمبل های دیگر باید قبل از اینکه دریک درخواست استفاده شوند به صورت URL به رمز در آورده شوند در این مقاله از کاراکترهای عادی ASCII در مثالها و عکسها استفاده شده است .
آزمون آسیب پذیری 2.1 آزمون جامع چک کردن برنامه های کاربردی Web برای آسیب پذیری نسبت به SQLInjection به نظر ساده می رسد آنچه که ما می بینیم فرستادن یک quote اولین ارگومان script و برگرداندن یک صفحه سفید با یک خط که اشتباه ODBC را نشان می دهد به وسیله سرور می باشد ولی بررسی جزئیات آسیب پذیر بسیار مشکل است .
همه پارامترهای موجود در هرSCRIPT باید همیشه چک شوند برنامه نویسی کهScript A را طراحی می کند هیچ کاری با گسترش Script B ندارد و ممکن است در جایی SQL injection A که نسبت به مصون است B آسیب پذیر باشد حتی وقتی برنامه نویسی روی تابع A از Script کار می کند هیچ کاری به تابع Bدر همان Script ندارد ومثلا ممکن است تابع A به آسیب پذیر باشد ولی B نباشد وقتی کل یک برنامه کاربردی Web به وسیله یک نفر برنامه نویس طراحی کد گذاری و تست می شود ممکن است فقط و فقط یک پارامتر در یک Script در بین هزارانScript پارامتر در هزاران آسیب پذیر باشد که می تواند به خاطر این باشد که توسعه دهنده به هر دلیلی در مورد آن داده در آن محل مطابق اصول رفتار نکرده است پس هیچ گاه نمی توان مطمئن بود و باید چک کرد .
2.2 فرایند آزمون آرگومان هر پارامتر را به وسیله یک Quoteتنها و کلمات کلیدی SQL مثل WHERE جایگزین کنید هر پارامتر باید به صورت منفرد تست شود البته در هنگام تست هر پارامتر بقیه پارامترها باید بدون تغییر باشد ممکن است تصور شود که بهتر است برای ساده تر شدن داده های اصامی را پاک کرد و به خصوص باکار بردهایی که صفی از پارامترها دارند و مربوط به هزاران کاراکتر است ولی این کار باعث کارابنون کاربرد در زمینه های دیگر می شود که باعث می شود که نتوانیم مطمئن شویم که SQLinjecttion در آن محل ممکن است یا خیر برای مثال فرض می کنیم خط پارامتر زیرکاملا قابل دسترس و تغییر ناپذیر است .
Contact Name= Maria% 20 Qanders & company Name = Alfreds % 20 futter kiste وخط پارامتری زیر به شما اشتباه ODBC را می دهد .
Contact Name= Maria% 20 Qanders & company Name= 20 OR که با چک کردن این خط : Company Name = به شما اشتپاهی را می دهد که می گویند باید مقدار Contact Name مشخص شود این خط : Contact Name= Bad Contact Name& company Name= همان صفحه ای را می دهد که درخواستی که اصلا Contact Name را مشخص نمی کند می دهد .
یا ممکن است home page پیش فرض سایت رابدهد ویا وقتی می نتواند Contact Name مشخص را پیدا کند Company Name نگاه می کند بنابراین ممکن است حتی آرگومانی از پارامتر دستور العمل SQLراهم بر نگرداند یا ممکن است چیزی کاملا متفاوت به شما بدهد بنابراین در چک کردنinjection SQL باید خط پارامتر ها کاملا نوشته شود وهمه آرگومانها بجز آن پارامتری که شما درستی ارزش آن را چک می کنید داده شود .
2.3 ارزیابی نتایج اگر یک پیغام خطای سرور پایگاه داده از انواعی که گفته شد دریافت کردید injection مطمئنا موفقیت آمیز بوده است هر چند پیغامهای خطای پایگاه داده همیشه واضح نیستند در اینجا هم توسعه دهنده ها کارهای عجیبی انجام داده اند بنابراین شما باید در هر جای ممکن دنیای شاهدی برای injectionموفقیت آ”میز باشید اولین کاری که باید انجام دهید این است که در کل منبع صفحه بر گردانده شده کلماتی مانند SQL Server ODBC وغیره را جستجو کنید جزئیات بیشتر در مورد ماهیت خطا می تواند در ورودی دستور العمل وغیره مخفی باشد باید قسمت header چک شود برنامه های کاربردی Web ی وجود دارند که هیچ اطلاعاتی درمورد پیغام خطا در بدنه پاسخ HTTP آنها وجود ندارد ولی پیغام خطای پایگاه داده در قسمت header آنها وجود دارد .
شما نه تنها باید فورا صفحه برگردانده شده را چک کنید بلکه باید صفحات Link شده هم چک شوند درطول چک کردن ممکن است با پیغامهای خطای عمودی در پاسخ به حمله SQLinjection مواجه شوید که با click کردن در شمایل بعد از پیغام می توانید به صفحات link شده بعدی رفته وپیغام خطای SQL سرور را به طور کامل ببینید .
موردی دیگری که باید بررسی شود direct محور 302 صفحه است که در آن پیام خطا بررسی شده و می توانید آن را ملاحظه کنید .
البته باید به این نکته توجه کرد که ممکن است SQLinjection دریافت پیغام خطای ODBC هم موفقیت آمیز باشد بیشتر اوقات یک صفحه پیغام خطای عمومی با فرمت مناسب دیده می شود که به شما می گویند که یک خطای داخلی سرور یا یک مشکل پردازش درخواست شما وجود دارد برخی از برنامه های کاربردی Web طوری ساخته شده اند که در صورت ایجاد یک خطا از هر نوع ،مشتری به سایتهای صفحه اصلی برگردانده می شود .
3- حمله ها 3.1 اجازه عبور ساده ترین روش SQLinjection عبور دادن ( By passing) لوگین های دارای شکل ( form – based logins) است بیایید فرض کنیم که برنامه کاربردی Web به صورت زیر باشد .
SQL Query = SELECT Username FROM Users WHERE Username = & Str Username & AND Password = & str password & Str Authchck = CetQuery Resul LSQL Query ) IF Strauttcheck = Then Bool Authentia ted = false ELSE Bool Authenticated = Trae End IF این اتفاقاتی است که وقتی کاربردPassword , username ارائه می دهد می افتد .
queryبه جدول کاربر می رود و چک می کند که آیا سطری وجود دارد که Password , username آن سطراست با آنچه کار بر وارد کرده مطابقت داشته باشد اگر چنین سطری یافت شد username ، د رمتغیر Str Athcheck ذخیره می شود که نشان می دهد که کاربر بامتغیر شود واگر سطری که با داده های کاربر مطابقت داشته باشد یافت نشود Str Athcheck حاکی می باشد وکاربر نباید معتبر شود .
اگر Password , username شامل کاراکترهایی که شما می خواهید باشند می توانید ساختار Qvery اصلی SQL را طوری اصلاح کنید که اگر Password , username یا معتبر نمی شناسید نام معتبری به وسیله Qvery به شما برگردانده شود فرض کنیم کاربر فرم Login را به صورت زیر پر کند .
Login= OR = Password : OR = در اینحالت به SQL Qveryمقادیر زیر را می دهد .
SELECT Username from user WHERE User name = OR = AND Password : OR = به جای اینکه Query داده دریافت شده از کاربر با جدول کاربر موجود مقایسه کندnothing را با nothingمقایسه می کند که مطمئنا همیشه درست است ( توجه داشته باشید که nothing باnull فرق می کند ) از آنجایی که تمام شرایط در WHERE در نظر گرفته می شوندUser name از ردیف اول در جدول انتخاب میشود اینuser name به Str Authcheck فرستاده می شود تا اعتبار آن مشخص شود .
3.2 انتخاب کردن در حالتهای دیگر باید قسمتهای مختلف qvery های SQLمربوط برنامه های کاربردی Web را از پیامهای خطای برگردانده شده مرور کنید برای انجام چنین کاری باید بدانید که پیام خطای ارائه داده شده چه معنی می دهد و چگونه باید رشته Injection برای مقابله با این خطاها دنبال شود .
3.2.1 دستور دادن در مقابل Quoted اولین خطایی که معمولا با آن مواجه می شوید خطاهای لغوی هستند خطای لغوی نشان می دهد که query با ساختار مناسب query درSQL مطابقت ندارد اولین چیزی که باید بفهمیم این است که آیا Injection بدون qvotation امکان پذیر است یا خیر .
در Injection direct هر آرگومانی که شما استفاده می کنید بدون هیچ متغیری در SQL query استفاده می شود اگر با قرار دادن ارزش درست پارامتر و اضافه کردن یک فاصله و کلمه OR به آن خطایی ایجاد شود ، Injection direct ممکن است مقدارهای مستقیم می توانند به صورت مقدارهای عددی در دستور العمل WHERE استفاده شوند .
SQL String SELECT First name , last Name , Titte FROM Empolyees WHERE Employee= & int Employee ID یا آرگومانی از کلمات کلیدی SQL مثل نام جدول یا نام ستون همانند .
SQL String SELECT First name , last Name , Titte FROM Empolyees ORDER BY & Strcolumn در یک injection quotedهر آرگومانی که شما بنویسید دارای یک quote است که به وسیله کاربرد به آن اضافه شده است مانند .
SQL String SELECT First name , last Name , Titte FROM Empolyees WHERE Employee ID = & Strcty& همه انواع دیگر نسبت به injection quoted آسیب پذیر هستند در injection quoted هر آرگومانی که ارائه می دهید همراه با یک quote است و به وسیله یک درخواست به آن پیوسته شده است .
مانند : SQL String SELECT First name , last Name , Titte FROM Empolyees WHERE Employee ID = & Strcty& برای بیرون آمدن از quotes ودرست انجام شدن query در حالی که query از لحاظ لغوی معتبر بماند باید ریشه injection قبل از استفاده از کلمات کلیدی SQL دارای یک quote باشد مانند ودر دستور العمل حال برای نشان دادن شکل Cheating ( تقلب ) SQL سرور هر چیزی که را بعد از باشد .
نادیده می گیرد ولی این تنها سروری است که این کار را انجام می دهد وبهتر است یاد بگیریم که چگونه به این کار را در شرایط سخت انجام دهیم تا اگر با MYSQL DB/2 , Oracleیا هر نوع سرور پایگاه داده دیگری کار می کنیم بتوانیم از آن استفاده کنیم .
3.2.2 اتصال اساسی query های SELECT برای بازیابی اطلاعات از پایگاه داده استفاده می شوند بیشتر برنامه های کاربردی Web که ازمحتویات پویا از هر نوعی استفاده می کنند ، صفحاتی را می سازند که از اطلاعات بدست آمده از query های SELECT استفاده می کنند .
در بیشتر اوقات قسمتی از QUERY که می توانید اداره کنید قسمت WHERE است برای تغبیر دادن قسمتWHERE یکquery برای اینکه بتواند رکوردی بجز آنهایی که باید برگرداند اضافه کردن UNION SELECT است یک UNION SELECT اجازه ایجاد چند query SELECT در یک دستور العمل را می دهد به مثال زیر توجه کنید .
SELECT Company name FROM Shippers WHERE 1= 1 UNION ALL SELECT Company name FROM Costomers WHERE 1= 1 که این مجموعه رکوردهای query اول و query دوم را باهم نشان می دهد کلمه ALL برای فرار از برخی دستور العمل های SELECT Dis TINCT ضروری است باید مطمئن شد که اولین Query یعنی query ی که توسعه دهنده های برنامه های کاربردی Web برای اجرا تغییر داده اند هیچ رکوردی بر نگردانده است این کار مشکل نیست فرض کنیم روی Script با کدهای زیر کار می کنیم .
SQL String SELECT First name , last Name , Titte FROM Empolyees WHERE City = & strcity & واز رشته زیر استفاده می کنیم .
UNION ALL SELECT Other Field FROM Other Table WHERE = این کار منجر به فرستادن زیر به سرور پایگاه داده می شود .
SQL String SELECT First name , last Name , Titte FROM Empolyees WHERE City UNION ALL SELECT Other Field FROM Other Table WHERE = این اتفاقاتی است که می افتد : موتور پایگاه داده در جدول Empolyees دنبال سطری که City در آن برابر Nothing است می گردد از آنجایی که چنین سطری را پیدا نمی کنید هیچ سطری بر گردانده نمی شود تنها رکوردی که ممکن است برگشت داده شود .
از query اضافه شده است دربعضی حالتها استفاده از Nothing درست نمی باشد چون ممکن است برخی موجودیت ها درجدول مقدار Nothing دارند یا دربرخی برنامه های کاربردی Web به کاربران Nothing باعث انجام کاری دیگر می شود تنها کاری که باید انجام دهیم این است که از مقداری که در جدول اتفاق نمی افتد استفاده کنیم مثلا وقتی با اعداد سرو کار داریم می توانیم از صفر ویا اعدادمنفی استفاده کنیم برای حالت text می توان از رشته هایی مثل Notintable Nosuch Record ویا رشته هایی مثل Sjdhalksjhalka استفاده کرد .
3.2.3 پرانتر .
اگر خطای لغوی در رشته ذکر شده پرانتز داشته باشد ( مثل پیغام SQL سرور که در مثال زیر استفاده شده ) ویا پیامی دریافت کردید که صریحا در مورد نداشتن پرانتز بود Orecle این کار را انجام می دهد یک پرانتز به قسمت WHERE مشکل را در رشته اضافه شده ویک پرانتز به قسمت اضافه کنید در برخی حالات .
احتیاج است که از دو یا بیشتر پرانتز استفاده کنید در اینجا که استفاده شده در Parenthesis asp را می بینیم My SQL = SELECT, last Name , First name Titte Notes Extension FROM Empolyees WHERE City & Strcity & ) بنابراین وقتی مقدار ) UNION SELECT Other field FROM other Table WHERE ( = را اضافه کنید query زیر به سرور فرستاده می شود .
My SQL = SELECT, last Name , First name Titte Notes Extension FROM Empolyees WHERE City = ) ) UNION SELECT Other field FROM other Table WHERE ( = 3.2.4 query های LTKE مشکل دیگر که معمولا به وجود می آید در قسمت LTKE است دیدن کلمه کلیدی LTKE یا علامت درصد در پیغام خطا نشان دهنده چنین حالتی است که اغلب توزیع جستجو ازQuery SQLهای با جملات LTKE مثل زیر استفاده می کنند .
SQL String = SELECT First name , last Name , Titte FROM Empolyees WHERE last Name LTKE% & Str last Name Search & % علامت های درصد Wildcard هستند ، بنابراین در این حالت جمله WHERE می تواند درهر حالتی که Str last Name Search در هر جایی در ظاهر نشده باشد مقداری درست را بر گرداند