C# 在mvc asp.net中过滤登录中的特殊字符
嘿,伙计们,我正在努力使我的登录安全,以防sql注入。我想用php中的preg_replace之类的东西过滤掉特殊字符。关于如何将此应用于asp.net中的输入,有什么建议吗 这是我在控制器中的登录名:C# 在mvc asp.net中过滤登录中的特殊字符,c#,asp.net-mvc,validation,C#,Asp.net Mvc,Validation,嘿,伙计们,我正在努力使我的登录安全,以防sql注入。我想用php中的preg_replace之类的东西过滤掉特殊字符。关于如何将此应用于asp.net中的输入,有什么建议吗 这是我在控制器中的登录名: public ActionResult Login(Models.User user) { if (ModelState.IsValid) { if (isValid(user.UserName,
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>
}
@使用(Html.BeginForm())
{
@ValidationSummary(true,“登录失败。请检查您的登录详细信息”);
登录表单
@LabelFor(u=>u.UserName)
@Html.TextBoxFor(u=>u.UserName)
@Html.ValidationMessageFor(u=>u.UserName)
@LabelFor(u=>u.Password)
@Html.PasswordFor(u=>u.Password)
@Html.ValidationMessageFor(u=>u.Password)
}
看起来您正在使用某种ORM进行数据访问。这本身就应该解决任何Sql注入问题,很可能是通过使用属性来解决的,所以您不必担心它。只要确保在呈现任何用户输入的内容时,您是在对其进行html/url编码。默认情况下,大多数元素都会为您执行此操作。通常,ASP.NET使用实体框架作为其ORM。如果是这种情况,他们已经为您处理SQL注入,请参阅以下链接:
引述:
LINQ到实体注入攻击:
尽管查询组合在LINQtoEntities中是可能的,但它是通过对象模型API执行的。与实体SQL查询不同,LINQ-to-Entities查询不是通过使用字符串操作或连接来组成的,它们不易受到传统SQL注入攻击 看起来您要调用数据库两次以获取该用户。为什么不做一些像
IsValid(…out User)
?罗杰,是的,它自己做的。它向我发送了一个潜在危险的请求。从客户端检测到表单值(UserName=“*$%@*#*$”),但未进行处理。web.config文件中是否有我可以将其重新路由到另一个视图的地方?@Shawn这是另一个问题。这是请求验证,有可能因此而漏掉sql注入。您可以使用常规全局错误处理方法进行处理或将其关闭。如果要允许任何字符,可以在ViewModel的属性上使用AllowHtml属性,也可以在操作、控制器上使用ValidateFilter操作筛选器,或全局注册它。如果您采用后一种方法,只需确保您对回显到页面的任何内容进行编码。Razor在默认情况下会在使用“@”输出值时为您执行此操作,但如果您在任何地方使用@Html.Raw,则需要小心。