防止参数篡改和使用Javascript发送值的最佳方法

本文关键字:方法 最佳 Javascript 参数 | 更新日期: 2023-09-27 18:24:54

我正在向控制器发布一个表单,并使其异步。我将值存储在隐藏的输入表单中。单击按钮时,会调用一个javascript函数。它既从输入字段中获取值,也从隐藏的输入表单中获取值。然后它向控制器发送一个json字符串来处理这个请求。

控制器:

[HttpPost, Authorize] 
public ActionResult DoSomeStuff (string leagueName, string doSomething)  {
    var service = new Service(_db);
    var league = service.GetLeague(leagueName);
    if (league != null) {
        // validate doSomething
        league.Action = doSomething;
        _db.SaveChanges();
    }
    return new EmptyResult(); 
}

Javascript:

$(document).on("click", "#submitForm", function () {
    var json = {
            "leagueName": $("input[name=leagueName]").val(),
            "doSomething": $("input[name=doSomething]").val()
    };
    $.post("/Home/DoSomeStuff/", json, function () {
        // async display something
    });
}

Html:

<input type="text" name="doSomething">
<button type="submit" id="submitForm"</button>
<input type="hidden" name="leagueName" value="@item.League.LeagueName" />

让javascript获取存储值的最佳方式是什么(比隐藏输入类型更安全的方式)?

如何防止某些用户更改输入类型的值隐藏字段?

防止参数篡改和使用Javascript发送值的最佳方法

如何防止某些用户更改输入的值键入隐藏字段?

你不能!

让javascript获取存储值的最佳方式是什么(更多安全方式然后隐藏输入类型)?

一般规则是,不要信任来自客户端的数据。在做任何事情之前,您应该始终在服务器上验证它。

如果你担心用户将表单中的联赛名称字段值更新为其他用户的联赛名称并发布,你应该做的是,明确检查用户是否有适当的权限在你的服务器代码中对发布的联赛进行操作。

[HttpPost, Authorize] 
public ActionResult DoSomeStuff (string leagueName, string doSomething)  {
    var service = new Service(_db);
    var league = service.GetLeague(leagueName);
    // Now check whether the current user has access/permission 
    // to perform some operation on this league.
    // Ex : if(!service.IsUserAuthorizedToDoSomething(league))
    //     {
    //      return View("NotAuthorized");
    //     }
    //to do: Return something
}

如果值需要来自客户端(并且是HTTP请求的一部分),那么您绝对无法阻止客户端修改其内容。如果客户端不应该修改某些字段的内容,那么这些字段与您的标记无关,并且是回发HTTP请求的一部分(无论是作为隐藏字段还是您想到的任何标记元素)。它们应该安全地驻留在服务器(数据库?)上,并使用来自客户端的一些标识符进行检索。显然,客户端是否能够访问与该标识符相关的信息取决于所谓的授权。基本上,您应该首先知道您的客户是谁(身份验证),然后在数据模型中验证该客户是否有权访问相应的记录。就这么简单。

[HttpPost]
[Authorize] 
public ActionResult DoSomeStuff (string id, string doSomething)  
{
    var service = new Service(_db);
    var league = service.GetLeagueById(id);
    if (!HasAccessToLeague(User.Identity.Name, league)) 
    {
        // you are not suppose to modify the contents of this league
        // throw him a 404 or something
    }
    else
    {
        if (league != null) 
        {
            // validate doSomething
            league.Action = doSomething;
            _db.SaveChanges();
        }
    }
    return new EmptyResult(); 
}

显然,HasAccessToLeague(string username, string leagueId)方法的实现将在很大程度上取决于您的数据模型和授权逻辑。

此外,您在问题标题中使用了XSS,但这里的问题不是XSS或javascript,而是在web应用程序中设计授权层。

当然可以做到这一点!毕竟,您的服务器应用程序能够跟踪当前登录用户使用不安全客户端存储的用户。

当用户登录时,服务器将生成一条秘密消息,并将其存储在加密的令牌中,该令牌将传递给客户端,并将bak存储在cookie中(这只是另一个不安全的客户端数据存储)。当你向服务器发送请求时,它会得到cookie,解密它,并检查里面的数据来判断用户是谁

您也可以这样做——对隐藏字段进行加密,将它们放在隐藏输入中(如果您愿意,也可以放在cookie中),然后将它们发送回服务器。然而,只有在向客户端javascript发送纯文本的情况下,才能在客户端javascript中使用它们,这意味着您仍然需要在服务器上执行一些检查,但检查可以很简单,只需将加密值与隐藏的表单值进行比较,如果有不匹配的值,则拒绝请求。

不过需要记住的是,encrypion的速度很慢。相反,从数据库中获取值可能会更快,尽管您可能会为这些值使用缓存。YMMV。

另一种选择是生成中包含值的javascript文件,并确保客户端浏览器无法使用内容安全策略等安全功能对其进行编辑。缺点是无法在html中使用这些值(因为显然用户可以在那里编辑它们),因此您必须通过js调用将数据传递回服务器。