PDA

View Full Version : سوال: این این کدها امن هست؟؟



ghamgin
جمعه 26 شهریور 1395, 10:00 صبح
سلام
من برا لاگین این کدهامه

string name = txtusername.Text;


string password = txtuserpass.Text;


SqlConnection sc = new SqlConnection(Database.Connection_String());
sc.Open();
SqlCommand cd = new SqlCommand(string.Format("SELECT * FROM [user] Where username='{0}' AND password='{1}'", name, password), sc);
SqlDataReader dr = cd.ExecuteReader();
if (dr.HasRows)
{
dr.Read();
Response.Redirect("~/admin/Default.aspx");
sc.Close();

}

ایا این در معرض sql injection هست؟
اگه اره باید چطوری بنویسم
ممنون میشم

anubis_ir
جمعه 26 شهریور 1395, 12:36 عصر
ایا این در معرض sql injection هست؟
بله. استفاده از string.Format به معناي پارامتري كاركردن نيست.
كوئري به اين صورت تغيير مي‌كند:

SELECT * FROM [user] Where username=@p1 AND password=@p2
سپس اين p1 و p2 را بايد به صورت پارامتر اضافه كنيد:

cd.Parameters.Add

sadegh.te
جمعه 26 شهریور 1395, 15:35 عصر
سلام
من برا لاگین این کدهامه

string name = txtusername.Text;


string password = txtuserpass.Text;


SqlConnection sc = new SqlConnection(Database.Connection_String());
sc.Open();
SqlCommand cd = new SqlCommand(string.Format("SELECT * FROM [user] Where username='{0}' AND password='{1}'", name, password), sc);
SqlDataReader dr = cd.ExecuteReader();
if (dr.HasRows)
{
dr.Read();
Response.Redirect("~/admin/Default.aspx");
sc.Close();

}

ایا این در معرض sql injection هست؟
اگه اره باید چطوری بنویسم
ممنون میشم

دوست عزیز شما باید از پروسیجر استفاده کنید
و برای امنیت بیشتر پروژه رو با معماری سه لایه بنویسید.

ghamgin
یک شنبه 28 شهریور 1395, 10:00 صبح
string sql = "select * from [users] where username='" + username + "' and pass='" + pass + "'";


SqlDataAdapter da = new SqlDataAdapter(sql, con);
DataTable dt = new DataTable();
da.Fill(dt);


if (dt.Rows.Count == 0)
Label1.Text = "نام خانوادگی یا رمز وارد شده صحیح نمی باشد!";
else
{
Label1.Text = "";
Session["users"] = txtuname.Text;
Response.Redirect("~/HomePage2.aspx");
}


con.Close();


اگه بخوام از کلاس برا لاگین استفاده کنم یعنی کدها رو در کلاس بذارم چطور باید در کلیک باتن لاگین صداش بزنم کسی نمونه کد لاگین این شکلی داره لطف کنه بذاره؟
ممنون میشم:اشتباه::قلب:

و
همین استفاده از کلاس ها میشه معماری سه لایه دیگه؟

hamid_0341
دوشنبه 29 شهریور 1395, 09:54 صبح
string sql = "select * from [users] where username='" + username + "' and pass='" + pass + "'";


SqlDataAdapter da = new SqlDataAdapter(sql, con);
DataTable dt = new DataTable();
da.Fill(dt);


if (dt.Rows.Count == 0)
Label1.Text = "نام خانوادگی یا رمز وارد شده صحیح نمی باشد!";
else
{
Label1.Text = "";
Session["users"] = txtuname.Text;
Response.Redirect("~/HomePage2.aspx");
}


con.Close();


اگه بخوام از کلاس برا لاگین استفاده کنم یعنی کدها رو در کلاس بذارم چطور باید در کلیک باتن لاگین صداش بزنم کسی نمونه کد لاگین این شکلی داره لطف کنه بذاره؟



این کد که نوشتید رو اگه توی کلاس جداگانه هم بذارید باز امن نیست پارامتر های ورودی رو قبل از قرار گرفتن توی command text چک کنید ، میتونید از parameters خود sqlcommand هم استفاده کنید (کدی که anubis_ir گذاشتن )



همین استفاده از کلاس ها میشه معماری سه لایه دیگه؟


توضیحاتی راجب معماری سه لایه
http://www.c-sharpcorner.com/uploadfile/4d9083/create-and-implement-3-tier-architecture-in-asp-net/

ghamgin
چهارشنبه 31 شهریور 1395, 09:38 صبح
خوب این کد رو در کلاس نوشتم حالا نمیدونم برا استفاده ازش در کلیک باتن فرم لاگین چطوری بنویسم که اگه درست بود بره صفحه بعد اگه نگه پیغام بده نام کاربری یا پسورد غلطه؟؟؟
ممنون میشم راهنمایی کنید
این کدها
public void Select_user(string username, string password)
{
SqlConnection connection = new SqlConnection(Database.Connection_String());
connection.Open();
string sqlStatement = "SELECT * FROM [user] WHERE usrname = @usrname and password = @password";
SqlCommand sqlCmd = new SqlCommand(sqlStatement, connection);
sqlCmd.Parameters.AddWithValue("@usrname", usrname);
sqlCmd.Parameters.AddWithValue("@password", password);
SqlDataReader reader = sqlCmd.ExecuteReader();

using (reader)
{
if (reader.Read())
{
users d = new users();
d.id = (int)reader["id"];
d.usrname = (string)reader["usrname"];
d.password = (string)reader["password"];
reader.Close();
connection.Close();
}
}


}

