如果您将一个值赋给$_REQUEST,会发生什么?

8

我最近在一个 PHP 脚本中看到了这行代码:

$_REQUEST['start_date']=$date;

在任何情况下,将内容分配给超级全局变量 $ _REQUEST 是否被允许或有用的? 如果存在 $_COOKIE ['start_date'] ,是否会更改cookie值?


2
为什么不试一试,看看会发生什么?这就是你学习编程的方式。 - vascowhite
你确实可以这样做。不知道为什么要这样做?顺便说一下,你可以尝试执行代码;P - Bono
它可用于“强制”脚本中稍后使用的某个值。虽然在调试脚本时很有帮助,但似乎并不是一个很好的实践,即使只是因为它容易引起混淆。 - jedwards
这是另一个全局变量,虽然允许使用且可能很有用,但我不建议过度依赖全局变量,因为它会破坏应用程序的封装性。 - Aurimas Ličkus
3
许多编程语言,包括 PHP(例如 ftell 函数),在人们尝试一些奇怪的操作时会产生未定义的结果。我可以运行监控所有可能变量的测试代码在我的计算机上进行测试,但不能在所有操作系统和每天的任何时间运行。就像你一样,我也不理解为什么有些程序员不愿意尝试实验 :-) - Jannie Theunissen
显示剩余4条评论
3个回答

8

是的,这是被允许的,并且可能有很多好处。

  • 调试 -- 如果出于某种原因您想要“强制”一个特定的请求参数,您可以在 $_REQUEST, $_GET, 或者 $_POST 数组中设置一个值。这将覆盖任何由请求页面发送的值,这可能是期望的。
  • 因为你要对整个数组执行某些操作 -- 如果您希望例如将所有的 $_REQUEST 键值对以及一些其他值转换为json字符串,那么通过此方法向$_REQUEST添加值然后传递给 json_encode() 可能更快一些。

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

作者备注: 以下示例被添加为建议和已批准的编辑到我的原始回答中。虽然它可能有效,但有更好的方法来保护网站免受注入攻击(例如使用预处理语句)。在我看来,慎重的程序员在依赖下面的代码之前应该强烈考虑这些方法。

请考虑防止您的网站遭受SQL注入攻击。以下简单的代码可以用于 $_REQUEST 中的所有变量(mysqli示例):

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

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


2
回复:“作者的注释” - 你非常正确地添加了那个警告。实际上,我支持删除那个示例,因为它在很多方面都是非常糟糕的做法。一定要有一个更安全的示例(尽管我很难想到一个有用的)。 - Robbie

3
我认为更合适的回答是:“是的,它是允许的,但考虑到更好的编程质量,请避免使用。”。
为什么它是允许的(也可能是你问题的重点):
超全局变量在程序执行开始时设置,然后不会被改变(除非你这样做)。因此,您的更改是永久性的,并且在任何其他函数中都很容易看到。所以,随便编辑吧。
但是-为什么最好避免:
  • 通常最好的做法是知道你的变量来自哪里。假设你有一个函数,通过操作 $_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,并且是的,我已经修改了它以解决某些情况。只是说,如果您想成为更好的程序员,请不要使用它。


0
这个程序设计相关的问题是:“在任何情况下将某些东西分配给超级全局变量$_REQUEST变量是否被允许或有用?”
答案是:是被允许的,但不实用。
如果有一个 $_COOKIE['start_date'],这会改变cookie的值吗?
答案是:不会,应该使用setcookie http://php.net/manual/en/function.setcookie.php 所有这些超级全局变量只是简单的全局数组。

4
我完全不同意“它没有用”的说法。 - jedwards
@jedwards 他必须小心使用这个超级全局变量,因为他可能会在不知情的情况下重写主要数据。如果您使用它,您必须知道它是如何工作的。我认为他没有。 - Sergey
除了@jedwards的评论外,您不能使用该变量在控制器级别存储某些内容并在视图级别检索它(假设您给参数名称一个相当“独特”的名称,以便不会与其他内容冲突)?这似乎是如何有用的一个很好的例子,我错了吗? - reallynice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接