PDA

View Full Version : ذخیره نکردن علامت ' '



arsalansalar
یک شنبه 19 اسفند 1386, 15:21 عصر
من یک مشکل برای ذخیره در بانک دارم و اینکه زمانی که در جمله فارسی این علامت ('کلمه مورد نظر')وجود داشته باشد در بانک ذخیره نمی کند.دلیلش چیست؟

raravaice
یک شنبه 19 اسفند 1386, 15:40 عصر
سلام

یه راه ساده :

' رو با " replace کن

موفق باشید

saman_itc
یک شنبه 19 اسفند 1386, 15:56 عصر
' تو جز کارکتر هایی که SQL ازش استفاده خاصی میکنه و...

SabaSabouhi
دوشنبه 20 اسفند 1386, 09:05 صبح
با سلام
در تایید نوشته دوستان باید بگم که «'» در SQL به معناى آغاز و پایان رشته‌ى حرفى (String) هست. حال اگر شما قصد ثبت واژه‌اى را دارید که داخلش این کاراکتر وجود داره به مشکل مى‌خورید ( مثل O'nil نام خانوادگى بازیکن بسکتبال NBA ) چون اگر بنویسید:



Name = 'O'nil'


کاراکتر «'» بعد از حرف O به عنوان خاتمه‌ى رشته تلقى شده و بقیه‌ى عبارت به عنوان یک Syntax Error گزارش مى‌شود.

براى رفع این مشکل راه حلى پیش‌بینى شده و آن این که دو تا «'» به‌صورت پیاپى نوشته شود تا SQL بفهمد که منظور یک کاراکتر «'» بوده و نباید آن را به عنوان خاتمه‌ى رشته تلقى کند:



Name = 'O''nil'


به این شکل مشکل شما حل مى‌شود.

صبا صبوحى

arsalansalar
دوشنبه 20 اسفند 1386, 09:24 صبح
با سلام
در تایید نوشته دوستان باید بگم که «'» در SQL به معناى آغاز و پایان رشته‌ى حرفى (String) هست. حال اگر شما قصد ثبت واژه‌اى را دارید که داخلش این کاراکتر وجود داره به مشکل مى‌خورید ( مثل O'nil نام خانوادگى بازیکن بسکتبال NBA ) چون اگر بنویسید:



Name = 'O'nil'


کاراکتر «'» بعد از حرف O به عنوان خاتمه‌ى رشته تلقى شده و بقیه‌ى عبارت به عنوان یک Syntax Error گزارش مى‌شود.


براى رفع این مشکل راه حلى پیش‌بینى شده و آن این که دو تا «'» به‌صورت پیاپى نوشته شود تا SQL بفهمد که منظور یک کاراکتر «'» بوده و نباید آن را به عنوان خاتمه‌ى رشته تلقى کند:



Name = 'O''nil'


به این شکل مشکل شما حل مى‌شود.



صبا صبوحى

دوست عزیز من برنامه را می خواهم بدهم به کاربر پر کند و نمی توانم با حجم زیاد اطلاعات بگویم این کار را بکن.
راه حل بهینه تری وجود ندارد؟

raravaice
دوشنبه 20 اسفند 1386, 11:44 صبح
con = New SqlConnection(strcon)
cmdsql = New SqlCommand(dastoor, con)
cmdsql.CommandType = CommandType.Text
cmdsql.Parameters.AddWithValue("@user_name", "cgchcg'vhyvjh")


از این روش برای جای گذاری استفاده کن

SabaSabouhi
دوشنبه 20 اسفند 1386, 12:58 عصر
با سلام
دوست عزیز، قرار نیست که کاربر این کاراکتر دومى رو وارد کنه.
دو روش دارین یکى همونطور که دوستمون raravaice گفتن با استفاده از پارامتر هست و یکى دیگه این که تو کدتون این تغییر رو انجام بدین. یه حلقه‌ى ساده که این اصلاحیه رو روى تمام Textها انجام مى‌ده.
با انجام یکى از این دو روش ( براى تمام textهاى موجود ) شما جلوى SQL Injection رو هم مى‌گیرید.

صبا صبوحى

saman_itc
سه شنبه 21 اسفند 1386, 11:04 صبح
دوستان همه استادن ولی SQL Injection Attacks و نحوه پیشگیری چیزه بدی نیست

