PDA

View Full Version : کاراکترهای غیر مجاز در sql serevr



saeed_programer
شنبه 26 دی 1383, 11:51 صبح
سلام
من یک سیستم بانک مقالات در فیلد text می ریزد ولی می بینم که هر از چند گاهی به یک مقالاه که وارد میکنم گیر میده بد که خوب اون من را تجزیه میکنم می بینم که کاراکتری

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

AminSobati
شنبه 26 دی 1383, 16:56 عصر
دوست عزیزم،
کاراکتر غیر مجاز چندان مفهومی در این مورد نداره. چون text همه نوع کاراکتر میپذیره. مگر اینکه شما یونیکد(مثلا فارسی) وارد کنین. اگر اطلاعات یونیکد میبایستی ذخیره کنین، از nText استفاده کنین.
موفق باشید..

saeed_programer
یک شنبه 27 دی 1383, 03:42 صبح
آقای Sobati عزیز
من هم دقیقا به همین دلیل از ntext استفده کردم چون دادهای من unicode می باشد
ولی هنگام ورود از یک پروسیجر استفاده می کنم که این پرسیجر در هنگام وارد کردن کاراکتر هائی چون " و \ , > < و کاراکترهای معدود دیگری دچار مشکا میشود و erorr می دهد من برای حل این مشکل یک تابع پیش پردازنده کذاشته ام که این کاراکترها را حذف کند ولی دقیقا نمیدانم که این کاراکترها به طور کلی چه کاراکتر هائی می باشند

vadood
یک شنبه 27 دی 1383, 11:48 صبح
میشه درباره اون پروسیجر بیشتر توضیح بدی؟

AminSobati
یک شنبه 27 دی 1383, 12:37 عصر
میشه درباره اون پروسیجر بیشتر توضیح بدی؟
من هم معتقدم باید در SP مشکلی وجود داشته باشه. چون قرار نیست که مثلا کاراکترهایی مثل موارد مذکور هیچ وقت در SQL Server ذخیره نشن!

Vahid_Nasiri
یک شنبه 27 دی 1383, 14:41 عصر
فقط با ' مشکل وجود دارد. آنرا با '' باید Replace کنید.

AminSobati
یک شنبه 27 دی 1383, 15:17 عصر
زمانیکه اطلاعات از کلاینت توسط SP وارد بشن، علامت ' مشکلی نخواهد داشت(اگر مشکل داشته باشه پس یعنی اینکه این علامت هیچ وقت نمیتونه به تنهایی Insert بشه، در حالیکه اینطور نیست). مگر زمانی که شما String رو در سمت Server یعنی مثلا در SP تعریف میکنین که در این حالت فرمایش شما صحیحه و باید از '' استفاده کرد.
برای راهنمایی سعید عزیز:

DECLARE @tmp NVARCHAR(20)
SET @tmp='Isn''t it cool?'
SELECT @tmp
ولی تاکید میکنم که ارسال String از کلاینت به SP چنین مشکلی نخواهد داشت.
موفق باشید

Vahid_Nasiri
یک شنبه 27 دی 1383, 16:46 عصر
اگر مشکل داشته باشه پس یعنی اینکه این علامت هیچ وقت نمیتونه به تنهایی Insert بشه، در حالیکه اینطور نیست

اینجا در وسط یک عبارت علامت ' به معنای انتهای رشته است (در حالیکه در متن یک مقاله کل آن از نظر ما یک رشته است). بنابراین برای ثبت آن نیاز هست تا escape‌ شود با استفاده از '' .

AminSobati
یک شنبه 27 دی 1383, 19:15 عصر
یعنی شما حتی وقتی از Client اون رشته رو ارسال میکنین، باز هم ' رو با '' عوض میکنین؟

Vahid_Nasiri
یک شنبه 27 دی 1383, 19:48 عصر
فکر می کنم عنوان این تاپیک کمی نامناسب باشد. چون همانطور که شما نیز فرمودید هیچ کاراکتر غیرمجازی برای ثبت در اس کیوال سرور نداریم. در فایلهای XML بله. یک سری کاراکترها همانطور که دوستمان گفتند مجاز نیست(و این جزو اولین نتایج جستجوی گوگل در این نوع موارد است!). و البته این ربطی به ثبت در جداول اس کیوال سرور ندارد.
برای ثبت در اس کیوال سرور تنها یک مورد مشکل زا می شود (برای مثال در asp.net) و آن موردی بود که عرض کردم. برای مثال کلمه ی Ali's book را تحت هیچ حالتی بدون escape کردن ' نمی توان ثبت کرد مگر اینکه relpace‌ شود با '' . (در php و مای اس کیوال هم به همین صورت است. البته در آنجا توابعی مانند stripslashesو غیره کار را ساده تر می کنند. )

