C# 在mvc 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,

嘿,伙计们,我正在努力使我的登录安全,以防sql注入。我想用php中的preg_replace之类的东西过滤掉特殊字符。关于如何将此应用于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>
}
@使用(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,则需要小心。