Warning

本特性已自

PHP 5.3.0 起废弃并将自 PHP 5.4.0

起移除。

可能 PHP 中最具争议的变化就是从 PHP » 4.2.0

版开始配置文件中 PHP 指令 [register_globals](php7/ini.core)

的默认值从 on 改为 off 了。对此选项的依赖是如此普遍以至于很多人根本不知道它的存在而以为

PHP 本来就是这么工作的。本节会解释用这个指令如何写出不安全的代码,但要知道这个指令本身没有不安全的地方,误用才会。

当 register_globals 打开以后,各种变量都被注入代码,例如来自 HTML

表单的请求变量。再加上 PHP 在使用变量之前是无需进行初始化的,这就使得更容易写出不安全的代码。这是个很艰难的抉择,但

PHP 社区还是决定默认关闭此选项。当打开时,人们使用变量时确实不知道变量是哪里来的,只能想当然。但是

register_globals 的关闭改变了这种代码内部变量和客户端发送的变量混杂在一起的糟糕情况。下面举一个错误使用 register_globals 的例子:

Example #1 错误使用 register_globals = on 的例子

// 当用户合法的时候,赋值 $authorized = true

if (authenticated_user()) {

$authorized = true;

}

// 由于并没有事先把 $authorized 初始化为 false,

// 当 register_globals 打开时,可能通过GET auth.php?authorized=1 来定义该变量值

// 所以任何人都可以绕过身份验证

if ($authorized) {

include "/highly/sensitive/data.php";

}

?>

当 register_globals = on 的时候,上面的代码就会有危险了。如果是

off,$authorized 就不能通过如 URL

请求等方式来改变,这样就好多了,尽管初始化变量是一个良好的编程习惯。比如说,如果在上面的代码执行之前加入

$authorized = false 的话,无论 register_globals 是 on 还是

off 都可以,因为用户状态被初始化为未经认证。

另一个例子是关于[会话](php7/ref.session)的。当 register_globals = on

的时候,$username 也可以用在下面的代码中,但要意识到

$username 也可能会从其它途径进来,比如说通过 URL 的 GET。

Example #2 使用会话时同时兼容 register_globals on 和 off 的例子

// 我们不知道 $username 的来源,但很清楚 $_SESSION 是

// 来源于会话数据

if (isset($_SESSION['username'])) {

echo "Hello {$_SESSION['username']}";

} else {

echo "Hello Guest
";

echo "Would you like to login?";

}

?>

采取相应的预防措施以便在伪造变量输入的时候给予警告是完全有可能的。如果事先确切知道变量是哪里来的,就可以检查所提交的数据是否是从不正当的表单提交而来。不过这不能保证变量未被伪造,这需要攻击者去猜测应该怎样去伪造。如果不在乎请求数据来源的话,可以使用

[$_REQUEST](php7/reserved.variables.request) 数组,它包括了 GET、POST 和 COOKIE

的所有数据。详情可参见本手册的[来自 PHP 之外的变量](php7/language.variables.external)。

Example #3 探测有害变量

if (isset($_COOKIE['MAGIC_COOKIE'])) {

// MAGIC_COOKIE 来自 cookie

// 这样做是确保是来自 cookie 的数据

} elseif (isset($_GET['MAGIC_COOKIE']) || isset($_POST['MAGIC_COOKIE'])) {

mail("admin@example.com", "Possible breakin attempt", $_SERVER['REMOTE_ADDR']);

echo "Security violation, admin has been alerted.";

exit;

} else {

// 这一次请求中并没有设置 MAGIC_COOKIE 变量

}

?>

当然,单纯地关闭 register_globals

并不代表所有的代码都安全了。对于每一段提交上来的数据,都要对其进行具体的检查。永远要验证用户数据和对变量进行初始化!把

[error_reporting()](php7/function.error-reporting) 设为

E_NOTICE 级别可以检查未初始化的变量。

更多关于模拟 register_globals 为 on 或 off 的信息,请见此

[FAQ](php7/faq.misc)。

Note: Superglobal 可用性说明:

自 PHP 4.1.0 起可以使用 Superglobal 数组,例如 [$_GET](php7/reserved.variables.get),[$_POST](php7/reserved.variables.post),和

[$_SERVER](php7/reserved.variables.server),等等。更多信息请阅读手册中的 [superglobals](php7/language.variables.predefined) 章节。

