8

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

$_REQUEST['start_date']=$date;

是否允许或以任何方式将某些东西分配给超级全局 $_REQUEST 变量?如果有 $_COOKIE['start_date'] 这会改变 cookie 的值吗?

4

3 回答 3

8

是的,它是允许的,并且出于多种原因可能会有所帮助。

  • 调试——如果出于某种原因您想“强制”某个请求参数,您可以在 、 或 数组中设置$_REQUEST一个$_GET$_POST。这将覆盖请求页面发送的任何值,这可能是需要的。
  • 因为你要对整个数组做一些事情——例如,如果你想要json_encode所有的$_REQUEST键值对以及$_REQUEST一些额外的值,以这种方式“添加”值可能会更快,然后传递$_REQUESTjson_encode()

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

作者注:以下示例已作为建议和批准的编辑添加到我的原始答案中。虽然它可能有效,但还有更好的方法可以保护您的站点免受注入攻击(例如准备好的语句)。恕我直言,谨慎的程序员在依赖下面的代码之前应该认真考虑这些方法。

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

function injectionwall($dbinterface)
{
    foreach($_REQUEST as $key => $data)
    {
        $_REQUEST[$key]=$dbinterface->real_escape_string($data);
    }
}

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

于 2012-06-19T08:27:45.750 回答
3

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

为什么允许它(可能是你问题的重点):

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

但是 - 为什么最好避免:

  • 了解您的变量是什么以及它们来自哪里通常是一种很好的做法。假设您有一个函数可以通过操纵 $_REQUEST 来“确保”所有输入的安全。当您开始使用 $_REQUEST 时,您永远无法确定您的“确保安全”功能是否已运行。如果进行单元测试,这将变得特别成问题。如果您将 $_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、get 还是 post,那么它适用于 $_REQUEST。

免责声明:是的,我使用 $_REQUEST,是的,我已对其进行了修改以解决某些情况。只是说不要,如果你想成为一个更好的程序员。

于 2012-06-19T10:16:18.550 回答
0

是否允许或以任何方式将某些东西分配给超级全局 $_REQUEST 变量?

是的,这是允许的,但没有用。

如果有 $_COOKIE['start_date'] 这会改变 cookie 的值吗?

不,使用 setcookie http://php.net/manual/en/function.setcookie.php

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

于 2012-06-19T08:19:21.213 回答