SQL Server

مقدمه :يكي از نكات مهم مديريت يك پايگاه داده حصول اطمينان از امنيت اطلاعات است شما بايد مطمئن باشيد هر شخص كه لازم است به طور قانوني به اطلاعات دسترسي داشته باشد مي تواند به آنها را بدست آورد ولي هيچ كس نمي تواند بدون اجازه به آنها دسترسي داشته باشد .نياز به امنيتقبل ازاينكه به بحث در مورد امنيت در 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 Server1- سرويس دهنده مورد نظر خود را دركنسول درختي انتخاب كنيد سيستمي از اشياء آن سرويس دهنده در منطقه جزييات ظاهر مي شود . ( شكل 1)2- دكمه Wizard موجود بر روي نوار ابزار Enterprise Manager را كليك كنيد .Server SQL كاردرمحاوره اي Slect Wizardرا نشان مي دهد (شكل 2)3- آيتم Creat Login Wizardموجود در قسمت Data bases را انتخاب نمود سپس دكمه ok را كليك كنيد اولين صفحه اين ويزارد توسطServer SQL به نمايش در مي آيد ( شكل 3)4- دكمه Next را كليك كنيد ويزارد صفحه اي رانشان مي دهد كه مدل شناسايي را از شما درخواست مي كند (شكل 4)5- ايتم دوم را انتخاب نماييد . ( شكل 5)6- دكمه Next را كليك كنيد در صفحه بعدي شناسه كاربر و كلمه عبور را از شما درخواست مي شود ( شكل 6)7- كلمه Test IDرابه عنوان نام وارد كرده و دكمه عبور دلخواه خود را نيز تايپ كنيد ( شكل 7)8- دكمهNext را كليك كنيد ويزارد از شما سوال مي كند كه اين Login را به كداميك از رل هاي امنيتي نسبت دهد . (شكل 8 )9- اين Login را به رل System Adminstrator نسبت دهيد (شكل 9 )10- دكمه Next را كليك كنيد درصفحه بعدي بايد پايگاه هايي را كه اين Loginبه آنها دسترسي دارد مشخص نماييد ( شكل 10 )11- اين Login را به پايگاه داده Aromatherapy نسبت دهيد ( شكل 11 )12- دكمه 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 هاي كاربري ونقش ها آشنا شويد دانستن آنها براي چگونگي مديريت مهم است چرا كه چگونگي كنترل دستيابي به سرويس دهنده را تعيين مي كند .معرفي و مقدمه1- برنامه هاي كاربردي Web SQL njection,1.1 مرور كلي SQL njectionشيوه اي است كه برنامه هاي كاربردي Web به كار مي رو د و مشتريان مي توانند اطلاعات را از طريقquery هاي SQL مرون اينكه ابتدا كاراكترهاي مضرر را به صورت بالقوه اي stripping potentially جدا كنند فراهم مي كند موضوع اين مقاله در مورد آموزش تكنيكهاي استفاده از برنامه هاي كاربردي Web كه درمقابل SQLinjection آسيب پذير هستند و مكانيسم محافظت در مقابل SQLinjection وبه طور كلي مشكلات معتبر سازي ورودي باشد .1.2 سابقهقبل از خواندن اين مقاله بايد درك اوليه از چگونگي كار پايگاههاي داده اي و استفاده ازSQL براي دستيابي به آنها داشته باشيم .1.3 به رمز در آوردن كاراكترهادر بيشترbrowser Web ها كاراكترهاي نشانه گذاري وبسياري سمبل هايديگر بايد قبل از اينكه دريك درخواست استفاده شوند به صورت URLبه رمز در آورده شوند در اين مقاله از كاراكترهاي عادي ASCIIدر مثالها و عكسها استفاده شده است .2- آزمون آسيب پذيري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 = ThenBool Authentia ted = falseELSEBool Authenticated = TraeEnd 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 = ANDPassword : 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 EmpolyeesWHERE Employee= & int Employee IDيا آرگوماني از كلمات كليدي SQLمثل نام جدول يا نام ستون همانند .SQL String SELECT First name , last Name , Titte FROM EmpolyeesORDER BY & Strcolumnدر يك injection quotedهر آرگوماني كه شما بنويسيد داراي يك quote است كه به وسيله كاربرد به آن اضافه شده است مانند .SQL String SELECT First name , last Name , Titte FROM EmpolyeesWHERE Employee ID = & Strcty&همه انواع ديگر نسبت به injection quoted آسيب پذير هستند در injection quoted هر آرگوماني كه ارائه مي دهيد همراه با يك quote است و به وسيله يك درخواست به آن پيوسته شده است .مانند :SQL String SELECT First name , last Name , Titte FROM EmpolyeesWHERE 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 SELECTCompany 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 EmpolyeesWHERE City = & strcity &واز رشته زير استفاده مي كنيم .UNION ALL SELECT Other Field FROM Other Table WHERE =اين كار منجر به فرستادن زير به سرور پايگاه داده مي شود .SQL String SELECT First name , last Name , Titte FROM Empolyees WHERE CityUNION 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 FROMother Table WHERE ( =را اضافه كنيد query زير به سرور فرستاده مي شود .My SQL = SELECT, last Name , First name Titte Notes Extension FROM Empolyees WHERE City = ) ) UNION SELECT Other field FROMother Table WHERE ( =3.2.4 query هاي LTKEمشكل ديگر كه معمولا به وجود مي آيد در قسمت LTKE است ديدن كلمه كليدي LTKE يا علامت درصد در پيغام خطا نشان دهنده چنين حالتي است كه اغلب توزيع جستجو ازQuery SQLهاي با جملات LTKE مثل زير استفاده مي كنند .SQL String = SELECT First name , last Name , Titte FROM EmpolyeesWHERE last Name LTKE% & Str last Name Search & %علامت هاي درصد Wildcardهستند ، بنابراين در اين حالت جمله WHERE مي تواند درهر حالتي كه Str last Name Search در هر جايي در ظاهر نشده باشد مقداري درست را بر گرداندرشته اي كه برنامه كاربردي Web به ورودي كاربر اضافه مي كند معمولا يك علامت درصد يا يك ( و معمولا پرانتز ) مي باشد كه بايد به جمله WHERE در رشته اضافه شده هم عينا اضافه شود .3.2.5 بن بست .موقعيتهايي وجود دارند كه بدون تلاش قابل مقابله نيستند بعضي اوقات ممكناست با queryهايي مواجه شويم كه به نظر مي آيد نمي توان از آنها بيرون آمد واصلا مهم نيست كه چه مي كنيد فقط مرتبا پشت سرهم با پيغام خطا مواجه مي‌شويد .بيشتر اوقات اين به خاطر اين است كه شما در يك تابعي درجملهWHERE در يك انتخابي كه آرگوماني از يك تابع ديگر است و خروجي آن داراي رشته اجرايي است كه بعدا در جمله LIKE استفاده مي شود گير مي كنيد نهSQL سرور مي‌تواند در چنين حالاتي به ما كمك كند .3.2.6متناسب نبودن ستون عددي .اگر اشتباه لغوي را دفع كنيد سخت ترين حل شده است پيغام خطاي بعدي درمورد نام نامناسب براي جداول است بايد يك نام معتبر براي جدول سيستم از ضميمه اي كه مربوط به سرور پايگاه داده اي است كه با آن كار مي كنيد انتخاب كنيد .احتمالا لغزش با پيغام خطايي كه درمورد تفاوت در تعداد فيلدها query‌هايUNION SELECT , SELECT هستند مواجه مي شويد .در تعداد ستونهاي مورد درخواست در query منطقي را بيابيد فرض كنيم اينكه برنامه كاربردي Webي است كه شما با آن سروكار داريد .SQL String = SELECT First name , last Name , Empolyees ID FROM EmployeesWHERE City = & strcitySELECTمنطقي و UNION SELECT اضافه شده بايد در جمله WHERE ستونهاي مساوي داشته باشند در حالت قبل هر دو بايد سه ستون داشته باشند نه تنها تعداد ستونها بلكه نوع آنها هم بايد با هم مطابقت داشته باشند اگر First name ازنوعstring است فيلد مربوط در رشته اضافه شده هم بايد از نوعstring باشد .البته در سرور SQL قرار دادن داده عددي درحالت Charمشكلي نداردچون اعداد مي توانند به رشته تبديل شود ولي قرار دادن text درستون smallintغير قانوني است زيرا text نمي تواند به injeger تبديل شود چون نوع عددي به راحتي بهstring تبديل مي شودولي عكس آن ممكن نيست مقدار پيش فرض رااز نوع عددي درنظر مي گيريم .براي بدست آوردن تعداد ستونهايي كه لازم داريد براي مطابقت مقاديري را به UNION SELECT اضافه كنيد تا جايي كه دريافت پيغام خطاي عدم مطابقت ستون عددي را متوقف شود اگر باخطاي عدم تطابق نوع داده مواجه شويد نوع داده ستون مورد نظر را از عدد تا حروف تغيير دهيد . برخي اوقات به محض ايجاد يك نوع داده غلط با پيغام خطاي محاوره مواجه مي شويد و بقيه اوقات خطاي محاوره وقتي شما شماره درست ستون را مطابقت داديد دنبال ستوني كه خطا را ايجاد كرده مي گرديد ايجاد مي شود .اگر همه چيز به خوبي پيش برود شما صفحه اي باهمان ساختار فرمت نوع منطقي آن دريافت مي كنيد هر جايي كه از محتويات پويا استفاده مي شويد بايد نتايجquery اضافه شده را دريافت كنيد .3.2.7 ستون WHERE اضافيبرخي اوقات مشكل شرطWHERE اضافي اضافه شده به queryبعد از رشته اضافي شده است .مثلا به خط كه زير توجه كنيد .SQL String = SELECT First name , last Name , title FROM EmployeesWHERE City = & strcity & AND Country = USAاگر بخواهيم با query به صورت يك direct injectionمستقيم برخورد كنيم query به صورت زير خواهد بودSELECT First name , last Name , title FROM EmployeesWHERE CityNosuch city UNION ALL SELECT other field FROM other table WHERE 1=1 AND Country = USAكه پيغام خطاي زير را ايجاد مي كند .[ Microsoft ] [ ODBC SQL Server Driver ] [ SQL Server ] invalid colvmn nam countryمشكل اين جاست كه query اضافه شده جدولي در FROM ندارد كه ستوني به نام Contry در آن باشد دو راه براي حل اين مشكل وجود دارد تقلب واستفاده از پاين دهنده اگر از SQL كردن آن به سرور استفاده مي كنيد ، يا حدس نام جدولي كه ستون شكل دار در آن است واضافه كردن آن به .FROM3.2.8 جدول ونام فيلدحال كه كار injection را تمام كرديد بايد تصميم بگيريد كه از كدام جدولها و كدام فيلد اطلاعات را باز پس بگيريد در SQL سرور را حتي مي توانيد نام تمام جداول وستونها را در پايگاه داده بگيريد Access , oracle بسته به مزيتهاي accountكه برنامه هاي كاربردي Webبا آن به پايگاه داده دسترسي دارد . ممكن است .در اينجاSQL سرور Sysobject وsyscolumns ناميده ميشوند ( سيستمي از جدولهاي سيستم براي سرورهاي پايگاه داده هايي ديگر در انتهاي اين متن است دانستن نام ستونهاي شما به در آن جدولها ضروري است ) در اين جدولها نيستي از همه جدولهاو ستونها در پايگاه داده وجوددارد براي گرفتن ليست جدولهاي كاربر درSQL Server از injection query زير استفاده مي كنيم .SELECT name FROM Sysobjects WHERE Xtype = Uاين دستور نام تمام جداولي كه توسط كاربر تعريف شده اند را در پايگاه داده بر مي گرداند ( اين كاري است كه Xtype = Uانجام مي دهد ) مي توانيد نام فيلدها را درجدول باinjection query مشابه زير بدست مي آوريد.SELECT name , FROM syscolmns WHERE id ( SELECT id FROM SysobjectsWHERE name = ( orders)3.2.9 سيكل تك ركوردياگر ممكن بود دستور العملي را به كار ببريد كه تا جايي كه مي تواند نتايج بيشتري را بر گرداند .با استفاده tool مي توانيد براي اين كار استفاده كنيد چون براي برگرداندننتايج از سطرهاي مختلف به صورت يكي ساخته شده است برخي دستور العمل ها براي استفاده از يك ركورد در خروجي شان وناديده گرفتن بقيه ساخته شده اند . مي توانيد از injection queryطوري استفاده كنيد كه به آرامي ولي با اطمينان اطلاعات مورد در خواست خود را به طوركامل دريافت كنيد .منابع :1-SQL Server نويسنده : Rebecca M.Riordan (2000) .2-SQL Server 7 نويسنده : Matio Shepker3- سايت هاي اينترنتي :www.SPI Dynamics.comwww.ODBCBackkgrounder.comنویسنده : سید شاهین موسوی استاد: دکتر مریم حاجی اسمعیلی. دکترای علوم کامپیوتر از دانشگاه کینگستون لندنDr.Maryam HajiesmaeiliPhD of computer science from Kingston university of London