در کل دوست ما اگر مایل باشند خطا را از نزدیک ملاحظه کنند ، ابتدا کوئری آنالایزر را باز کنند و سپس یک عبارت اس کیوال insert ساده درست کنند. بعد بجای یکی از رشته ها کل متن مقاله را copy/paste کنند. یکی از خوبی های کوئری آنالایزر رنگی کردن رشته ها است. دقیقا مشخص می شود تا کجا بعنوان یک رشته درنظر گرفته شده و از کجا به بعد رشته و کل عبارت اس کیوال ناپیوستگی و خطا پیدا کرده. (اینجا دقیقا محل قرار گرفتن ' ها در مقاله است)

AminSobati
یک شنبه 27 دی 1383, 21:52 عصر
شاید اشتباه میکنم ولی حدس من اینه که در ASP شما دستور Insert رو مستقیم استفاده میکنین و از Stored Procedure خبری نیست!

saeed_programer
یک شنبه 27 دی 1383, 23:49 عصر
نه آقا این این هم sp


ALTER procedure insert_article @header nvarchar(50),@context ntext,@_date bigint,@writer nvarchar(50),@format bit,@kind smallint,@src varchar(50)
as
INSERT Into tbl_article (header,context,_date,writer,format,kind,src) values (@header,@context,@_date,@writer,@format,@kind,@sr c)

AminSobati
دوشنبه 28 دی 1383, 00:29 صبح
حالا از سمت کلاینت، به چه شکل این SP رو Call میکنین؟

saeed_programer
پنج شنبه 01 بهمن 1383, 04:02 صبح
کد من چرا حذف شده؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

saeed_programer
پنج شنبه 01 بهمن 1383, 04:04 صبح
SqlCommand Command = new SqlCommand("execute insert_article N'"+header.Text+"',N'"+body.Text+"',"+_date+",N'"+maker.Text+"',"+format+","+values.Text+",'"+url.Text+"'", con);
con.Open();
Command.ExecuteNonQuery();

AminSobati
پنج شنبه 01 بهمن 1383, 10:28 صبح
Reply من هم حذف شده، شما دریافتش کرده بودین؟!

saeed_programer
یک شنبه 04 بهمن 1383, 00:47 صبح
خیر لطفا اگر پاسخی دادید دوباره آن را بزارید

AminSobati
یک شنبه 04 بهمن 1383, 13:42 عصر
دوست عزیزم،
اگر چه SP تعریف کردین ولی نحوه Call کردنش باید به این صورت باشه که نام SP رو به Command بدین و پارامترها رو Create و ضمیمه کنین:
http://www.c-sharpcorner.com/Code/2002/Oct/SpParams.asp
http://support.microsoft.com/default.aspx?scid=kb%3BEN-US%3B306574

saeed_programer
یک شنبه 04 بهمن 1383, 16:13 عصر
البته حرف شما کاملا درست می باشد ولی ون راهی که شما میگین یکی از راههای فراخوانی sp می باشد و وحی لازم نیست و راههای زیادی برای فراخوانی sp وجود دارد که من از یکی از آنها استفاده کرده ام واین راهی نیست که تازه از اون استفاده کنم مدت هاست از این روش استفاده میکنم ولی هیچ مشکلی تا حالا نداشت و در ضمن برنامه من قسمتهای فراوانی دارد که از sp در انها استفاده شده وتمامی آنها به خوبی جواب میدهد و ثالثا اینها همه روشهای ارسال کئری به sql server هستند و sql server iهمه آنها را به یک شکل تعبیر میکنه و رابعا من وقتی به صورت دستی این sp را در sqlserver فرا خوانی میکنم باز هم این مشکل را دارد.

AminSobati
یک شنبه 04 بهمن 1383, 23:16 عصر
ولی ون راهی که شما میگین یکی از راههای فراخوانی sp می باشد و وحی لازم نیست و راههای زیادی برای فراخوانی sp وجود دارد
خامسا ما نگفتیم فقط همین یک روش وجود دارد و بس! رفع هر نیازی، یک راهی داره..


این راهی نیست که تازه از اون استفاده کنم مدت هاست از این روش استفاده میکنم ولی هیچ مشکلی تا حالا نداشت
سادسا این بدین معناست که تا به حال چنین نیازی براتون پیش نیومده بوده تا روش جدید رو هم آزمایش بفرمایید. ضمنا خیلی خوش شانس بودین که تا به حال Hacker به پستتون نخورده، چون این نحوه Call کردن کاملا مستعد SQL Injection است!


اینها همه روشهای ارسال کئری به sql server هستند و sql server iهمه آنها را به یک شکل تعبیر میکنه
سابعا جسارتا اینطور نیست! در غیر اینصورت مایکروسافت انواع CommandType رو در ADO قرار نمیداد.


من وقتی به صورت دستی این sp را در sqlserver فرا خوانی میکنم باز هم این مشکل را دارد
ثامنا یقین دارم روش Call کردن مشکل داره. لطفا پست بفرمایید اشکال رو...

esi022
سه شنبه 06 بهمن 1383, 05:48 صبح
جناب saeed_programer میشه اون متن رو بصورت فایل اینجا بزاری ببینیمش
و اینکه اون کدهای تبدیل و ذخیره اش رو هم ببینیم :گیج: