zoukankan      html  css  js  c++  java
  • PHP变量解析顺序variables_order

    转载自:http://blog.csdn.net/knight0450/article/details/4291556

    故事从一个有点诡异的BUG开始,后台一个使用频率不是很高的广告提交功能有时候会莫名其妙的发生提交的链接网址出错的问题。
    由于提交后并没有告知该次提交的链接URL,所以这个BUG一直活到了今天。
    然而并不是每一次提交都会出现这个BUG,几次测试后发现只有在连续多次提交时发生。
    由于提交的表单比较复杂,分几部分录入,于是怀疑在中间环节发生错误。
    排错的过程先是在各个过程中var_dump($_REQUEST),于是连续第二次提交时找到出错环节,在第一个表单提交到第二个表单的过程中,
    $_REQUEST数组发生改变。到这里,我们有必要再看一下$_REQUEST数组:
    手册上讲包含经由 GET,POST 和 COOKIE 机制提交至脚本的变量,因此该数组并不值得信任。
    以此将var_dump($_REQUEST)分解成var_dump($_POST),var_dump($_GET),var_dump($_COOKIE),问题就比较清晰了,
    原来为了便于在多个页面表单间保存值,试用了COOKIE,虽然没有设置expire项的情况下SESSION结束时COOKIE变销毁,
    但是如果在一次会话中连续提交多个广告,表单POST的值变会被之前保存在COOKIE的值覆盖,而之所以只有部分出错,
    在于保存到COOKIE的时候COOKIE变量名都加了前缀,除了url这个变量还是使用相同的变量名。
    问题找到了,但是又有新的疑问,相同的变量名,为什么是COOKIE覆盖了POST而不是相反呢?
    于是终于要来到标题讲的variables_order设置项了,PHP.ini中原文如下:

    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.

    意思是该设置描述PHP解析变量顺序,包括$_GET,$_POST,$_COOKIE,$_ENV ,$_SERVER 数组,
    解析顺序从左到右,后解析新值覆盖旧值。默认设定为EGPCS(Environment,GET,POST,Cookie,Server)。
    如果将其设为“GP”,会导致 PHP 完全忽略环境变量,cookies 和 server 变量,并用 POST 方法的变量覆盖 GET 方法的同名变量。

    结论:就像手册上讲的,$_REQUEST是个并不值得信任的数组。为了尽量避免类似问题,在获取提交值是应明确使用$_POST或$_GET数组。
    特殊情况下可以通过调整variables_order设置,使自己总是能得到想要获取的提交数据。

  • 相关阅读:
    android逆向奇技淫巧五:x音fiddler抓包分析协议字段
    windows:3环自行加载PE文件实现进程隐藏
    android逆向奇技淫巧四:模拟器检测和反检测
    android逆向奇技淫巧三:MT管理器替代android killer修改和重新编译smail代码/frida hook 更改so层代码
    windows运算符和数据类型重载反CE查询搜索
    android逆向奇技淫巧二:uiautomatorviewer&method profiling定位x音java层的关键代码和方法
    android逆向奇技淫巧一:去掉开屏广告
    xx课堂m3u8加密视频下载
    Python接口自动化之logging日志
    Python接口自动化之pymysql数据库操作
  • 原文地址:https://www.cnblogs.com/hfultrastrong/p/6797485.html
Copyright © 2011-2022 走看看