1

我正在使用 Ajax 发布方法,但不知道这些方法是否安全。我担心 Ajax 的安全性。下面的代码如何保护我的应用程序。我使用了普通的帖子形式,AntiForgeryToken有没有像 ajax 这样的。

Javascript:

$(function() {
    var btn = $('.alignleft').find('input[name=loginbutton]');
    btn.click(function() {
        $.post("/profile/login", { us: $('#User').val(), pw: $('#Pass').val(), ajaxForm: true },
            function(result) { 
                if (result == "empty")
                    noty({ text: 'Şifre ve kullanıcı bilgilerinizi girin', type: 'information' });
                else if (result == "wrong")
                    noty({ text: 'Kullanıcı adı/eposta veya şifre yanlış.', type: 'warning' });
                else if (result == "blok") {
                    noty({ text: 'Tekrar eden yanlış denemelerden dolayı sisteme girişiniz 15 dk. engellendi.', type: 'error' });
                    $('#dialog').delay(2000).fadeOut(200);
                    $('#dialog-mask').delay(1000).removeClass('dialogmask');
                } else if (result == "ok") {
                    $('#dialog').fadeOut(1000);
                    $('#dialog-mask').removeClass('dialogmask');
                    var url = '/';
                    location.href = url;
                } else if (result == "ban") {
                    location.href = '/error/banned';
                }
            });
        return false;
    });
});

ActionResult 正在返回 JSON 数据

[HttpPost]
[OnlyAjaxRequest]
public ActionResult Login(string pw, string us)
{
    if (Request == null || !Request.IsAjaxRequest())
        return RedirectToAction("c404", "error");

    if (!AuthFail.CheckInvalidCount(us.Trim()))
    {
        return Json(new[] { "blok" });
    }

    if (string.IsNullOrEmpty(pw) || string.IsNullOrEmpty(us))
    {
        return Json(new[] { "empty" });
    }

    try
    {
        var ps = GetSha1(pw);
        var loginUser = (from s in _member.UserProfiles
                where ((s.Password == ps) && (s.Username == us || s.Email == us))
                select s).FirstOrDefault();
        if (loginUser != null)
        {
            if (loginUser.Status == 0)
            {
                return Json(new[] {"ban"});
            }
            AuthFail.Clear(us.Trim());
            Session["___profile___"] = loginUser;
            return Json(new[] { "ok" });
        }
        AuthFail.IncreaseInvalidCount(us.Trim());
        return Json(new[] { "wrong" });
    }
    catch { }

    return RedirectToAction("c404", "error"); 
}
4

1 回答 1

0

就像 Slicksim 所说,您可以添加一个防伪令牌来防止“跨站点请求伪造攻击”。

另一个问题是 SHA-1,我猜你是通过调用“GetSha1()”来使用它的。我不知道它做了什么,但你真的应该使用盐来生成你的密码哈希。有关此主题的更多信息: SHA-1 对密码存储是否安全?

于 2013-08-22T11:55:50.387 回答