首页 > 解决方案 > 客户访问 Superglobals

问题描述

PHP Superglobals 的行为方式不同,我永远不确定该使用哪一种。

客户端(我不是在谈论黑客或安全攻击,而是“普通用户”)何时可以编辑、创建或访问超全局变量?

甚至php.net文档也没有谈论这个事实。

根据我到目前为止所学到的知识,我可以这样总结它们:

superglobal     read      create      edit

$_GET           V         V           V

$_POST          X         V           X

$_FILES         X         V           X

$_SESSION       ?         X           X

$_COOKIE        V         V           V

我不是在谈论当用户发送表单或类似的东西时创建SESSION变量的PHP脚本,但我说的是任何人都可以在 DOM 中添加假表单来发布任何内容或使用简单的像EditThisCookie这样的Chrome 扩展来读取、创建或编辑任何COOKIE

所以:

  1. 我的桌子对吗?我不确定某些要点,出于安全原因,它们至关重要
  2. 我应该在哪里存储敏感数据,例如访问令牌或用户ID

我一直将ID存储在COOKIE中,因为我可以设置它的过期时间,然后我发现任何人都可以伪造它们。如果没有办法阻止它,我将被迫使用SESSION,问题是它与浏览器会话一起过期(当用户关闭其浏览器时,他会丢失其登录会话)。

或者有时我使用POST方法来验证调用是否来自特定页面,但后来我意识到客户端可以读取该表单的内容并从任何地方伪造它。我也应该为此目的使用SESSION吗?

标签: phpsecurityclientbackendsuperglobals

解决方案


我的桌子对吗?

不。

除了$_SESSION所有这些超全局变量都包含从客户端发出的请求中提取的数据。客户端可以为它们中的任何一个设置初始值(对于给定的 PHP 程序运行)。

客户端无法读取其中任何一个。(他们可以读取浏览器发送或存储的所有数据,并从中推断出任何超全局变量中的数据($_SESSION仍然除外),但他们自己无法读取超全局变量)。

客户端不能编辑它们中的任何一个(除了发出一个新的请求,它会从一开始就重新运行 PHP 程序)。

$_SESSION包含存储在服务器上的数据。可以使用存储在 cookie 中并由客户端发送的 SESSION ID 来选择特定会话。


任何人都可以在 DOM 中添加一个伪造的表单来发布任何内容,或者使用像 EditThisCookie 这样的简单 Chrome 扩展来读取、创建或编辑任何 COOKIE。

是的。不要盲目相信来自客户的数据。客户端可以在 cookie、查询字符串或帖子正文中发送它想要的任何数据。


或者有时我使用 POST 方法来验证调用是否来自特定页面,但后来我意识到客户端可以读取该表单的内容并从任何地方伪造它。我也应该为此目的使用 SESSION 吗?

你可能不应该在意。

(欺骗第三方提交虚假数据是另一回事,但请参阅这个问题)。


我应该在哪里存储敏感数据,例如访问令牌或用户 ID?

访问令牌(假设它们是旨在让特定用户访问某些东西的令牌,而不是(比如说)您的服务器应该用来访问第三方服务器的 API 密钥)需要存储在客户端上。具体位置取决于您将如何使用它。在大多数情况下,会话 ID 就可以了。

用户 ID(假设它们被用作用户是该用户 ID 的证据)需要以不能被其他人编辑的方式存储。这意味着要么存储在服务器上(通常在会话中),要么以无法更改的格式存储(如客户端上的加密 JWT)。


推荐阅读