Home > php教程 > php手册 > PHP $_REQUEST数组安全隐患

PHP $_REQUEST数组安全隐患

WBOY
Release: 2016-06-13 10:12:16
Original
952 people have browsed it

大家都知道使用$_REQUEST可以直接省去了判断post,get一些代码,使用起来更简单,但是如果要详细的去想我们会觉得$_REQUEST太可怕了。下面看分析。

我们都知道,处理表单数据,可以使用PHP的$_GET和$_POST这两个超全局变量,具体是哪个由form表单提交时的method指定。除此之外PHP还为我们提供了$_REQUEST数组。但是其不仅包含$_GET和$_POST的所有数据元素,同时其还会包含$_COOKIE这个超全局数组的所有数据元素。
可是大家有没有想过,如果这三个数组里面的key相同,那么我用$_REQUEST得到的到底是哪个数组的值呢?会不会有什么问题?
我用如下代码为大家做演示,因为只是想说明问题,所以这里面不对$_COOKIE进行设置,请大家自行处理:

 代码如下 复制代码
       var_dump($_GET['a'],$_POST['a'],$_REQUEST['a']);
?>

demo

       

               
               
       


当我提交表单的时候,我获取的页面内容为:

string(3) "xxx" string(3) "yyy" string(3) "yyy"

同样的内容,在$_REQUEST里面,POST的值覆盖了GET的值,这到底是怎么回事呢?
其实这是在PHP的配置文件里面设置的,让我们来看一下php.ini这个配置文件,在第466行左右有如下内容:

 代码如下 复制代码

; This directive describes the order in which PHP registers GET, POST, Cookie,
; Environment and Built-in variables (G, P, C, E & S respectively, often
; referred to as EGPCS or GPC).  Registration is done from left to right, newer
; values override older values.
variables_order = "EGPCS"

这个EGPCS就是说明用$_REQUEST数组获取内容的优先级,其字母的含义分别代表为:E代表$_ENV,G代表$_GET,P代表$_POST,C代表$_COOKIE,S代表$_SESSION。后面出现的数据会覆盖前面写入的数据,其默认的数据写入方式就是EGPCS,所以POST包含的数据将覆盖GET中使用相同关键字的数据。


$_REQUEST[]具用$_POST[] $_GET[]的功能,但是$_REQUEST[]比较慢。通过post和get方法提交的所有数据都可以通过$_REQUEST数组获得

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Recommendations
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template