如果您为$ _REQUEST分配值会怎样?

时间:2012-06-19 08:15:52

标签: php superglobals

我最近在PHP脚本中遇到了这一行:

$_REQUEST['start_date']=$date;

是否允许或以任何方式为超级全局$ _REQUEST变量赋值? 如果有$ _COOKIE ['start_date']会改变cookie值吗?

3 个答案:

答案 0 :(得分:7)

是的,由于多种原因,它可能会有所帮助。

  • 调试 - 如果由于某种原因您要“强制”某个请求参数,则可以在$_REQUEST$_GET或{中设置值{1}}数组。这将覆盖请求页面发送的任何值,这可能是期望的。
  • 因为您要对整个数组执行某些操作 - 例如,如果您想要$_POST所有json_encode键值对<强> 以及 作为一些额外的值,以这种方式向$_REQUEST“添加”值可能会更快,然后将$_REQUEST传递给{{ 1}}。

关于$_REQUEST的问题,不能以这种方式更改cookie的值,只能访问它。

作者注意: 以下示例已添加为原始答案的建议和批准修改。虽然它可能有效,但有更好的方法可以保护您的网站免受注入攻击(例如prepared statements)。恕我直言,谨慎的程序员应该在依赖下面的代码之前强烈考虑这些方法。

考虑在您的网站上防止SQL注入攻击。这个简单的代码将为所有json_encode()变量(mysqli示例)停止它们:

$_COOKIE

现在可以安全使用所有$_REQUEST变量:)

答案 1 :(得分:3)

我认为更合适的回答是“是的,这是允许的,但认为这是不好的做法,所以要避免更好的编程质量”。

为什么允许(也可能是你的问题):

  • SuperGlobals在程序执行开始时设置,然后不进行其他更改(除非你这样做)。因此,您的更改是永久性的,并且可以在任何其他功所以,继续,根据需要进行编辑。

但是 - 为什么最好避免:

  • 通常很好的做法是了解您的变量是什么以及它们来自何处。假设你有一个函数可以通过操作$ _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

所有这些超级全局变量只是简单的全局数组。