بانکهای اطلاعاتی معمولا قلب (http://www.academist.net/)یک وب سایت یا یک برنامه Web based و یا Web Enabled را تشکیل میدهند. زیرا اطلاعاتی که باید در سایت نمایش داده شوند در آنها ذخیره میگردد. بر اساس مدلهای مختلف برنامه سازی، ترکیبی از یک بانک اطلاعاتی و یک زبان اسکریپت یا کد نویسی و احتمالا چند لایه دیگر میتوان برنامه ای نوشت که مورد رضایت مشتری قرارگیرد و اورا قانع به پرداخت هزینه های برنامه نویسی نمود.

گاه با اینکه تمام جوانب برنامه نویسی را رعایت کرده ایم ممکن است متوجه وجود برخی حفره ها و یا خطاها در برنامه های خود شویم. در صورتی که این حفره ها به دلیل اشکالات موجود در ابزارهای استفاده شده در برنامه ما، مانند بانکهای اطلاعاتی باشند، میتوان به نصب SERVICE PACK ها و یا ارتقاء به نگارش جدید این برنامه ها مشکل را حل نمود، اما در اکثر موارد اشکال و حفره های موجود در یک برنامه وبی به اشکالات مربوط به “تزریق کدهای SQL” یا همان SQL Injection مربوط میشود….
SQL Injection به چه کاری میگویند؟!
همان طور که میدانید زبان SQL شامل دستوراتی است که انجام عملیات بر روی داده های یک بانک اطلاعاتی را فراهم مینماید. هر عملیات (Query) بر روی بانک اطلاعاتی میتواند شامل چندین دستور (Command) باشد. معمول ترین این دستورات عبارتند از: Select, Insert, Update و Delete.
در صورتی که فردی بتواند بصورت غیر مجاز بر روی بانک اطلاعاتی ما با استفاده از این دستورات به اطلاعاتی دست پیدا کند یا اطلاعاتی وارد سایت نماید یا آنها را تغییر داده و یا احتمالا حذف نماید و این عمل را با استفاده از ضعف ما در تفکیک مقادیر ورودی های کاربر و دستورات SQL انجام دهد، اصطلاحا به این روش غیر مجاز اجرای (http://www.academist.net/)دستورات SQL Injection Attack میگویند.
مثالی از SQL Injection Attacks
مثالها و ضعف های مختلفی را میتوان برای یک SQL Injection Attack بیان نمود، اما در اینجا به یک نمونه ساده از نحوه عبور از یک فرم مخصوص اعتبار سنجی کاربران که به خوبی طراحی نشده آورده میشود.
معمولا برای ورود به یک سایت از طریق یک فرم کلمه عبور و نام کاربری خواسته شده و مقادیر وارد شده در صفحه دیگری ارزیابی شده و در صورت صحت اعتبار، کاربر به صفحه اصلی انتقال داده میشود. صفحه ورود اعتبار کدی مانند مثال زیر دارد:


<form name=”frmLogin” action=”login.asp” method=”post”>
Username: <input type=”text” name=”userName”>
Password: <input type=”text” name=”password”>
<input type=”submit”>
</form>
اطلاعات فرم بالا پس از Submit به صفحه Login.asp ارسال شده و با کدی مانند آنچه در زیر آمده است مورد ارزیابی قرار میگیرد: (http://www.academist.net/)
<%

dim userName, password, query
dim conn, rS
userName = Request.Form(”userName”)
password = Request.Form(”password”)
set conn = server.createObject(”ADODB.Connection”)
set rs = server.createObject(”ADODB.Recordset”)
query = “select * from users where userName=’” &
userName & “‘ and userPass=’” & password & “‘”
conn.Open “Provider=SQLOLEDB; Data Source=(local);
Initial Catalog=myDB; User Id=sa; Password=”
rs.activeConnection = conn
rs.open query
if not rs.eof then
response.write “Logged In”
else
response.write “Bad Credentials”
end if
%>
در مثال بالا در صورتی که Username و Password وارد شده حداقل یک بار در بانک اطلاعاتی وجود داشته باشند، کاربر جمله “Logged In” و در غیر این صورت عبارت “Bad Credentials” را مشاهده خواهد نمود.
حال فرض کنید کاربر بجای وارد نمودن Username و Password خود عبارتهای زیر را تایپ نماید:
Username: ‘ or True –
Password: [Null]
در اینصورت دستور اجرا شده SQL ما بر روی بانک اطلاعاتی بصورت زیر خواهد بود:
select * from users where userName=” or True -– ‘ and userPass=”
همان طور که ملاحظه میشود در صورت اجرای این کد بر روی بانک اطلاعاتی، همیشه کاربر قادر به ورود به سایت بوده و جمله “Logged In” را مشاهده مینماید! ماجرا همیشه به این سادگی نیست، کاربران غیر مجاز نه تنها از طریق فرمها، بلکه از طریق تغییر Query String های صفحات وبی و یا مقداردهی بهCookie ها نیز قادر به ارسال دستورات مخرب SQL به بانکهای اطلاعاتی میباشند! و گاه میتوانند اطلاعات ما را کاملا حذف نمایند، تغییر دهند، دیتای جدید وارد کنند و یا اطلاعات ما را مشاهده و دریافت نمایند.
بنابر این: همواره مراقب اجرای کدهای مخرب که از طریق کاربر به عنوان اطلاعات معمولی به سیستم تزریق میگردند باشید!
برخی پیشنهادات برای جلوگیری و مقابله با SQL Injection Attacks:
اگر ما به عنوان برنامه نویس وب، برنامه های خود را با دقت بیشتری بنویسیم، در اکثر مواقع میتوانیم جلوی حملات SQL Injection را بگیریم، معمولی ترین راه های مقابله با این نوع حملات میتواند شامل موارد زیر باشد:
۱- محدود کردن سطح دسترسی کاربری که با آن اطلاعات وب را برای کاربر از بانک اطلاعاتی استخراج مینماید، بدین منظور بهتر است به چنین نام کاربری، تنها سطح دسترسی SELECT و INSERT برای جداولی که به چنین سطح اجرای دستوراتی نیاز دارند داده شود.
۲- با استفاده از دستور Replace مقادیر مربوط به کوتیشن ‘ را پیش از ارسال مقادیر دریافت شده از طرف کاربر بر روی سرور، از جملات مربوطه حذف نماییم.
۳- کلمات کلیدی و معنادار برای SQL مانند: Drop, Delete, Update و – را از ورودی های دریافت شده از کاربر حذف نماییم.
۴- طول پارامتر ورودی توسط کاربر را محدود نماییم. (http://www.academist.net/)
منبع (http://noict.com/)