PDA

View Full Version : مزایا و معایب اجرای یک رشته توسط exec



Arash_janusV3
شنبه 16 دی 1391, 21:54 عصر
درود بر دوستان
فرض کنیم یک sored داریم با این مشخصات

create procedure [dbo].[string_select]
(
@string varchar(max)
)
as
exec (@string)

یک رشته را دریافت می کند و آن را اجرا می کند
رشته می تواند یک select و یا insert و ... باشد
استفاده از این روش بسیار کاربردی هستش
چون به طور چشمگیری تعداد stored ها را کاهش می ده و دیگه مجبور نیستیم برای هر کاری یک stored بسازیم
به راحتی می توانیم رشته مورد نظر را در زبان برنامه نویسی بسازیم و آن را به این stored پاس بدیم
همون طور که گفتم ما فقط به همین stored نیاز داریم و همیشه همین را صدا می زنیم
غیر از اون سرعت اجرا به مراتب روان تر خواهد شد
برای تست هم چندین select را ترکیب کردم و در stored ریختم مدت اجرای خروجی آن 3 ثانیه بود
ولی وقتی به عنوان رشته اجرا کردم اجرای اون به زیر 2 ثانیه رسید
فقط تنها مسئله ای که وجود دارد اینه که در یک بانک اطلاعاتی ممکنه بیش از 1000 stored وجود داشته باشه
و قرار همه را به زبان برنامه نویسی انتقال داد و فقط یک stored که اون هم کارش فقط اجرای رشته هستش تبدیل کنیم
به نظر شما این حجم اجرا مشکلی را پیش نمی آورد؟
آیا تحت شبکه بودن اجرای این stored مشکلی پیش نمی آید؟
این روش اگر اشکالی دارد لطفا مطرح کنید
با سپاس فراوان

Mahmoud.Afrad
شنبه 16 دی 1391, 23:37 عصر
اولین و شاید بزرگترین مشکل این نوع اجرای کوئری ، SQL Injection هست. همونطور که خودتون گفتید کوئری در برنامه ساخته میشه و به SP پاس داده میشه و در نهایت رشته به عنوان کوئری اجرا میشه. ساخت خود رشته کوئری هم بدون پارامتر صورت میگیره.
پس از لحاظ امنیت ، این روش با روشی که بدون پارامتر و بدون استفاده از SP انجام میشه یکی هست.(یعنی عملا امنیت نداره).

یوسف زالی
یک شنبه 17 دی 1391, 03:39 صبح
سلام.
اصلا علت وجود اون SP چی می تونه باشه وقتی در همون زبان شیئی وجود داره با نام Command که یک رشته رو اجرا می کنه؟
(البته خودم می دونم!! اما برای کارهای معمولی دلیلی نداره این کار رو کنیم).
همون طور که گفتند Inject یکی از معایبشه.
عیب دیگه کند تر بودنه.
این که می گید استور 3 ثانیه طول کشید قبول، اما بار دوم همون استور چقدر طول کشید؟ (ترجمه شدن - بهینه شدن و کش شدن)
برای ارسال یک همچین Parameter ی معمولا VarChar(Max) -- sql نیازه و این یعنی اضافه بار.
فرض کنید در یک SP لازم باشه بخشی از محاسبات یک SP دیگه استفاده بشه. در روش شما تکلیف چیه؟
اشکال دیگه Trace نشدن در Management هست. شما نمی تونید در Management همچین چیزی رو Trace کنید اما می تونید SP رو خط به خط Trace کنید.
امکانات دیگه ای رو هم از دست می دید. مثل اصلاح یک SP به جای یک EXE.
البته ممکنه مزایایی هم وجود داشته باشه ولی همین معایب من رو منصرف می کنه.

Arash_janusV3
یک شنبه 17 دی 1391, 19:12 عصر
من از این روش زمانی استفاده می کنم که تا حدود 100 درصد مطمئنم دیگر کوئری تغییر پیدا نخواهد کرد
یعنی ابتدا stored را می سازم و تمام متغیرها و یا جداول و ... را پیاده می کنم و سپس اقدام انتقال به سورس را انجام می دم
ولی به نظر من هر روشی معایب خودش را داره
اما با این روش اصلاح query خیلی سریعتر انجام می شه
در مورد اجرای نمونه کوئری که مثال زدم و زمان آن به 3 ثانیه رسیده بود
باید بگم که حداقل ترین زمان را محاسبه کردم یعنی چند بار اجرا کردم تا به حداقل برسم و اون را هم تست کردم البته در سیستم های متفاوت هم کلاینت و هم شبکه تست کردم

اما موضوع اینجاست اتفاقات احتمالی چی می تونه باشه؟

Mahmoud.Afrad
سه شنبه 19 دی 1391, 13:14 عصر
در مورد sqlinjection : شما فرض کن برای ساخت کوئری از داده ی یک تکست باکس استفاده کرده باشید. خوب در این صورت کنترلی روی داده تکست باکس ندارید چون نمیتونید در این حالت کوئری رو با پارامتر بسازید و مجبور هستید از الحاق رشته ها استفاده کنید. و کاربر اگر به sql آشنایی داشته باشه به طور مثال با یک دستور که در این تکست باکس وارد میکنه میتونه کل دیتابیس شما رو به فنا بده.

یوسف زالی
سه شنبه 19 دی 1391, 15:11 عصر
البته می شه کنترل کاراکتری روی باکس گذاشت.
چیزی مثل ASP.
اما باز هم این روش رو درست نمی دونم.