【问题标题】:Secure html form variable安全的 html 表单变量
【发布时间】:2014-05-12 22:33:41
【问题描述】:

我不希望我的用户能够使用检查元素更改 ('+res.id+') 和 ('+res.level'),因为如果他们这样做会改变提交按钮的结果。

例如 '+res.id+' 是 = 2 并且 2 等于 fireragon,但是如果人们使用 inspect 元素,他们可以将 2 更改为 1 并且 1 等于 Lightningdragon。然后当他们点击战斗时,火龙变成了闪电龙。基本上他们可以随心所欲地战斗。

有没有办法阻止人们更改这些变量或检查变量是否已更改,以便我可以向用户发送错误消息?

                html += '<form name="input" action="ingame.php?page=attack/travel/startbattle" enctype="multipart/form-data" method="post">';
                html += '<input type="hidden" id="goid" name="goid" value="'+res.id+'">';
                html += '<input type="hidden" id="level" name="level" value="'+res.level+'">';
                html += '    <input type="submit" value="Battle!" class="button"/>';
                html += '</form>';

【问题讨论】:

  • 我建议在服务器端检查它,使用会话或类似的东西。为该特定用户随机生成的唯一哈希

标签: javascript html forms secure-coding inspect-element


【解决方案1】:

如果您想存储您可以信任的变量,请不要将它们发送到客户端,而是仅将它们保存在服务器内存中(使用会话状态、数据库或其他在请求之间持续存在的后备存储)。

如果您需要与客户端共享值,则将它们发送出去,但不要接受它们作为用户的输入。

作为第三种选择,如果您有一个完全无状态的服务器并且需要向客户端公开值,那么您可以对这些值进行加密和/或签名,这样当它们从客户端返回时,您可以验证它们没有被篡改。使用消息验证码就是这种方法的一种实现方式:http://en.wikipedia.org/wiki/Message_authentication_code

【讨论】:

    【解决方案2】:

    您无法阻止用户向您的表单端点提交他们喜欢的任何参数。即使您可以以某种方式阻止表单值被更改,也有人可以使用curl 或类似的方式向服务器发送定制请求。

    您需要对输入值进行服务器端验证。您可能需要存储一个可以在提交表单时检索到的中间对象,然后您就不必将这些值作为隐藏字段携带。

    【讨论】:

      猜你喜欢
      • 2020-09-09
      • 2013-04-30
      • 1970-01-01
      • 2012-10-29
      • 2011-11-02
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      • 2014-03-05
      相关资源
      最近更新 更多