PHP安全之register_globals的on和off的区别_php技巧

来源:脚本之家  责任编辑:小易  

其实从安全2113角度讲,关闭 register_globals 是个好做法。5261推荐这样做。但是你的代4102码有问题,试试下面改好的<?php error_reporting(E_ERROR | E_NOTICE);session_start();#session_destroy();?><html><head>1653<title>verify code test</title></head><body><form action="#" method="post"><table><tr><td><input type="text" name="validate" value="input here" size="10"></td></tr><tr><td align= "absmiddle"><img src="checkNum_session.php"/><br /></td></tr><tr><td align= "absmiddle"><input type="submit"></td></tr></table><br /></form></body></html><?phpecho "the last session is:";echo $_SESSION["code"];echo "<br />";$validate="";if(isset($_POST["validate"])){$validate=$_POST["validate"];echo "ur input is: ".$validate;echo "<br />";echo "it is ";if($validate !=$_SESSION["code"])echo "<font color=red>wrong</font>";elseecho "right";}else{echo "wtf";}PrintArr($_SESSION);function PrintArr($aArray){echo '<xmp>';print_r($aArray);echo '</xmp>';}?>追问您能不能给我讲讲error_reporting(E_ERROR | E_NOTICE);#session_destroy();这三行都是什么意思,php 都是自己看书学的,挺乱的,谢谢了~~追答error_reporting(E_ERROR | E_NOTICE);这是设置错误报告#session_destroy();注释掉这行代码,你既然 start() 了,为何马上就销毁 Session 呢这只是对你的表单进行了一下修改而已如果初学PHP,下载一个中文的PHP手册比较好,写得比较详细,官方文档:http://www.php.net/manual/zh/或者下载CHM,选择 Chinese (Simplified) -> CHM 即可http://www.php.net/download-docs.php,首先2113要搞明白register_globals 这个配5261置是做什4102么用的建议参1653考http://www.phpv.net/html/69.html追问谢谢,这个网站挺好的,解决了?追问解决了www.zgxue.com防采集请勿采集本网。

一、register_globals=Off和register_globals=On的区别

这表示你的这段程序,可能参考了非常旧的php版本代码(4.2以内)。这是非常不安全的。注意一下全局变量现在用$_POST,$_GET等就行了。看看手册关于这部分的特别说明。当register_globals=Off的时候,接收的

register_globals是php.ini里的一个配置,这个配置影响到php如何接收传递过来的参数.

找到include文件夹下面的common.inc.php文件。第一要删除的是:10行开始到20行之间的 开启register_globals会有诸多不安全可能性,因此强制要求关闭register_globals if(ini_get('register_

register_globals的值可以设置为:On或者Off,我们举一段代码来分别描述它们的不同。

5.自动把表单里的数据作为全局变量,一般都OFF,安全一点,要不别人可以在你url加参数就提交了。在off的时候,表单method=post的时候,获取表单里数据的方法就是$_POST[\"xxx\"],xxx是表单里那些input什么

<form action='' method='get'><input type='text' name='username' value='alex' ><input type='submit' name='sub' value='sub'></form><?phpecho 'username::',$username;echo '<br>sub::',$sub;echo '<br>GET::';print_r($_GET);?>

php中的双冒号表示的是调用静态变量或方法. 从你给的这代码上看,应该是调用静态方法,方法名是conv,具体是什么作用这个我就不清楚了,需要看过方法的代码才能判断

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

1.PHP 4.2.0 版开始配置文件中 register_globals 的默认值从 on 改为 off 了,虽然你可以设置它为On,但是当你无法控制服务器的时候,你的代码的兼容性就成为一个大问题,所以,你最好从现在就开始用Off的

    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内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网!

克服php的register:1、如果是独立服务器的用户可以修改php配置文件中的php.ini,将register_globals=On改为register_globals=Off同时把session.auto_start=1改成session.auto_start=0,然后重启Apache.2、如果是虚拟主机的用户,尽可能的通知空间商让其对配置进行修改,或者可以尝试ini_set(' ',' ')3、自己在网站目录下新建一个.htaccess文件,加上php_flag register_globals off 就行了,如果已有.htaccess文件,直接再最后另起一行添加即可;4、如果实在不行,那只有采用最后的办法直接去include/common.inc.php中将以下代码删除即可.禁止 session.auto_startif(ini_get('session.auto_start')!0){exit('php.ini session.auto_start must is 0 !');}内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • 分享下php register_globals 值为on与off的理解
  • php中register_globals参数为off和on的区别(register_globals 使用详解)
  • thinkphp结合ajaxfileupload实现异步图片传输示例
  • php下用cookie统计用户访问网页次数的代码
  • php 的arrayaccess接口 像数组一样来访问你的php对象
  • php foreach、while性能比较
  • php的4种常见运行方式
  • php中邮箱地址正则表达式实现与详解
  • 解析php处理换行符的问题 \r\n
  • php stripos()函数及注意事项的分析
  • 火车头discuz6.1 完美采集的php接口文件
  • php延迟静态绑定的深入讲解
  • 如何克服php的register
  • php 如果把register
  • php难题(register=Off)
  • php.ini中的register
  • PHP中 写个简单程序 在register
  • 为什么安装织梦会出现php.ini register
  • register
  • PHP中Register::conv($str);是什么意思
  • php globals 安全吗
  • Discuz!的register.php中加入一条seclect语句
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全php基础php技巧php实例php文摘php模板首页php编程分享下php register_globals 值为on与off的理解php中register_globals参数为off和on的区别(register_globals 使用详解)thinkphp结合ajaxfileupload实现异步图片传输示例php下用cookie统计用户访问网页次数的代码php 的arrayaccess接口 像数组一样来访问你的php对象php foreach、while性能比较php的4种常见运行方式php中邮箱地址正则表达式实现与详解解析php处理换行符的问题 \r\nphp stripos()函数及注意事项的分析火车头discuz6.1 完美采集的php接口文件php延迟静态绑定的深入讲解php中json_decode()和json_encodphp 数组和字符串互相转换实现方php中使用curl实现get和post请求php中iconv函数使用方法php日期转时间戳,指定日期转换成php 页面跳转到另一个页面的多种php中文处理 中文字符串截取(mb_php下intval()和(int)转换使用与利用phpexcel实现excel数据的导入phpmyadmin 配置文件详解(配置)thinkphp项目部署到linux服务器上报错“模php实现表单提交时去除斜杠的方法php mssql 分页sql语句优化 持续影响php microtime获取浮点的时间戳php基于面向对象封装的分页类示例php同时连接多个mysql数据库示例代码使用php语句将数据库*.sql文件导入数据库php实现十进制、二进制、八进制和十六进制php禁止某ip或ip地址段访问的方法php中如何实现常用邮箱的基本判断
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved