【问题标题】:How to Check HTTP Header is modified by User如何检查 HTTP 标头被用户修改
【发布时间】:2011-11-01 00:21:25
【问题描述】:

一些网络浏览器有扩展/附加组件,例如。带有 Modify Header 或 Tamper Data 的 FireFox,可以在将 HTTP Header 发送到服务器之前修改 GET/POST 方法的 HTTP Header。

那么,如何从服务器端检查 Header 是否被用户修改?

【问题讨论】:

  • 我假设像分数排名系统这样的情况,我使用 MySQL 作为保持排名数据库,并让 keep.php 从 Flash 游戏中接收分数和用户 ID。我的游戏有 1 个阶段,需要 60 秒才能完成。击杀 1 只怪物可获得 1 分。因此,用户玩游戏,修改标题中的分数,然后发送到服务器。这种情况下,如何判断用户是否作弊?
  • 除非服务器参与实际游戏,否则不可能。如果您想信任客户端报告其分数,那么您能做的最好的事情就是混淆与服务器的所有通信,使其更难破解。

标签: http-headers


【解决方案1】:

由于所有标头都来自客户端作为 HTTP 请求的一部分,因此它们本质上都是由客户端修改的。您无法确定插件添加/修改了哪些标头,至少不能确定。您可以做的最好的事情是尝试收集一些启发式数据并尝试识别来自特定插件的已知修改(例如,插件“Foo”总是添加一个看起来像“Foo bar baz”的“XYZ”标题),但即使那样你也是必然会得到大量的误报或误报。

问题是,你为什么想知道这个?如果您依赖标头中的信息(cookie 等),您可以在服务器端加密该数据。这将保护它免受客户端修改。

【讨论】:

    【解决方案2】:

    除非标头值无效,否则您不能这样做。如果他们在会话期间编辑标题值,您可以检查浏览器和其他标题字段并将它们存储在会话中,然后检查这些是否没有更改。即,如果在会话过程中,从标头收集的 $_SERVER['HTTP_USER_AGENT'] 发生更改,则标头已被篡改。

    但是,如果标头值有效且并非意外,即如果您正在接收页面未使用的值的请求,则通过 $_GET[''] 数组循环将带回通过 GET 发送的所有信息如果您收到太多或不需要的值,那么您可以调用 die 或记录它。

    请记住,我知道这些示例都是 PHP,但您没有提到要检查的语言,所有语言都有等效的方法。

    【讨论】:

      【解决方案3】:

      在请求到达您的服务器之前,您无法可靠地猜测请求发生了什么,它甚至可能是手动制作的。

      如果您试图确保客户端永远不会发送您的应用程序未设置的 cookie(或类似的东西),您不得做出任何此类假设。始终假定从远程用户发送的数据是恶意的并谨慎使用。您可以改为使用 HMAC 签署您的 cookie,以确保没有您的密钥没有人可以创建有效的 cookie。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-09
        相关资源
        最近更新 更多