php7 globals,使用 Register Globals - PHP 7 中文文档相关推荐

  1. php7数组写法,数组运算符 - PHP 7 中文文档

    数组运算符 数组运算符 例子 名称 结果 $a + $b 联合 $a 和 $b 的联合. $a == $b 相等 如果 $a 和 $b 具有相同的键/值对则为 TRUE. $a === $b 全等 如 ...

  2. Juicer 中文文档

    Juicer 中文文档 当前最新版本: 0.6.8-stable Juicer 是一个高效.轻量的前端 (Javascript) 模板引擎,使用 Juicer 可以是你的代码实现数据和视图模型的分离( ...

  3. React-bootstrap 中文文档

    翻译了 React-bootstrap 中文文档,参考 react.tgwoo.com. React-Bootstrap 是可重用的前端组件库.与 Twitter Bootstrap 一致外观与感受, ...

  4. kafka中文文档(0.10.0)

    kafka中文文档(0.10.0) 作者:链上研发-老杨叔叔 时间:2016-07-22 版本:Apache Kafka 0.10.0 (2016年5月底发布) .目录 kafka中文文档0100 目 ...

  5. Springboot 中文文档 —— Actuator

    文章目录 1 **启用** 2 **端点(endpoints)** 2.1 启用端点 2.2 公开端点 2.3 保护HTTP端点 2.4 配置端点缓存 2.5 配置 /actuator 路径 2.6 ...

  6. Spring Cloud Dalston.RELEASE中文文档

    Spring Cloud Dalston.RELEASE中文文档 Spring Cloud 目录 特性 云原生应用程序 Spring Cloud上下文:应用程序上下文服务 引导应用程序上下文 应用程序 ...

  7. lavaral中文手册_Laravel-mix 中文文档

    概览 基本示例 larave-mix 是位于webpack顶层的一个简洁的配置层,在 80% 的情况下使用 laravel mix 会使操作变的非常简单.尽管 webpack 非常的强大,但大部分人都 ...

  8. Web3.js API 中文文档

    Web3.js API 中文文档 http://web3.tryblockchain.org/Web3.js-api-refrence.html web3对象提供了所有方法. 示例: //初始化过程 ...

  9. PyTorch官方中文文档:torch.optim 优化器参数

    内容预览: step(closure) 进行单次优化 (参数更新). 参数: closure (callable) –...~ 参数: params (iterable) – 待优化参数的iterab ...

  10. golang中文文档_Golang 标准库 限流器 time/rate 设计与实现

    限流器是后台服务中十分重要的组件,在实际的业务场景中使用居多,其设计在微服务.网关.和一些后台服务中会经常遇到.限流器的作用是用来限制其请求的速率,保护后台响应服务,以免服务过载导致服务不可用现象出现 ...

最新文章

  1. OpenAI 研究员最新博客:如何在多GPU上训练真正的大模型?
  2. Linux监控软件之 Cacti
  3. 闭包应用之延迟函数setTimeout
  4. Springboot2学习博客
  5. 博客专题计划:《在实践中深入理解常见网络协议》
  6. java 获取数据源_J2EE java 获取数据源
  7. 如何使用jQuery设置输入文本的值
  8. 信息流媒体变现_抖音信息流投放优势,为什么选择抖音信息流广告投放呢?
  9. Python 合成多张图片到PDF格式
  10. 交通流分析1:《基于大数据的城市公路交通流短时预测研究_张红》阅读总结
  11. 农产品线上销售(果蔬)管理系统
  12. 大咖云集!2018中国计算机大会在杭州举行
  13. 68pin SCSI接头针脚排序
  14. iphone个系列尺寸_Iphone各个型号机型的详细参数,尺寸和dpr以及像素
  15. 东芝自助结账设备市场份额增长近50%
  16. Java 社区平台 - Sym 1.7.0 发布
  17. 【疲劳检测】基于形态学实现疲劳检测附matlab代码
  18. Error:NgdBuild:604解决方法
  19. Wps文档如何转换为pdf文件
  20. 【华为机试真题详解】不含 101 的数【2022 Q4 | 100分】

热门文章

  1. java模板方法模式_JAVA 设计模式 模板方法模式
  2. 秒杀的性能问题和超卖
  3. php 读取优酷视频缩略图,PHP优酷土豆酷6采集入库函数(获取视频缩略图,视频swf地址,视频标题)...
  4. Android 自定义View 新年烟花、横幅动画
  5. 如何永久修改/校正linux系统时间
  6. RDIFramework.NET代码生成器全新V5.0版本发布
  7. Rails之父DHH在RailsConf2006上的Keynote Address TRANSCRIPT Part 1 of 8
  8. 作为产品经理,有必要考各种证书吗?比如:pmp,npdp。证书对薪资有影响吗?
  9. 百度网盘打不开客户端的解决方法
  10. iOS实现一个包含若干页面和子页面的“打卡”App