客户访问 Superglobals

Client access to 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

我不是在谈论您的 PHP 脚本,该脚本会在用户发送表单或类似内容时创建 SESSION 变量,但我在谈论事实上,任何人都可以在 DOM 到 POST 中添加一个 假表格 或使用简单的 Chrome 像 EditThisCookie 这样的扩展来读取、创建或编辑任何 COOKIE.

所以:

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

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

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

Is my table right?

没有

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

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

客户端不能编辑其中的任何一个(除非发出一个新的请求,该请求将从头开始重新运行 PHP程序).

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


anyone could add a fake form inside the DOM to POST anything or use a simple Chrome extension like EditThisCookie to read, create or edit any COOKIE.

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


Or sometimes I used POST method to verify that a call comes from a specific page, but then I realized that the client could read the content of that form and fake it from everywhere. Should I use SESSION for this purpose too?

你可能不应该在意。

(诱骗第三方提交虚假数据另当别论,见this question)。


Where should I store sensible data such as access tokens or user IDs?

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

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