代码之家  ›  专栏  ›  技术社区  ›  Daniel F. Thornton

违反Web开发规则

  •  1
  • Daniel F. Thornton  · 技术社区  · 15 年前

    退房 this page 纽约时报:

    http://homedelivery.nytimes.com/HDS/learnMorePopUp.do ?mode=common.learnMorePopUp
    &productId=NDS
    &prodRate=7.40

    当我手动修改 prodRate 参数,页面已更新:

    • 入门订阅率。
    • 常规订阅率。

    你自己试试看!现在,我没有做太多的Web开发,但我知道这可能不应该发生。所以我想知道:

    • 什么样的实现会导致这种行为?
    • 如何修改页面以对最终用户隐藏这些敏感参数?
    5 回复  |  直到 15 年前
        1
  •  1
  •   atj    15 年前

    你可能想重新表述你的问题,因为我能想到的唯一答案不是太有启发性:

    问:什么样的实施会导致这种行为?
    答:允许用户输入控制内部可信行为的方法。如果你问“为什么会有人这样做”,我通常认为这是一个误会。代码作者通常不知道用户可以(a)控制值和/或(b)甚至发现它的存在。最常见的情况是,我将此实现为重定向-单击一个按钮,服务器确定数量,然后将浏览器重定向到维护该值的新页面

    问:您如何修改页面以对最终用户隐藏这些敏感参数?
    答:不要以最终用户可编辑的方式存储值。如果服务器上有可用的存储空间(如servlet引擎),请将其存储在会话上下文中。如果你没有一个好的会话机制,你可以把它存储在一个签名的或HMAC'd的cookie中。

        2
  •  3
  •   Brandon    15 年前

    他们可能只是为了显示而直接从查询字符串中读取值。我非常怀疑(或者更确切地说,我真的希望)任何实际的订单处理都不是基于该值,而是基于使用产品ID的查找。

        3
  •  1
  •   Martin Clarke    15 年前

    嗯,你真的试着点了吗?它可能会验证后端的输入。

    至于其他选择,他们可以考虑发布信息或将信息放入cookie。这两者都不完全是傻瓜的证据。你不能得到一个有帖子的新窗口,用户可以关闭cookies。

        4
  •  1
  •   Godeke    15 年前

    你不能从那个页面订购,所以我看不到这里有安全漏洞。是的,它很俗气,但如果实际的订单流构造得这么差,我会更担心。它确实可以很容易地在一个地方更新速率并传递值,所以我可以看到它是如何发生的。

    我们有一些评级页面的作用基本相同。它们没有连接到实际的采购流程,所以参数很好。如果客户端想通过编辑一个URL来混淆自己,那么就这样吧…实际订单流是所有数据库驱动的,用户编辑永远不可信。

        5
  •  1
  •   Dan Diplo    15 年前

    我发现了很多这样的坏习惯。我见过网站在查询字符串中传递整个SQL查询,然后 执行 . 我还记得我在网上找到了一家通过查询字符串传递价格的商店。我把一个换成了负值,当然,结账时的价格是负的!不过,我没有再进一步——从技术上讲,这是欺诈,不值得冒险。