PDA

View Full Version : باز هم sql injection



na3er-faraji
جمعه 05 مرداد 1386, 15:55 عصر
همان طور که میدونید راه های مختلفی برای مقابله با sql injection وجود داره که در asp.net میتونیم از پارامترها استفاده کنیم . حالا سوالم اینه که آیا این روش جلوی نفوذ رو به طور 100% میگیره یا نه . منظورم اینه که اگه از پارامترها استفاده کنیم آیا راهی برای نفوذ به برنامه باقی میمونه یا نه . لطفا با یه مثال توضیح بدید و اصلا اینکه روش پارامتری چطوری کار می کنه ؟

Behrouz_Rad
جمعه 05 مرداد 1386, 21:37 عصر
اگر به شکل صحیح از پارامترها استفاده کنی بله.
در کد زیر، من SP ای رو واست مثال زدم که با استفاده از پارامترها ایجاد شده اما در مقابل SQL Injection آسیب پذیر هست:


CREATE PROCEDURE BadDynamicSQL(@userName nvarchar(25))
AS
DECLARE @sql nvarchar(255)
SET @sql = 'SELECT * FROM myTable WHERE UserName = '''
+ @userName + ''''
exec sp_executesql @sql
GO

کوئری فوق از پارامترها استفاده کرده اما پارامتر UserName@ به شکل نادرستی به SP پاس داده شده.
به عنوان مثال اگر من تزریق زیر رو انجام بدم:


';DROP TABLE myTable --

نتیجه ی کوئری فوق به شکل ذیل خواهد شد:


SELECT * FROM myTable WHERE UserName = '';DROP TABLE myTable --'

در نتیجه من تونستم کل Table رو حذف کنم!!!
کوئری صحیح و اصلاح شده ی فوق به شکل ذیل هست:


CREATE PROCEDURE GoodDynamicSQL(@userName nvarchar(25))
AS
DECLARE @sql nvarchar(255)
SET @sql = 'SELECT * FROM myTable WHERE UserName = @p_userName'
exec sp_executesql @sql,
N'@p_userName nvarchar(25)',
@p_userName = @userName
GO

"استفاده از پارامترها به شکل صحیح" همراه با "هندل کردن خطاها در برنامه"، امنیت برنامه رو به میزان بسیار زیادی افزایش میده.

موفق باشید.

nazaninam
جمعه 05 مرداد 1386, 22:08 عصر
من یک Dll ساختم برای جلوگیری از حملات Sql Injection در هنگام Login کردن ( البته نمی دونم تا چه حد عملی هست )
این فایل Dll فقط برای Login کردن کاربر داره
در هنگام new کردن دو تا پارامتر نام کاربری و رمز عبور رو بهش بدید و از دو پارامتر SecureUsername و SecurePassword استفاده کنید !

bashiry
جمعه 05 مرداد 1386, 22:35 عصر
به حملات Xss هم باید توجه بشه.

ولی با یکسری کد اضافه تر میشه راحت جلوی این گونه حملات رو گرفت.

Behrouz_Rad
شنبه 06 مرداد 1386, 07:16 صبح
من یک Dll ساختم برای جلوگیری از حملات Sql Injection در هنگام Login کردن ( البته نمی دونم تا چه حد عملی هست )
این فایل Dll فقط برای Login کردن کاربر داره
در هنگام new کردن دو تا پارامتر نام کاربری و رمز عبور رو بهش بدید و از دو پارامتر SecureUsername و SecurePassword استفاده کنید !
تابع شما مقادیر ورودی رو دستکاری می کنه و در مقابل فیلد های عددی نیز کاری نمیتونه انجام بده!
مقاله ی زیر رو که با یکی از دوستان در مورد همین موضوع بحث کردم با دقت مطالعه بفرمایید:
http://barnamenevis.org/forum/showthread.php?t=68209

موفق باشید.

Behrouz_Rad
شنبه 06 مرداد 1386, 07:27 صبح
به حملات Xss هم باید توجه بشه.

ولی با یکسری کد اضافه تر میشه راحت جلوی این گونه حملات رو گرفت.
برای جلوگیری از حملات XSS کافیست تا برخی کاراکترهایی رو که در HTML مفهوم خاصی دارند، به کد معادل اونها تبدیل کرد.
به عنوان مثال، تبدیل < به ;gt& و یا > به ;lt& و ...
یک کار دیگه می تونه این باشه که اگر احساس میشه که ورودی کاربر تنها Alpha-Numeric هست، با استفاده از Regular Expressions این محدودیت رو تعیین کرد تا کاربر فقط مجاز به وارد کردن کاراکترهای Alpha-Numeric باشه. در غیر اینصورت، تنها راه، تبدیل کاراکترها به معادل آنهاست.

موفق باشید.

na3er-faraji
دوشنبه 08 مرداد 1386, 14:22 عصر
از نظرات دوستان ممنون . اما همان طور که میدانید در دات نت هم کلاس پارامتر وجود داره منظورم


Objcommand.parametrs.addwithbyvalue("@code",txtcode.text)

اینه . کسی از دوستان میدونه این روش چقدر در مقابل نفوذ موثره ؟ و چطوری کار می کنه ؟

Behrouz_Rad
دوشنبه 08 مرداد 1386, 16:44 عصر
برادر!
این که همون پاس دادن پارامتر به SP هست!!!
البته اگر منظورت تعریف دستور SQL در خود برنامه به شکل پارامتریک هست، باید بگم که امنیت اون هم مثل استفاده از SP هست اما مزایای SP ها کجا و این کجا!

موفق باشید.

E_Zabihi
سه شنبه 09 مرداد 1386, 08:59 صبح
سه تا کار بکندید :
1 - واژه های دستورات SQLو ' و < و > را فیلتر کنید ( یا کد معادل اونها را وارد کنید )
2 - چه برای SQL Query و چه برای SP از پارامتر استفاده کنید .
3 - کاربر وب را با حداقل سطح دسترسی SQL User به بانک متصل کنید . فقط اجازه دسترسی به SP های مورد نظرتان را بدهید .

با این کار بحث Injection, XSS منتفی است .

Behrouz_Rad
سه شنبه 09 مرداد 1386, 09:08 صبح
1 - واژه های دستورات SQLو ' و < و > را فیلتر کنید ( یا کد معادل اونها را وارد کنید )
خیر! واژه های دستورات SQL رو فیلتر نکنید! (دلیلش رو در پست 5 بخون)

3 - کاربر وب را با حداقل سطح دسترسی SQL User به بانک متصل کنید . فقط اجازه دسترسی به SP های مورد نظرتان را بدهید .
کاربر وب؟
کاربر وب به چیزی دسترسی نداره!
این برنامه نویس هست که به وسیله ی دستوراتی که مینویسه، محدوده ی عملکرد کاربر رو مشخص میکنه!

موفق باشید.