【问题标题】:How to prevent URL variables tampering in PHP?如何防止 PHP 中的 URL 变量被篡改?
【发布时间】:2011-10-06 13:21:12
【问题描述】:

我正在用 CakePHP 构建一个 web 应用程序,授权用户可以添加、更新、删除记录。在某些控制器中添加记录我的 URL 结构如下:

records/add/id_of_parent_record/secondvar:another_decision_dependent_value.

我担心用户可能会篡改这些 GET 变量,这会导致整个记录损坏。我知道我可以为这些变量使用会话,但我正在寻找最好的方法。请分享您的知识和经验。

【问题讨论】:

    标签: php web-applications cakephp security


    【解决方案1】:

    一般的经验法则是 URL 变量(任何类型,因此包括 URL 中的所有内容)只能用于选择和显示变量。这样,如果用户搞砸了,那又怎样?他们搞砸了,你不能保证这种支持。他们不容易通过粘贴错误的东西来处理后端数据(这或多或少是 RESTful GET 背后的想法)。

    另一方面,如果需要修改某些内容,则应同时使用身份验证(HTTP 身份验证更理想),以便只有有权修改的用户才能进行修改。它通常也是通过 PUT/POST/DELETE 请求完成的。在 PHP 框架中,POST 将是最简单/最常见的,因为 PUT 和 DELETE 需要付出更多努力才能完全支持 PHP。

    【讨论】:

    • 我的意思是只有经过身份验证的用户才能访问该操作。而且我也不相信用户输入。现在我的例如他们访问一个类别页面并在其中添加另一个产品,其 URL 类似于 add/cat_id/。现在仍然会检查 cat_id 以进行验证等。我担心的是用户可以将 URL 更改为 add/some_other_valid_cat_id。我应该发送会话中设置的 cat_id 吗?否则,我会检查 URL 是否来自正确的视图。
    【解决方案2】:

    对这类东西(创建、更新、删除)始终使用 POST 请求,这样就不会意外发生。 但即使您使用 POST,也不要相信用户输入。

    也可以看看Post/Redirect/Get

    【讨论】:

      【解决方案3】:

      除了 POST 和 Post/Redirect/Get 建议。一般来说:

      永远不要相信您在 HTTP 请求中收到的任何信息(包括 GET 参数、POST 数据、Cookie 和 HTTP 标头)。始终确保用户有权对相关数据对象执行每个操作,并且在接受和处理数据之前,始终在服务器端验证数据是否合理。

      【讨论】:

      • 我的意思是只有经过身份验证的用户才能访问该操作。而且我也不相信用户输入。现在我的例如他们访问一个类别页面并在其中添加另一个产品,其 URL 类似于 add/cat_id/。现在仍然会检查 cat_id 以进行验证等。我担心的是用户可以将 URL 更改为 add/some_other_valid_cat_id。我应该发送会话中设置的 cat_id 吗?否则,我会检查 URL 是否来自正确的视图。
      • 也许你需要解释为什么这在你的应用程序设计中是一件坏事。用户向 some_other_valid_cat_id 添加项目有什么问题,为什么与他们向 cat_id 添加项目不同?
      • 是的,这是一个有效的观点。为什么不好?毕竟具有所有权限的用户正在添加。但在我的应用程序中,如果有人试图更改这些值并且它不是来自有效来源,我会重定向它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-28
      • 2017-04-30
      相关资源
      最近更新 更多