2016-08-18 3 views
1

Если предположить, что я на http://localhost:7924/default, и я ввожу данные для входа, здесь то, что происходит в каждом сценарии:Перенаправление страницы после SQL запроса

  1. Если неверный пароль (или правильно) + login_name не существует =>обновления страницы

  2. Если пароль неправильно + login_name существует (правильный) => собирается error_page

  3. Если оба правильны => перенаправлены CP.aspx

string text = username_login.Text; 
    string str2 = password_login.Text; 
    SqlConnection sqlcon = new SqlConnection(Functions.Auth()); 
    SqlCommand sqlcmd = new SqlCommand(); 
    sqlcmd.CommandText = "SELECT TOP 1 password FROM dbo.Accounts WHERE login_name = @login_name"; 
    sqlcmd.Parameters.Add("@login_name", System.Data.SqlDbType.NVarChar).Value = text; 
    sqlcmd.CommandType = System.Data.CommandType.Text; 
    sqlcmd.Connection = sqlcon; 
    sqlcon.Open(); 
    SqlDataReader sqlreader = sqlcmd.ExecuteReader(); 
    string returnString = String.Empty; 
    while (sqlreader.Read()) 
    { 


     if (sqlreader["password"].ToString() == Functions.CreateMD5Hash("5487" + str2.ToString())) 
     { 
      this.Session["logged_in"] = "true"; 
      this.Session["username"] = text; 
      base.Response.Redirect("/CP.aspx"); 

     } 
     else 

     { 
      base.Response.Redirect("/error_page?err=login-fail"); 
     } 

    } 

Оба 2. & 3. работают, как должно быть, однако, первый не является. Я не понимаю, почему он обновляет страницу вместо того, чтобы перейти на страницу с ошибкой, поскольку данные неверны. (поскольку он не может провести сравнение)

EDIT: Я также проверял, является ли пароль NULL => перенаправлять на страницу error_page, но это также обновляет страницу.

+2

Когда login_name не существует, выполнение не будет входить в цикл while (поскольку sqlreader.Read() вернет false), поэтому он снова отображает одну и ту же страницу – Thangadurai

+0

@Thangadurai. Я исправил это, проверив, является ли Sqlreader.Read() ложным после инструкции else. благодаря ! –

ответ

4

Вам просто нужно проверить, имеет ли оно какое-либо значение.

if(sqlreader.HasRows) 
{ 
    While... 
} 
else 
{ 
    //refresh page code here 
} 

Кроме того, вы можете думать о лучшем архитектору н-тай, уровне представления, бизнес-слое, доступ к данным слоя.

0

Попробуйте использовать ~ прежде, чем ссылка:

base.Response.Redirect("~/CP.aspx"); 
1

Технически: 1. если sqlreader не любая строка или 2. Если ни одно из условий в while loop не получая true, та же страница будет оказана. Но для получения рефери страницы, вы можете использовать Response.Redirect(Request.RawUrl). Я хотел бы внести некоторые изменения в коде - просто немного:

// since you are selecting 1 top row, here you would 0 or 1 row at all. 
// so you don't need to use `while` and `if` doing well 
// also, you won't need to check if `sqlreader.HasRows`, 
// because the `if (sqlreader.Read())` does the same. 
if (sqlreader.Read()) 
{ 


    if (sqlreader["password"].ToString() == Functions.CreateMD5Hash("5487" + str2.ToString())) 
    { 
     this.Session["logged_in"] = "true"; 
     this.Session["username"] = text; 
     base.Response.Redirect("/CP.aspx"); 

    } 
    else 

    { 
     base.Response.Redirect("/error_page?err=login-fail"); 
    } 

} 
// there is no need to use an `else`. just do the redirect: 
Response.Redirect(Request.RawUrl); 
0

Я изменили свой код и проверить его это будет решить вашу проблему

public static string ReplaceAll(String Str) 
     { 
      Str = Str.Replace("'", " "); 
      Str = Str.Replace(";", " "); 
      Str = Str.TrimStart(); 
      Str = Str.TrimEnd(); 
      return Str; 
     } 
public void MyFunction() 
    { 
    SqlConnection sqlcon = new SqlConnection(Functions.Auth()); 
      SqlDataAdapter sda = new SqlDataAdapter("SELECT TOP 1 password FROM dbo.Accounts WHERE login_name = '" + ReplaceAll(username_login.Text) + "' and password='" + ReplaceAll(password_login.Text) + "'", sqlcon); 
      DataTable dt = new DataTable(); 
      sda.Fill(dt); 
      if (dt.Rows.Count > 0) 
      { 
       this.Session["logged_in"] = "true"; 
       this.Session["username"] = text; 
       base.Response.Redirect("/CP.aspx"); 

      } 
      else 
      { 
       base.Response.Redirect("/error_page?err=login-fail"); 
      }} 
+1

Чтобы защитить приложение от SQL-инъекции, не связывайте свой запрос со значением, а используйте SqlParameterCollection. –

+0

Я использую ReplaceAll(), чтобы избежать SQL Injection –

+0

Я бы не рекомендовал делать это, так как вы не охватываете весь различный тип SQL-инъекции. Одной из причин создания SqlParameterCollection является предотвращение SQL Injection. –

Смежные вопросы