PHP安全之register_globals (转)
一、register_globals = Off 和 register_globals = On的区别
register_globals是php.ini里的一个配置,这个配置影响到php如何接收传递过来的参数.
register_globals的值可以设置为:On或者Off,我们举一段代码来分别描述它们的不同。
- <form action='' method='get'>
- <input type='text' name='username' value='alex' >
- <input type='submit' name='sub' value='sub'>
- </form>
- <?php
- echo 'username::',$username;
- echo '<br>sub::',$sub;
- echo '<br>GET::';
- print_r($_GET);
- ?>
<form action='' method='get'>
<input type='text' name='username' value='alex' >
<input type='submit' name='sub' value='sub'>
</form>
<?php
echo 'username::',$username;
echo '<br>sub::',$sub;
echo '<br>GET::';
print_r($_GET);
?>
当register_globals = On的时候,程序运行提交输出结果为:
- username::alex
- sub::sub
- array ( [username] => alex [sub] => sub )
username::alex
sub::sub
array ( [username] => alex [sub] => sub )
当register_globals = Off的时候,程序运行提交输出结果为:
- username::
- sub::
- array ( [username] => alex [sub] => sub )
username::
sub::
array ( [username] => alex [sub] => sub )
通过测试结果,显而易见:register_globals的意思就是注册为全局变量,所以当On的时候,传递过来的值会被直接的注册为全局变量直接使用,而Off的时候,我们需要到特定的数组里去得到它。
二、为什么推荐register_globals = Off?
1.PHP 4.2.0 版开始配置文件中 register_globals 的默认值从 on 改为 off 了,虽然你可以设置它为On,但是当你无法控制服务器的时候,你的代码的兼容性就成为一个大问题,所以,你最好从现在就开始用Off的风格开始编程。
2.当 register_globals 打开以后,各种变量都被注入代码,例如来自 HTML 表单的请求变量。再加上 PHP 在使用变量之前是无需进行初始化的,这就使得更容易写出不安全的代码。当打开时,人们使用变量时确实不知道变量是哪里来的,只能想当然。但是 register_globals 的关闭改变了这种代码内部变量和客户端发送的变量混杂在一起的糟糕情况。例子来源手册
- <?php
- // 当用户合法的时候,赋值
- $authorized = true
- if (authenticated_user()) {
- $authorized=true;
- }
- // 由于并没有事先把 $authorized 初始化为 false,
- // 当 register_globals 打开时,可能通过GET auth.php?authorized=1 来定义该变量值
- // 所以任何人都可以绕过身份验证
- if ($authorized) {
- include"/highly/sensitive/data.php";
- }
- ?>
<?php
// 当用户合法的时候,赋值
$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 都可以,因为用户状态被初始化为未经认证。
三、如果需要在一台关闭了 register_globals 的共享主机上运行一些旧式程序而该程序需要此选项打开时怎么办?
本例模拟 register_globals On。如果改变了配置文件中的 variables_order 选项,则考虑对 $superglobals 作出相应的改动。
- <?php// Emulate register_globals on
- if (!ini_get('register_globals')) {
- $superglobals= array($_SERVER,$_ENV,$_FILES,$_COOKIE,$_POST,$_GET);
- if (isset($_SESSION)) {
- array_unshift($superglobals,$_SESSION);
- }
- foreach ($superglobals as $superglobal) {
- extract($superglobal,EXTR_SKIP);
- }
- }
- ?>
<?php// Emulate register_globals on
if (!ini_get('register_globals')) {
$superglobals= array($_SERVER,$_ENV,$_FILES,$_COOKIE,$_POST,$_GET);
if (isset($_SESSION)) {
array_unshift($superglobals,$_SESSION);
}
foreach ($superglobals as $superglobal) {
extract($superglobal,EXTR_SKIP);
}
}
?>
四、如果需要在一些打开了register_globals选项的主机上但想消除安全隐患,该怎么办?
本例模拟 register_globals Off。要记住此代码应在脚本最开头的地方调用。如果使用了会话机制,则在 session_start() 之后调用。
- <?php// Emulate register_globals off
- functionun register_GLOBALS(){
- if (!ini_get('register_globals')) {
- return;
- }
- // Might want to change this perhaps to a nicer error
- if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS'])) {
- die('GLOBALS overwrite attempt detected');
- }
- // Variables that shouldn't be unset
- $noUnset= array('GLOBALS','_GET','_POST','_COOKIE','_REQUEST','_SERVER','_ENV','_FILES');
- $input=array_merge($_GET,$_POST,$_COOKIE,$_SERVER,$_ENV,$_FILES,isset($_SESSION) &&is_array($_SESSION) ?$_SESSION: array());
- foreach ($input as $k=>$v) {
- if (!in_array($k,$noUnset) && isset($GLOBALS[$k])) {
- unset($GLOBALS[$k]);
- }
- }
- }
- unregister_GLOBALS();
- ?>
<?php// Emulate register_globals off
functionun register_GLOBALS(){
if (!ini_get('register_globals')) {
return;
}
// Might want to change this perhaps to a nicer error
if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS'])) {
die('GLOBALS overwrite attempt detected');
}
// Variables that shouldn't be unset
$noUnset= array('GLOBALS','_GET','_POST','_COOKIE','_REQUEST','_SERVER','_ENV','_FILES');
$input=array_merge($_GET,$_POST,$_COOKIE,$_SERVER,$_ENV,$_FILES,isset($_SESSION) &&is_array($_SESSION) ?$_SESSION: array());
foreach ($input as $k=>$v) {
if (!in_array($k,$noUnset) && isset($GLOBALS[$k])) {
unset($GLOBALS[$k]);
}
}
}
unregister_GLOBALS();
?>
https://www.cnblogs.com/wawahaha/p/4820591.html
PHP安全之register_globals (转)的更多相关文章
- php的register_globals配置
1.需求 看ci文档的时候,看到register_globals,要了解这个配置的使用 2.分析 register_globals是PHP.ini里的一个配置,这个配置影响到php如何接收传递过来的参 ...
- php配置中的register_globals用法
开发的时候设置成register_globals=off,只能通过post或get得到前端数据. 参考资料:http://blog.csdn.net/alex_best/article/details ...
- php安全编程: register_globals的安全性
register_globals?本身并非安全风险.但是,它为跟踪用户输入和确保应用程序安全增加了难度.为什么会这样? 因为如果打开 register_globals,在全局名称空间和 $_GET.$ ...
- register_globals
register_globals参数为On的时候很危险 这里记录一下各版本register_globals的情况 PHP5.2版本register_globals默认为On PHP5.3 PHP5.3 ...
- PHP安全之register_globals
一.register_globals = Off 和 register_globals = On的区别 register_globals是php.ini里的一个配置,这个配置影响到php如何接收传递过 ...
- register_globals(全局变量注册开关)
register_globals,是php.ini文件里面的一个配置选项,接下来,我们可以通过例程来分析一下,当register_globals = on 与 register_globals = o ...
- PHP安全编程:register_globals的安全性 全局变量注册(转)
如果你还能记起早期Web应用开发中使用C开发CGI程序的话,一定会对繁琐的表单处理深有体会.当PHP的register_globals配置选项打开时,复杂的原始表单处理不复存在,公用变量会自动建立.它 ...
- PHP安全编程:register_globals的安全性
如果你还能记起早期Web应用开发中使用C开发CGI程序的话,一定会对繁琐的表单处理深有体会.当PHP的register_globals配置选项打开时,复杂的原始表单处理不复存在,公用变量会自动建立.它 ...
- PHP安全之 register_globals
一.register_globals = Off 和 register_globals = On的区别 register_globals是php.ini里的一个配置,这个配置影响到php如何接收传递过 ...
随机推荐
- 关于InputStream类的available()方法
要一次读取多个字节时,经常用到InputStream.available()方法,这个方法可以在读写操作前先得知数据流里有多少个字节可以读取.需要注意的是,如果这个方法用在从本地文件读取数据时,一般不 ...
- HTML <a> 标签的伪类
伪类的语法: selector : pseudo-class {property: value} CSS 类也可与伪类搭配使用. selector.class : pseudo-class {prop ...
- 使用a标签实现软件下载及下载量统计
通常最简单的软件下载就是采用如下方式: <a id="welcomeMiddleBtn" href="${basePath}/files/client/instal ...
- Java容器——Map接口
1.定义 Map用于保存存在映射关系<key, value>的数据.其中key值不能重复(使用equals()方法比较),value值可以重复. 2.常用实现类 HashMap:和Hash ...
- 55. 45. Jump Game II *HARD*
1. Given an array of non-negative integers, you are initially positioned at the first index of the a ...
- HDU 1936 区间贪心
/* *区间贪心.前几天刚做了POJ 1328 ...思路完全相同... *最多有100个表情,100行文字.遍历寻找每个表情的所在区间.时间复杂度大约在10^5 ~ 10^6 可以接受. *然后对每 ...
- EClassNotFound
---------------------------Debugger Exception Notification---------------------------Project Project ...
- Pycharm(二)创建项目
首次打开就是这样,可以创建新项目,打开一个项目,也可以从版本控制打开项目 我们就新建项目吧,Create New Project 创建项目就是这样了 Location:项目路径. Interprete ...
- Bypass WAF
一.绕过命令执行: 很多WAF会限制参数字符不能为可以执行的命令,诸如ls.nc等,如果直接使用这些字符会直接被WAF拦截,但是可以通过这种的方式绕过这一限制 1.? 符号:这个符号表示条件测试,比如 ...
- WebGL编程指南案例解析之平移和旋转的矩阵实现
手写各种矩阵: //矩阵 var vShader = ` attribute vec4 a_Position; uniform mat4 u_xformMatrix; void main(){ gl_ ...