【问题标题】:relying on hidden inputs and query strings依赖隐藏的输入和查询字符串
【发布时间】:2009-05-16 05:42:18
【问题描述】:

假设我有一个接受参数的请求处理程序:key

让请求成为:

http://example.com/2323

当处理程序接收到 GET 时,会根据此键从 db 中获取相关数据,并将其馈送到表单并显示。在这个过程中,key 的值被放入一个隐藏的输入中。

当它收到一个 POST 时,它具有来自查询字符串的 key 参数,以及来自隐藏输入的 key,只要用户没有篡改它们,它们是相同的。

我想知道当表单上的数据保存到 db 时我应该依赖的隐藏输入或查询字符串参数。问题是查询字符串可能在发布前被用户修改,就像隐藏的输入也可能被修改,因为源对用户是开放的。

【问题讨论】:

    标签: language-agnostic


    【解决方案1】:

    好吧,您发送给客户端的任何数据都有可能被修改(这可能不是微不足道的,但这种可能性仍然存在)。

    有很多选择;查询字符串、隐藏字段、cookie 等等。它们中的每一个都存在这个缺点 - 恶意用户可能会修改这些实体中的数据。

    您最好的选择是使用强加密。无论是隐藏字段中的数据还是cookie,都可以轻松加密。然后当接收到请求时,可以将其与较早响应之前存在的值进行比较,并且可以合理地相信数据没有被篡改来解密。举个很好的例子,你应该研究ASP.NET Viewstate 的工作原理。

    因此,要回答您的问题,您不应该依赖任何状态持久性方法而不需要额外的安全实现。正如他们所说,Security through obscurity 根本不安全。

    【讨论】:

    • 为什么,谢谢@RoosterOnAcid!您到那里的一个完全不同且有趣的网站。 :-)
    • 谢谢,Cerebrus。我想知道其他语言中是否存在类似asp.net的viewstate的机制,例如python或php,或者他们有什么措施来最小化这种风险?
    • @Cerebrus:呵呵,希望这是一种恭维吗? :)
    • @RoosterOnAcid:这确实是一种恭维。我确实喜欢网站设计。 ;-)
    猜你喜欢
    • 1970-01-01
    • 2012-01-23
    • 2012-11-08
    • 1970-01-01
    • 2020-11-04
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多