mortezagt
چهارشنبه 31 شهریور 1395, 12:29 عصر
خوب این کد رو در کلاس نوشتم حالا نمیدونم برا استفاده ازش در کلیک باتن فرم لاگین چطوری بنویسم که اگه درست بود بره صفحه بعد اگه نگه پیغام بده نام کاربری یا پسورد غلطه؟؟؟
ممنون میشم راهنمایی کنید
این کدها
public void Select_user(string username, string password)
{
SqlConnection connection = new SqlConnection(Database.Connection_String());
connection.Open();
string sqlStatement = "SELECT * FROM [user] WHERE usrname = @usrname and password = @password";
SqlCommand sqlCmd = new SqlCommand(sqlStatement, connection);
sqlCmd.Parameters.AddWithValue("@usrname", usrname);
sqlCmd.Parameters.AddWithValue("@password", password);
SqlDataReader reader = sqlCmd.ExecuteReader();

using (reader)
{
if (reader.Read())
{
users d = new users();
d.id = (int)reader["id"];
d.usrname = (string)reader["usrname"];
d.password = (string)reader["password"];
reader.Close();
connection.Close();
}
}


}

فرض کن اسم فایل کلاسی که این کدها درش هست CheckUser هست
توی فرمی که میخوای از کدهای داخل اون کلاس استفاده کنی کافیه CheckUser رو توی اون فرم تعریف کنید


Dim Cls_chkUser as new CheckUser


بعد میتونی با Cls_chkUser به متدهای داخل کلاس CheckUser دسترسی پیدا کنی
مثلا

Cls_chkUser.Select_user()

mortezagt
چهارشنبه 31 شهریور 1395, 12:30 عصر
البته کد وی بی هست
خودت دیگه اون خط اول رو سی شارپ کن:چشمک:

ghamgin
پنج شنبه 01 مهر 1395, 06:51 صبح
ممنون
این میدانم
اینکه چطور پیغام بده درسته یا غلطه رو نمیدونم؟؟؟

mortezagt
پنج شنبه 01 مهر 1395, 14:49 عصر
ممنون
این میدانم
اینکه چطور پیغام بده درسته یا غلطه رو نمیدونم؟؟؟

اخر شرط
if (reader.Read())

که نوشتی رو یه

return true

اذافه کن که اگر یوزر درست بود، true برگشت بده و یه return false هم اذافه کن که اگر یوزر اشتباه بود false رو برگشت بده
بعد توی فرم لوگین یه شرط بنویس که اگر مقدار برگشتی متد بررسی یوزر، true بود، به صفحه بعدی بره یا هر چیز دیگه و اگر false بود خطا بدی یا هرچی که میخوای
مثلا:




using (reader)
{
if (reader.Read())
{
users d = new users();
d.id = (int)reader["id"];
d.usrname = (string)reader["usrname"];
d.password = (string)reader["password"];
reader.Close();
connection.Close();
return true
}
}




منظور رو گرفتی؟

ghamgin
جمعه 02 مهر 1395, 08:31 صبح
ممنون ازت
فهمیدم چی میگین
اما
نفهميدم چطور شرط رو چک کنم..

mortezagt
جمعه 02 مهر 1395, 11:25 صبح
ممنون ازت
فهمیدم چی میگین
اما
نفهميدم چطور شرط رو چک کنم..


این کد رو میزاری توی کلاس



private object CheckLogin(string username, string password)
{
SqlConnection ObjConn = new SqlConnection("Data Source=SOTI-PC\\SQLEXPRESS;Initial Catalog=database1;Integrated Security=True");
string strsql = "select username,password from user_tbl where username=@username and password=@password";
SqlCommand Cmd = new SqlCommand(strsql, ObjConn);

SqlDataAdapter DataAdapter = new SqlDataAdapter(Cmd);
DataSet DataSet = new DataSet();
Cmd.Parameters.AddWithValue("@username", username);
Cmd.Parameters.AddWithValue("@password", password);
DataAdapter.Fill(DataSet, "user_tbl");

if (DataSet.Tables[0].Rows.Count > 0)
{
return true;
}
else
{
return false;
}
}



فرضا اسم فایل کلاس شما Data_Model هست
با این کد هم فراخانی میکنی به همراه شرط که اگر برگشتی true بود هرکاری خواستی انجام بدی





if (Data_Model.CheckLogin(txtusername.text, txtpassword.text) == true)
{
رفتن به صفحه بعدی در صورت درست بود یوزر و پسورد //
}
else
{
MessageBox.Show("Wrong Username Or Password");
}

mortezagt
جمعه 02 مهر 1395, 11:27 صبح
البته برای بررسی رمز عبور و نام کاربری هرکسی روش های خودش رو داره
این ساده ترین روش برای بررسی اطلاعات کاربر بود