PHP安全之register_globals的on和off的区别

一、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);

?>

当register_globals=On的时候,程序运行提交输出结果为:

username::alex 
    sub::sub  
    array ( [username] => alex [sub] => sub )

当register_globals=Off的时候,程序运行提交输出结果为:

username::  
    sub::  
    array ( [username] => alex [sub] => sub )

通过测试结果,显而易见:register_globals的意思就是注册为全局变量,所以当On的时候,传递过来的值会被直接的注册为全局变量直接使用,而Off的时候,我们需要到特定的数组里去得到它。

二、为什么推荐register_globals=Off?

1.PHP4.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"; 

 } 

 ?>

当 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); 

 } 

 } 

 ?>

四、如果需要在一些打开了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安全之register_globals的on和off的区别的文章就介绍到这了,更多相关PHP安全 register_globals内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • PHP安全配置优化详解

    由于脚本语言和早期版本设计的诸多原因,php项目存在不少安全隐患.从配置选项来看,可以做如下的优化. 1.屏蔽PHP错误输出. 在/etc/php.ini(默认配置文件位置),将如下配置值改为Off display_errors=Off 不要将错误堆栈信息直接输出到网页上,防止黑客加以利用相关信息. 正确的做法是: 把错误日志写到日志文件中,方便排查问题. 2.屏蔽PHP版本. 默认情况下PHP版本会被显示在返回头里,如: Response Headers X-powered-by: PHP/7

  • 如何让PHP的代码更安全

    概述 攻击者通过构造恶意SQL命令发送到数据库,如果程序未对用户输入的 SQL命令执行判断过滤,那么生成的SQL语句可能会绕过安全性检查,插入其他用于修改后端数据库的语句,并可能执行系统命令,从而对系统造成危害 例如删除 id 为 1 的帖子,sql 如下: $post_id = $_POST['post_id']; $sql = "DELETE FROM posts WHERE user_id = 1 AND id = $post_id"; \DB::statement($sql);

  • 浅谈php(codeigniter)安全性注意事项

    1.httponly session一定要用httponly的否则可能被xxs攻击,利用js获取cookie的session_id. 要用框架的ci_session,更长的位数,httponly,这些默认都配好了. 不要用原生的phpsession,而要用ci_session.ci_session位数更长. 如果要用原生的session,应该这样设置(php.ini): session.sid_length //sid的长度,这里要加长,默认的太短了 session.cookie_httponl

  • PHP开发api接口安全验证的实例讲解

    php的api接口 在实际工作中,使用PHP写api接口是经常做的,PHP写好接口后,前台就可以通过链接获取接口提供的数据,而返回的数据一般分为两种情况,xml和json,在这个过程中,服务器并不知道,请求的来源是什么,有可能是别人非法调用我们的接口,获取数据,因此就要使用安全验证. 验证原理 示意图 原理 从图中可以看得很清楚,前台想要调用接口,需要使用几个参数生成签名. 时间戳:当前时间 随机数:随机生成的随机数 口令:前后台开发时,一个双方都知道的标识,相当于暗号 算法规则:商定好的运算规

  • php解决安全问题的方法实例

    PHP安全配置 (1) 打开php的安全模式 php的安全模式是个非常重要的内嵌的安全机制,能够控制一些php中的函数,比如system(),同时把很多文件操作函数进行了权限控制,也不允许对某些关键文件的文件,比如/etc/passwd,但是默认的php.ini是没有打开安全模式的,我们把它打开: safe_mode = on (2) 用户组安全 当safe_mode打开时,safe_mode_gid被关闭,那么php脚本能够对文件进行访问,而且相同组的用户也能够对文件进行访问. 建议设置为:

  • PHP网页安全认证的实例详解

    PHP网页安全认证的实例详解 不基于数据库: <?php //unset($_SERVER['PHP_AUTH_USER']); $strAuthUser= $_SERVER['PHP_AUTH_USER']; $strAuthPass= $_SERVER['PHP_AUTH_PW']; if (! ($strAuthUser == "a" && $strAuthPass == "a")) { header('WWW-Authenticate:

  • PHP实现根据密码长度显示安全条

    本文给大家分享一段简单的代码,实现根据密码长度显示安全条功能,代码如下所示: //根据密码长度显示安全条 <ul class="clear"> <li>密 码:</li> <li> <input type="password" id="pwd" name="pwd" class="in" onKeyUp=pwStrength(this.value) on

  • PHP更安全的密码加密机制Bcrypt详解

    前言 我们常常为了避免在服务器受到攻击,数据库被拖库时,用户的明文密码不被泄露,一般会对密码进行单向不可逆加密--哈希. 常见的方式是: 哈希方式 加密密码 md5('123456') e10adc3949ba59abbe56e057f20f883e md5('123456' . ($salt = 'salt')) 207acd61a3c1bd506d7e9a4535359f8a sha1('123456') 40位密文 hash('sha256', '123456') 64位密文 hash('

  • PHP网站常见安全漏洞,及相应防范措施总结

    目前,基于PHP的网站开发已经成为目前网站开发的主流,本文笔者重点从PHP网站攻击与安全防范方面进行探究,旨在减少网站漏洞,希望对大家有所帮助! 一.常见PHP网站安全漏洞 对于PHP的漏洞,目前常见的漏洞有五种.分别是Session文件漏洞.SQL注入漏洞.脚本命令执行漏洞.全局变量漏洞和文件漏洞.这里分别对这些漏洞进行简要的介绍. 1.session文件漏洞 Session攻击是黑客最常用到的攻击手段之一.当一个用户访问某一个网站时,为了免客户每进人一个页面都要输人账号和密码,PHP设置了S

  • PHP安全之register_globals的on和off的区别

    一.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 ty

  • 深入了解 register_globals (附register_globals=off 网站打不开的解决方法)

    深入了解 register_globals dedecms 里强制限制了register_globals 由于register_globals设置控制PHP变量访问范围,如果开启会引起不必要的安全问题,所以这里对其进行了强制关闭,如果站长的空间不支持,可以采用以下几种办法进行修改,供广大站长参考: *如果是独立服务器的用户可以修改php配置文件中的php.ini,将register_globals=On改为register_globals=Off,然后重启Apache. *如果是虚拟主机的用户,

  • PHP中register_globals参数为OFF和ON的区别(register_globals 使用详解)

    register_globals的值可以设置为:On或者Off,我们举一段代码来分别描述它们的不同. 代码: 复制代码 代码如下: <form name="frmTest" id="frmTest" action="URL"> <input type="text" name="user_name" id="user_name"> <input type=&q

  • 分享下PHP register_globals 值为on与off的理解

    register_globals的值可以设置为:On或者Off,我们举一段代码来分别描述它们的不同. 代码: 复制代码 代码如下: <form name="frmTest" id="frmTest" action="URL"><input type="text" name="user_name" id="user_name"><input type=&quo

  • Linux安装配置php环境的方法

    本文实例讲述了Linux安装配置php环境的方法.分享给大家供大家参考,具体如下: 1.获取安装文件: http://www.php.net/downloads.php php-5.3.8.tar.gz 获取安装php需要的支持文件:http://download.csdn.net/download/netlong339/1351852 libxml2-2.6.32.tar.gz 2.安装libxml2 复制代码 代码如下: tar zxvf libxml2-2.6.32.tar.gz cd l

  • 手把手编写PHP框架 深入了解MVC运行流程

    1 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller). PHP中MVC模式也称Web MVC,从上世纪70年代进化而来.MVC的目的是实现一种动态的程序设计,便于后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能.除 此之外,此模式通过对复杂度的简化,使程序结构更加直观.软件系统通过对自身基本部份分离的同时,也赋予了各个基本部分应有的

  • IIS php环境配置PHP5 MySQL5 ZendOptimizer phpmyadmin安装与配置

    本例是在wiondws XP下 IIS5.1 php5.2.1(zip) MySQL5.0.37 phpmyadmin2.10.0.2 ZendOptimizer-3.2.6 的安装与配置 IIS 的安装 1 在光驱中放入WindowsXP SP2系统安装光盘 2 依次在 控制面板 > 添加与删除 > 添加/删除Windows组件 > Windows组件向导 中选中 Internet信息服务(IIS) 3 点击 下一步 进行文件复制,直到完成安装 4 完成 IIS 安装 5 打开浏览器,

  • iis PHP安装脚本 PHPInstall.vbs V3.1

    复制代码 代码如下: '/*========================================================================= ' * Intro PHP安装脚本,您所要做的操作是:保存这个文件与要安装的php文件夹放一起(不要放在C盘根目录下) ' * (当前版本php-5.2.5-Win32如果是其它请替换当前文档相关文件名),然后双击运行这个文件,<?phpinfo()?> ' * FileName PHPInstall.vbs ' * A

  • Win2008 R2 IIS7.5+PHP5(FastCGI)+MySQL5环境搭建教程

    准备篇 一.环境说明: 操作系统:Windows Server 2008 R2 PHP版本:php 5.4.4 MySQL版本:MySQL5.5.25 二.相关软件下载: 1.PHP下载地址: http://windows.php.net/downloads/releases/php-5.4.4-nts-Win32-VC9-x86.zip 2.MySQL下载地址: http://gd.tuwien.ac.at/db/mysql/Downloads/MySQLInstaller/mysql-ins

  • Windows Server 2003下配置IIS6.0+php5+MySql5+PHPMyAdmin环境的图文教程

    配置环境: 操作系统:Windows Server 2003 sp2企业版 Web服务器:系统自带的IIS6.0 所需工具: PHP:php-5.2.12-Win32.zip(官方网址:http://www.php.net) 数据库:mysql-5.0.22-win32.zip(官方网址:http://www.mysql.com) 数据库管理:phpMyAdmin-3.2.5-all-languages.zip(官方网址:http://www.phpmyadmin.net) 配置过程: 首先我们

随机推荐