2014-02-19 4 views
0

Привет, ребята, я пытаюсь сделать мой пароль безопасным для инъекций sql. Я хочу отфильтровать специальные символы, используя что-то вроде preg_replace в php. Любые советы о том, как я могу применить это для ввода в asp.net?Фильтрация специальных символов при входе в mvc asp.net

Вот мой Войти в мой контроллер:

public ActionResult Login(Models.User user) 
     { 
      if (ModelState.IsValid) 
      { 

       if (isValid(user.UserName, user.Password)) 
       { 
        FormsAuthentication.SetAuthCookie(db.User.Where(u => u.UserName == user.UserName).FirstOrDefault().UserRole.Name, false); 
        return RedirectToAction("Clock", "User"); 
       } 
       else 
       { 
        ModelState.AddModelError("", "User Name or Password is incorrect"); 
       } 
      } 

      return View(user); 
     } 

Это мой IsValid:

private bool isValid(string UserName, string Password) 
     { 
      bool isValid = false; 

      var user = db.User.Where(u => u.UserName == UserName).FirstOrDefault(); 
      if (user != null) 
      { 
       if(Crypto.VerifyHashedPassword(user.Password, Password)) 
       { 
        isValid = true; 
       } 
      } 

      return isValid; 
     } 

И это мой login.cshtml:

@using (Html.BeginForm()) 
{ 
    @Html.ValidationSummary(true, "Login Failed. Check your login details."); 
    <div> 
     <fieldset> 
      <legend>Login Form</legend> 
      <div>@Html.LabelFor(u=>u.UserName)</div> 
      <div>@Html.TextBoxFor(u => u.UserName) 
       @Html.ValidationMessageFor(u => u.UserName) 
      </div> 

      <div>@Html.LabelFor(u => u.Password)</div> 
      <div> 
       @Html.PasswordFor(u => u.Password) 
      @Html.ValidationMessageFor(u => u.Password) 
     </div> 
      <input type="Submit" value="Log In" /> 
     </fieldset> 
    </div> 
} 
+0

Похоже, вы дважды вызываете базу данных, чтобы получить этого пользователя. Почему бы не сделать что-то вроде 'IsValid (... out User user)'? –

ответ

1

Это выглядит, как вы используя какой-то ORM для доступа к данным. Это само по себе должно заботиться о любых проблемах Sql Injection, скорее всего, используя свойства, поэтому вам не нужно беспокоиться об этом. Просто убедитесь, что при визуализации любого введенного пользователем контента вы кодируете html/url. Большинство элементов сделают это для вас по умолчанию.

+0

Роджер, я сделал это сам. Он отправил меня на потенциально опасное значение Request.Form было обнаружено у клиента (UserName = "* & # $% @ * # * $") и не обработано. Есть ли где-то в файле web.config, где я могу перенаправить это в другое представление? – Shawn

+0

@Shawn это отдельная проблема. Это проверка запроса, и это возможно, чтобы сместить SQL-инъекцию. Вы можете справиться с этим, используя обычные методы обработки ошибок или отключите его. –

+1

Если вы хотите разрешить любые символы, вы можете либо использовать атрибут AllowHtml для свойств вашего ViewModel, либо вы можете использовать фильтр действий ValidateFilter для действия, контроллера или зарегистрировать его глобально. Если вы примете последний подход, просто убедитесь, что вы кодируете все, что вы эхо возвращаете на страницу. Razor сделает это для вас по умолчанию, когда вы используете «@» для вывода значений, но если вы используете @ Html.Raw в любом месте, вам нужно быть осторожным. –

1

Как правило, ASP.NET использует Entity Framework в качестве своего ORM. Если это так, то они уже заботиться о инъекции SQL для вас, смотрите по этой ссылке:

http://msdn.microsoft.com/en-us/library/cc716760.aspx

Цитирование:

LINQ к Entities-инъекций:

Хотя состав запроса можно в LINQ to Entities, выполняется через API объектной модели. В отличие от запросов Entity SQL запросы LINQ to Entities не составлены с помощью манипуляций строк или конкатенации, и они не подвержены традиционным атакам SQL-инъекций.

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