我最近在PHP脚本中遇到了这一行:
$_REQUEST['start_date']=$date;
是否允许或以任何方式为超级全局$ _REQUEST变量赋值? 如果有$ _COOKIE ['start_date']会改变cookie值吗?
答案 0 :(得分:7)
是的,由于多种原因,它可能会有所帮助。
$_REQUEST
,$_GET
或{中设置值{1}}数组。这将覆盖请求页面发送的任何值,这可能是期望的。$_POST
所有json_encode
键值对<强> 以及 作为一些额外的值,以这种方式向$_REQUEST
“添加”值可能会更快,然后将$_REQUEST
传递给{{ 1}}。关于$_REQUEST
的问题,不能以这种方式更改cookie的值,只能访问它。
作者注意: 以下示例已添加为原始答案的建议和批准修改。虽然它可能有效,但有更好的方法可以保护您的网站免受注入攻击(例如prepared statements)。恕我直言,谨慎的程序员应该在依赖下面的代码之前强烈考虑这些方法。
考虑在您的网站上防止SQL注入攻击。这个简单的代码将为所有json_encode()
变量(mysqli示例)停止它们:
$_COOKIE
现在可以安全使用所有$_REQUEST
变量:)
答案 1 :(得分:3)
我认为更合适的回答是“是的,这是允许的,但认为这是不好的做法,所以要避免更好的编程质量”。
为什么允许(也可能是你的问题):
但是 - 为什么最好避免:
通常很好的做法是了解您的变量是什么以及它们来自何处。假设你有一个函数可以通过操作$ _REQUEST来“安全”所有输入。当你使用$ _REQUEST时,你永远无法确定你的“make safe”功能是否已经运行。如果进行单元测试,这尤其成问题。如果将$ _REQUEST重新分配给另一个变量,则可以更轻松地跟踪该变量的范围。即使您将其他变量设为“全局”,您也知道它存在是安全的。 (在下面,你可能会浪费内存/编程能力来处理一些非常繁重的应用程序,但如果你提出这个问题,你还有很长的路要走。)
如果修改$ _REQUEST,则不要编辑$ _POST,$ _GET或$ _COOKIE;如果您希望将代码更改为$ _POST,将来可能会导致混淆(例如,您认为“已安全”的数据不会)。
最后,关于一般使用$ _REQUEST的两个快速说明:
$ _ REQUEST是$ _COOKIE,$ _POST和$ _GET(旧版本中的$ _FILES)的组合。但除非您阅读php.ini文件 - http://www.php.net/manual/en/ini.core.php#ini.variables-order,否则您不知道哪个优先。所以不要依赖$ _POST优先于$ _GET!
如果可以的话,使用$ _POST,$ _GET或$ _COOKIE的另一个原因是: - 它使未来的开发人员更容易调试代码,因为他们知道您希望变量来自哪里。但是,如果你真的不在乎这个价值是来自一个cookie,获取还是发布,那么有时它适合$ _REQUEST。
免责声明:是的,我使用$ _REQUEST,是的,我已修改它以解决某些情况。如果你想成为一个更好的程序员,就说不要。
答案 2 :(得分:0)
是否允许或以任何方式为超级分配内容 全局$ _REQUEST变量?
是的,这是允许的,但没有用。
如果有$ _COOKIE ['start_date']会改变cookie值吗?
不,请使用setcookie http://php.net/manual/en/function.setcookie.php
所有这些超级全局变量只是简单的全局数组。