使用$_REQUEST 要留意的地方

时间:2011-3-7     作者:smarteng     分类: PHP相关


做大当当联盟的时候,用到了我们的框架,可是这个框架过滤的很严格,传中文会有问题,不能用框架的方法来传中文,框架默认会吧GET POST COOKIE 这些变量给安全处理一下,我只能用REQUEST ,程序这边用 $_REQUEST['username'] 获得。在浏览器测试了一下,发现得到的并非是用户参数传过来的username。测试发现时cookie存在键为username的值,才醒起是cookie中的username覆盖了post中的username。

$_REQUEST 包含 GET/POST/Cookie 。在键值相同时默认是 POST覆盖GET,COOKIE覆盖POST或GET。

这个默认的顺序也可以改,在 php .ini 中查找variables_order,会看到类似

variables_order = "EGPCS"

这就是php注册变量的顺序,E代表$_ENV,G代表$_GET,P代表$_POST,C代表$_COOKIE,S代表$_SERVER。在register_globals为on时,新的值会覆盖之前的值。例如在register_globals为on时,可以直接用$key代替$_GET['key']。同样这个顺序的gpc也作用在$_REQUEST中。

如果你禁止了 register_globals,但又想用到一些全局变量,可以用 extract() 函数。在没有权限修改 variables_order 的顺序时,想用到全局变量又想设置一下覆盖的顺序时可以用

import_request_variables('gpc') ;

实现。同样,键值相同时会按函数参数的顺序覆盖而不受php.ini的variables_order顺序制约。