View Full Version : گفتگو: در مورد Stored Procedure ها و رفع مشکل Injection
VB.NET2005
جمعه 08 شهریور 1387, 00:28 صبح
با سلام :
دوستان میخاستم کار با SP ها رو شروع کنم واسه رفع مشکل Injection ، هم توی این سایت سرچ کردم و هم گوگل ولی مطالبی که تو این بخش مطرح شده اکثرا" دوستانی اند که مشکلی با SP داشتند و فقط در مورد همون مشکل بحث جلو رفته میخاستم از جناب راد خواهش کنم تاپیک رو پاک نکن تا افراد مبتدی بــیــشــتــر با مبحث مهم امنیت توی برنامه هاشون آشنا بشن (البته میدونم این بخش خیلی کوچکی در این پیرامونه)
خواهشمندم اگه مقاله یا توضیحه مختصری همراه با یه مثال کوچیک داریــن دریغ نکنین .
در ضمن میخاستم بدونم از SP فقط در SQL میشه استفاده کرد یا محدودیتی نداره ؟
.: با تشکر :.
twelve
جمعه 08 شهریور 1387, 00:57 صبح
من که متوجه نشدم دقیقا چه چیزی رو در مورد sp میخواید بدونید
ز SP فقط در SQL میشه استفاده کرد یا محدودیتی نداره ؟
خیر مختص sql نیست
VB.NET2005
جمعه 08 شهریور 1387, 01:01 صبح
مثلا" ما یه دیتابیس داریم که جدولی به نام TB داره و فیلد هاش : Name و Password هست .
میخاستم بدونم چه جوری میشه Select و یا Update و دیگر دستورات SQL رو توی SP بکار برد .
چه جوری میشه نتیجه یک سلکت رو برداریم و . . .
twelve
جمعه 08 شهریور 1387, 01:21 صبح
استفاده از sp به این دلیل از injection جلوگیری میکنه که دستورات sql یک command رو به صورت پارامتریک و تک تک به Sp بفرستیم و در سرور sql اطلاعات پردازش بشن این کار باعث میشه که فضایی برای ورود sql اضافی به برنامه وجود نداشته باشه !
اما برای استفاده کردنش بهتره در این مورد جستجو مطالعه کنید ، زیاد مشکل نیست من یه مثال میذارم که در اون یک عملیات اینزرت به وسیله sp صورت گرفته ادامه کار به عهده خودتون !
کد sp
CREATE PROCEDURE sp_test
@ClubID int,
@Play varchar(50)
AS
INSERT INTO TABLE(ID,PLAY) VALUES (@CLUBID,@PLAY)
RETURN @@IDENTITY
این کد داده هایی را وارد جدول کرده و آخرین شماره فیلد Identity را برمیگرداند
کد VB.NET :
Commad = new sqlCommand("sp_test",connectionstring)
command.commandType=commandType.StoredProcedure
command.parameters.add(new sqlparameter("@ClubID",int))
command.parameters.add(new sqlparameter("@Play",varchar,50))
command.parameters(0).value = Integer
command.parameters(1).value = String
Dim i as integer
Connection.open()
i= Command.ExecuteNonQuery
Connection.close()
Command.Dispose()
این کد هم که واضحه !
milade
جمعه 08 شهریور 1387, 06:45 صبح
سلام دوست عزیز
ویژگی sp :
سرعت بالا
نفوذ ناپذیری بیشتر
تفکیک و کد نویسی کمتر
که این ویژگی sp هاست البته یه مشکل هم دارند که من تا حالا براش چاره ای نیافتم اونم like هست:
مثلا این:
select * from [tbl] like %@xxx%
که اگه این رو توی sp ذخیره کنیم نمی گرده دنبال مقدار @xxx بلکه اونایی که @xxx دارند رو در می اده
بای
VB.NET2005
جمعه 08 شهریور 1387, 12:16 عصر
با تشکر از راهنمایی های شما دوستان :
ببخشید یک سوال دیگه هم داشتم : چه طور میشه مقدار یک Select رو در یک متغیر و یا کلا" مقدارشو بگیریم :
آیا با همین Select میشه :
Select Name From Users Where Username=@Username
mehdi58
جمعه 08 شهریور 1387, 15:37 عصر
با تشکر از راهنمایی های شما دوستان :
ببخشید یک سوال دیگه هم داشتم : چه طور میشه مقدار یک Select رو در یک متغیر و یا کلا" مقدارشو بگیریم :
آیا با همین Select میشه :
Select Name From Users Where Username=@Username
سوالتون یه کم مبهمه !!!
اما اگه منظورتون خروجی Procedure هست , بستگی به نوع خروجی و تعداد رکوردهای نتیجه Query شما داره .
مثلا اگه خروجی یه مقدار از نوع INT هست با Return توی Procedure می تونین اون رو توی برنامه تون بگیرین یا اگه خروجی یه تعدادی رکورده با استفاده از متد Read از SQLCommand , توی برنامه می تونین اون رو بگیرین .
amirferdowsi
جمعه 08 شهریور 1387, 17:26 عصر
سلام
آیا برای جلوگیری از SQL Injection استفاده از Stored Procedure به تنهایی کافیه یا خیر ؟
Behrouz_Rad
جمعه 08 شهریور 1387, 18:54 عصر
البته SP لزوماً نیاز نیست. کلاً اگر از پارامترها برای پاس دادن مقادیر به دستورات SQL استفاده کنید می تونید از SQL Injection جلوگیری کنید. پارامترها می تونن مستقیماً از طریق نوشتن دستورات SQL در کد برنامه هم ایجاد بشن.
موفق باشید.
Azura_stone
چهارشنبه 13 شهریور 1387, 15:21 عصر
سلام دوست عزیز
ویژگی sp :
سرعت بالا
نفوذ ناپذیری بیشتر
تفکیک و کد نویسی کمتر
که این ویژگی sp هاست البته یه مشکل هم دارند که من تا حالا براش چاره ای نیافتم اونم like هست:
مثلا این:
select * from [tbl] like %@xxx%
که اگه این رو توی sp ذخیره کنیم نمی گرده دنبال مقدار @xxx بلکه اونایی که @xxx دارند رو در می اده
بای
دوست من براي اين کار کافي است که دستور Select را در SP در يک متغير رشته اي ريخت و در انتهاي SP آن را اجرا کرد . در اين صورت شما مي تونيد از Like هم استفاده کنيد
مثل اين :
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER PROCEDURE [dbo].[sp_StoreProcedure]
(
@Code nvarchar(100),
@Name nvarchar(100),
@tblName nvarchar(100),
@Value nvarchar(100)
)
AS
declare @str nvarchar(4000)
set @str=' select distinct ' + @Code +','+ @Name +' From '
+ @tblName +' where '+ @Name
+' Like N''' + @Value + ''''
Print (@str)
exec(@str)
milade
چهارشنبه 13 شهریور 1387, 16:32 عصر
حالا مطمعنید کدتون جواب میده؟(تست شده؟)
علیرضا مداح
چهارشنبه 13 شهریور 1387, 22:28 عصر
سلام دوست عزیز،
برای جلوگیری از حملات SQL Injection نکاتی وجود دارند :
1)با اکانتی کار کنید که دارای حداقل دسترسی های مورد نیاز میباشد ،
2)ورودی های کاربر را Validate کنید ،
2)از Stored Procedure استفاده کنید ،
3)Parametrized Queries را در SP فراموش نکنید ،
4)دیتاهای ورودی از سوی کاربر را مجددا" در SP چک و Validate کنید ،
5)در صورت نیاز به اجرای کوئری های پویا (Dynamic Queries) دز SQL Server از sp_executesql به صورت صحیح استفاده کنید و البته اعتبارسنجی داده ها در اینجا نیز توصیه میگردد ،
6)....
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.