PDA

View Full Version : سوال: آیا اینطور استفاده از دستورات SQL مشکل امنیتی (SQL Injection) دارد؟



javad.nic63
پنج شنبه 14 بهمن 1389, 18:04 عصر
سلام دوستان. من می خواستم بدونم اگه من دو تا textbox بندازم و یک دکمه، بعد در زیر دکمه کد زیر رو بنویسم و ضمناً یک captcha هم تو صفحه بندازم و ضمناً پسورد روهم رمز کنم آیا مشکل امنیتی وجود داره یا خیر؟


con.open();
sqlcommand com=new sqlcommand("select * from users where username=@username and password=@password" , con);
com.Parameters.AddWithValue("@username",TextBox1.Text);
com.Parameters.AddWithValue("@password",Encryption(TextBox2.Text));
SqlDataReader dr=com.ExcuteReader();
if (dr.hasrows)
{
dr.read();
session["id"]=dr["id"];
label1.Text="Ok";
}
con.close();

MoslemMaleki
شنبه 16 بهمن 1389, 20:07 عصر
با سلام
sql injection مشکل اصلی اونه
یعنی اگه توی textbox1 یا textbox2 یک دستور sql نوشته بشه و در اولش کارکتر ; بکار بره اجرا میشه. مثل دستور delete.

javad.nic63
یک شنبه 17 بهمن 1389, 08:00 صبح
با سلام
sql injection مشکل اصلی اونه
یعنی اگه توی textbox1 یا textbox2 یک دستور sql نوشته بشه و در اولش کارکتر ; بکار بره اجرا میشه. مثل دستور delete.
من همیشه شنیدم که اگه به صورت پارامتری دستورات رو بنویسی sqlinjection نمیشه؟!!!!!!!!!!!!!!!!!!! بالفرض هم حرف شما درست باشه اگه من یه sp بنویسم بازهم مشکل امنیتی داره؟

یاسر مددیان
یک شنبه 17 بهمن 1389, 08:19 صبح
با سلام
sql injection مشکل اصلی اونه
یعنی اگه توی textbox1 یا textbox2 یک دستور sql نوشته بشه و در اولش کارکتر ; بکار بره اجرا میشه. مثل دستور delete.

درود بر شما
اگه میشه بیشتر توضیح بدین. آخه به صورت پارامتر کار شده، پس چطور اینجکت میشه؟

Roia_del
یک شنبه 17 بهمن 1389, 12:10 عصر
با سلام.
شما می تونید این طوری بنویسید:




con.open();
sqlcommand com=new sqlcommand("select * from users where username=@username" , con);
com.Parameters.AddWithValue("@username",TextBox1.Text);

SqlDataReader dr=com.ExcuteReader();
if (dr.hasrows)
{
dr.read();
if(dr["password"]==TextBox2.Text)
{
session["id"]=dr["id"];
label1.Text="Ok";
}
else
{
label1.Text="Invalid";
}

}
con.close();

alonemm
یک شنبه 17 بهمن 1389, 12:13 عصر
با سلام
sql injection مشکل اصلی اونه
یعنی اگه توی textbox1 یا textbox2 یک دستور sql نوشته بشه و در اولش کارکتر ; بکار بره اجرا میشه. مثل دستور delete.

سلام:
در این مورد بهتر که از SP ها استفاده بشه و ارسال پارامتر ها (البته هم شما در اینجا هم از ارسال پارامتر استفاده کردید).
البته خود دات نت هم از نظر امنیتی این کار هایی انحام داده (مثل اجا نشدن اسکریپت های ارسالی از فرم) .


AutoEventWireup="true"

مهدی کرامتی
یک شنبه 17 بهمن 1389, 12:34 عصر
SQL Injection در دستور فوق زمانی ممکن خواهد بود که کد شما این شکلی باشد:

sqlcommand com=new sqlcommand("select * from users where username=@username and password="+TextBox1.Text , con);
اما در کد شما چون از پارامتر استفاده کردید SQL Injection ممکن نیست، زیرا دستورات SQL ای که در TextBox1.Text وارد شده باشند بعنوان دستور عمل نخواهند کرد، بلکه به صورت مقدار تحویل دستور SQL خواهند شد.

javad.nic63
یک شنبه 17 بهمن 1389, 13:05 عصر
خیلی ممنونم. فقط می خواستم بپرسم حالا که sql Injection نداره آیا کلاً این روش امن هست یا نه؟ یا بهتره از خود کنترلهای asp.net استفاده کنم؟

مهدی کرامتی
یک شنبه 17 بهمن 1389, 14:14 عصر
هر کدام کاربرد خودشان را دارند. تا جائی که ممکنه از کنترل های DataSource استفاده کنید، بنا بر کاربرد، وقتی آنها کافی نبودند از روش فوق استفاده کنید.