我有一个表单提交回复。控制器操作接受值作为参数。例如:EditProduct(int productid,string productname)。
productid是从隐藏字段中的表单提供的。我该如何确保该用户 不会调用此操作并将此productid和name作为queystring传递,模型绑定将绑定vales并将产品保存在数据库中?
答案 0 :(得分:3)
我发现最安全的方法是检查用户是否有权编辑产品。在操作中执行任何数据库更新之前,请检查此项,您无需担心修改隐藏值的用户。
如果您想强制用户转到您的网页来执行帖子,您可以使用Html.AntiForgeryToekn()。但是,用户仍然可以访问该网站,查看防伪令牌并将其传递给他们。
答案 1 :(得分:1)
您可以在服务器上使用密钥对产品ID进行签名(使用HMACSHA512),然后在回发中验证签名。
您可能希望在签名时包含当前日期和/或用户或会话ID,以防止重播攻击。
答案 2 :(得分:1)
您应该在EditProducts
操作中实施适当的访问控制,以便尝试编辑其他产品时会产生错误。
试图阻止用户修改查询字符串无效。
答案 3 :(得分:0)
我建议你在你的模型中添加一个rowversion(timestamp)列。与签名或散列相比,这更容易(如果你可以对模型进行更改)。