Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
防止参数篡改和使用Javascript发送值的最佳方法?_Javascript_C#_Asp.net_Asp.net Mvc_Parameter Passing - Fatal编程技术网

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

防止参数篡改和使用Javascript发送值的最佳方法?,javascript,c#,asp.net,asp.net-mvc,parameter-passing,Javascript,C#,Asp.net,Asp.net Mvc,Parameter Passing,我将表单发布到控制器并使其异步。我正在以隐藏的输入形式存储值。单击按钮时,将调用javascript函数。它既从输入字段中获取值,也从输入表单中获取值。然后它向控制器发送一个json字符串来处理该请求 控制器: [HttpPost, Authorize] public ActionResult DoSomeStuff (string leagueName, string doSomething) { var service = new Service(_db); var le

我将表单发布到控制器并使其异步。我正在以隐藏的输入形式存储值。单击按钮时,将调用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:



如果该值需要来自客户端(并且是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(stringusername,stringleagueid)
方法的实现在很大程度上取决于您的数据模型和授权逻辑

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

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

你不能

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

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

如果您担心某个用户将表单中的league name字段值更新为其他用户league name并发布,那么您应该做的是,在服务器代码中明确检查该用户是否具有对发布的league进行操作的适当权限

[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
}

当然,这是可能的!毕竟,您的服务器应用程序能够跟踪当前登录的用户正在使用不安全的客户端存储

当用户登录时,服务器将生成一条秘密消息,并将其存储在一个加密令牌中,该令牌将传递给客户端,并在cookie中进行bak(这只是另一个不安全的客户端数据存储)。当您向服务器发送请求时,它会获取cookie,对其进行解密,并检查其中的数据以确定用户是谁

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

但要记住的是,encrypion速度很慢。取而代之的是,从数据库中获取值会更快,尽管您可能会使用缓存来获取这些值。YMMV


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

您好,谢谢您的回答!如果我验证此用户对这两个联盟都有权限,该怎么办。那么是否无法查看联盟名称是否被更改?用户是否可以访问这两个联盟。他可以更新/执行任何操作。你可以做的另一件事是在表单中的一个隐藏字段中保留联赛唯一的
Id
。并使用它来验证/从db获得联盟。因为用户也可以访问这个联盟,如果他愿意,他可以更改id。你无能为力。若您确实想要防止这种情况发生,那个么在GET action中生成一个随机字符串,并在表单的hidden字段中设置它,然后在HttpPost上验证它。因为这是每个请求会话。你的第二个用户不知道这个秘密字符串。这是一种肮脏的方式,尽管谢谢你的帮助!:)嗨,谢谢你的回答!如果我验证此用户对这两个联盟都有权限,该怎么办。那么是否无法查看联盟名称是否被更改?如果允许用户修改联盟名称,则不要将联盟名称作为隐藏输入,而是将其设置为用户可以修改其名称的普通文本框。但在查询时使用联盟的唯一标识符作为id。如果用户可以访问这两个联盟,那么为什么要在意他是否修改了名称?如果您需要更多的时间来检测这种情况,那么除了
id
之外,还可以让您的UPDATE语句在WHERE语句中包含来自用户的联赛名称。在这种情况下,如果0行受到影响,您将知道用户更改了名称。感谢帮助!:)
[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
}