【问题标题】:How to ignore model binding from querystring in MVC如何忽略 MVC 中查询字符串中的模型绑定
【发布时间】:2010-11-16 15:28:58
【问题描述】:

我有表单提交正在回发。控制器操作接受这些值作为参数。例如:EditProduct(int productid, string productname)。

productid 由隐藏字段中的表单提供。如何确保用户 不会调用此操作并将此 productid 和 name 作为 queystring 传递,模型绑定将绑定 vales 并将产品保存在数据库中?

【问题讨论】:

  • 是什么让您认为用户无法编辑您的隐藏字段?

标签: c# .net model-view-controller asp.net-mvc-2 model-binding


【解决方案1】:

我发现最安全的方法是检查用户是否有权编辑产品。在操作中进行任何数据库更新之前请检查此项,您无需担心修改隐藏值的用户。

如果你想强制用户去你的网页执行帖子,你可以使用Html.AntiForgeryToekn()。但是,用户仍然可以访问该网站,查看防伪令牌并将其与他们的请求一起传递。

【讨论】:

    【解决方案2】:

    您可以使用服务器上的密钥对产品 ID 进行签名(使用 HMACSHA512),然后在回发中验证签名。

    您可能希望在签名时包含当前日期和/或用户或会话 ID,以防止重放攻击。

    【讨论】:

    • 谢谢。这可行,但似乎有点工作。我可以创建任何过滤器或选项,以便我可以指定忽略来自查询字符串的任何绑定?
    【解决方案3】:

    您应该在EditProducts 操作中实施适当的访问控制,以便尝试编辑不同的产品会产生错误。

    试图阻止用户修改查询字符串无济于事

    【讨论】:

    • 如果这是一个经典的 asp.net 应用程序,我会使用一个链接按钮来回传值而不用担心任何作弊,对吧?我不会检查他们是否有权编辑,因为这一切都已完成并呈现。我只是去编辑。
    • @Matt:完全错误。任何人都可以编辑隐藏字段。如果您有执行此操作的 WebForms 应用程序,您应该立即返回并修复它们。
    • omg...我刚刚修改了一个隐藏元素,它使用新值提交。我们的应用程序现在搞砸了。感谢您的投入。
    【解决方案4】:

    我建议您在模型中添加一个 rowversion(时间戳)列。这比签名或散列容易得多(如果您可以更改模型)。

    【讨论】:

    • 谢谢彼得。我不确定我是否遵循了解决方案。当用户不应该访问此记录时,添加时间戳如何帮助防止用户调用 editproducts?productid="123"&name="xyz"。
    • @Matt - 从您的问题中不清楚您是否试图限制对该项目的访问。我将您的问题解释为您认为用户可以通过更改查询字符串来更新项目。为了清楚起见,请编辑您的问题。
    • 这个想法是,只有少数按访问权限过滤的产品在 GUI 中呈现给用户,他们只能编辑这些产品。因此,任何授权用户都可以通过调用操作来调用 editproducts 并在查询字符串中传递任何有效的 id(具有良好的猜测)并编辑产品。需要防止这种情况,以便用户无法提供来自查询字符串的信息,而是仅通过表单集合提交到模态绑定
    猜你喜欢
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多