php - 客户访问 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。
所以:
- 我的桌子对吗?我不确定某些要点,出于安全原因,它们至关重要
- 我应该在哪里存储敏感数据,例如访问令牌或用户ID?
我一直将ID存储在COOKIE中,因为我可以设置它的过期时间,然后我发现任何人都可以伪造它们。如果没有办法阻止它,我将被迫使用SESSION,问题是它与浏览器会话一起过期(当用户关闭其浏览器时,他会丢失其登录会话)。
或者有时我使用POST方法来验证调用是否来自特定页面,但后来我意识到客户端可以读取该表单的内容并从任何地方伪造它。我也应该为此目的使用SESSION吗?
解决方案
我的桌子对吗?
不。
除了$_SESSION
所有这些超全局变量都包含从客户端发出的请求中提取的数据。客户端可以为它们中的任何一个设置初始值(对于给定的 PHP 程序运行)。
客户端无法读取其中任何一个。(他们可以读取浏览器发送或存储的所有数据,并从中推断出任何超全局变量中的数据($_SESSION
仍然除外),但他们自己无法读取超全局变量)。
客户端不能编辑它们中的任何一个(除了发出一个新的请求,它会从一开始就重新运行 PHP 程序)。
$_SESSION
包含存储在服务器上的数据。可以使用存储在 cookie 中并由客户端发送的 SESSION ID 来选择特定会话。
任何人都可以在 DOM 中添加一个伪造的表单来发布任何内容,或者使用像 EditThisCookie 这样的简单 Chrome 扩展来读取、创建或编辑任何 COOKIE。
是的。不要盲目相信来自客户的数据。客户端可以在 cookie、查询字符串或帖子正文中发送它想要的任何数据。
或者有时我使用 POST 方法来验证调用是否来自特定页面,但后来我意识到客户端可以读取该表单的内容并从任何地方伪造它。我也应该为此目的使用 SESSION 吗?
你可能不应该在意。
(欺骗第三方提交虚假数据是另一回事,但请参阅这个问题)。
我应该在哪里存储敏感数据,例如访问令牌或用户 ID?
访问令牌(假设它们是旨在让特定用户访问某些东西的令牌,而不是(比如说)您的服务器应该用来访问第三方服务器的 API 密钥)需要存储在客户端上。具体位置取决于您将如何使用它。在大多数情况下,会话 ID 就可以了。
用户 ID(假设它们被用作用户是该用户 ID 的证据)需要以不能被其他人编辑的方式存储。这意味着要么存储在服务器上(通常在会话中),要么以无法更改的格式存储(如客户端上的加密 JWT)。
推荐阅读
- javascript - 登录按钮单击ReactJS后如何更改页面
- c# - 无法从 .Net Core 3.0 中的程序集中加载类型
- arrays - TypeScript:定义未知大小的数组类型,其中第一个元素是 A 类型,其余元素是 B 类型
- javascript - React 什么时候重新渲染子组件?
- laravel - Laravel Vapor - 维护模式页面上的资产(徽标)
- python - 如何在 Pandas 中获得两列的组合?
- java - 调用创建类实例的 aa 方法会看到错误的变量类型
- unity3d - unity3d 属性在脚本运行时重置为默认值
- typescript - 在 ts-jest 中恢复导入的类函数的模拟
- excel - 使用 VBA 解锁受保护的单元格