【问题标题】:Validate user input against server generated data根据服务器生成的数据验证用户输入
【发布时间】:2017-02-01 14:37:19
【问题描述】:

我目前正在使用 asp.net MVC 创建一个应用程序,我需要验证用户是否在预先生成给他的内容中选择了值。

简单流程示例:

- 服务器生成一组值:{10%, 20%, 30%, 40%, 50%} - 视图显示一个下拉列表,其中包含为该用户生成的值 - 用户必须只选择一个预先生成的值

考虑到用户可以修改 html 并在下拉列表中放置一个随机值 - 例如 80%。我将如何限制/防止这种行为?

我目前正在考虑使用 MemoryCache 来存储允许的值集并使用用户 ID 作为键。不知道是不是最好的解决方案。任何建议将不胜感激。

【问题讨论】:

  • 如果你有在页面渲染时提供给用户的值,那么当表单以同样的方式提交时你肯定可以访问相同的值并将它们与用户输入进行比较吗?跨度>
  • @jdurc 并不是那么简单,因为用户(正如我之前所说)可以伪造表单上的值以包含他想要的任何内容。因此,如果服务器生成了一组 {10%, 20%},用户可以简单地将其更改为 {50%, 100%}。然后 {50%, 10%} 将被发送回控制器,而服务器不知道之前生成了什么。问题是即使用户修改了页面上的 html,也可以将预生成的值放在哪里进行验证。
  • 我不太确定您是否理解我的问题。你最初是如何为用户生成这些值的,为什么你不能再次做同样的事情来将它们与用户输入进行比较?
  • @jurc 因为值是随机生成的。

标签: asp.net asp.net-mvc security model-view-controller asp.net-core-mvc


【解决方案1】:

这是一个有趣的问题。 MemoryCache 不过是个糟糕的选择。你放在那里的任何东西都不能保证能到达那里,更不用说停留任何可靠的时间了。这一切都取决于服务器上发生了什么。如果某个进程需要更多内存,MemoryCache 将是第一件事。如果应用程序池回收、崩溃、服务器重新启动等,MemoryCache 中的任何内容都会消失。而且,如果您使用多个工作人员(网络农场),那么 MemoryCache 不会在它们之间共享,从而导致奇怪的问题,即数据可能或可能不可用,具体取决于用户在每个请求中登陆的工作人员。

Session 可能是尽可能简单地保存值的最佳位置,但您需要确保您的会话存储类似于 SQL Server、Redis 等。如果您使用 In Proc,您会有与MemoryCache 相同的问题,甚至StateServer 也可能是不稳定的,尽管它至少比In Proc 好。存储在会话中还可以确保用户无法修改这些值。

【讨论】:

    【解决方案2】:

    解决方案比我想象的要简单。我所做的基本上是:

    1. 生成值(例如:10%、20%、30%、40%、50%)
    2. 散列值并将其放入视图模型中
    3. 使用计算的哈希创建隐藏输入
    4. 散列发布的值并检查其是否等于先前的散列

    在我的例子中,我使用 Compare ValidationAttribute 来检查哈希值,因此用户只有在为他生成的值正确时才能提交表单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-10
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 2014-06-29
      • 2012-12-05
      • 1970-01-01
      相关资源
      最近更新 更多