Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如果将值分配给$\u请求,会发生什么情况?_Php_Superglobals - Fatal编程技术网

Php 如果将值分配给$\u请求,会发生什么情况?

Php 如果将值分配给$\u请求,会发生什么情况?,php,superglobals,Php,Superglobals,我最近在一个PHP脚本中遇到了这一行: $_REQUEST['start_date']=$date; 为超级全局$\u请求变量赋值是允许的还是有用的? 如果存在$\u COOKIE['start\u date'],这会改变COOKIE值吗 是否允许或以任何方式将某些内容分配给超级用户 全局$\u请求变量 是的,这是允许的,但没有用 如果存在$\u COOKIE['start\u date'],这会改变COOKIE值吗 不,使用setcookie 所有这些超级全局变量都只是简单的全局数组。是的,

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

$_REQUEST['start_date']=$date;
为超级全局$\u请求变量赋值是允许的还是有用的? 如果存在$\u COOKIE['start\u date'],这会改变COOKIE值吗

是否允许或以任何方式将某些内容分配给超级用户 全局$\u请求变量

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

如果存在$\u COOKIE['start\u date'],这会改变COOKIE值吗

不,使用setcookie


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

是的,这是允许的,并且可能有很多原因

  • 调试——如果出于某种原因您想“强制”某个请求参数,您可以在
    $\u请求
    $\u获取
    $\u发布
    数组中设置一个值。这将覆盖请求页面发送的任何值,这可能是需要的
  • 因为您要对整个数组执行一些操作——例如,如果您想对所有的
    $\u请求
    键值对以及一些附加值进行编码,那么以这种方式向
    $\u请求
    添加值可能会更快,然后将
    $\u请求传递给
    json\u encode()
关于您关于
$\u COOKIE
的问题,不,您不能以这种方式更改COOKIE的值,只能访问它

作者注释:以下示例作为建议和批准的编辑添加到我的原始答案中。虽然它可能有效,但有更好的方法保护您的站点免受注入攻击(例如)。IMHO,一个审慎的程序员应该在依赖下面的代码之前强烈地考虑这些方法。

考虑一下如何防止网站上的SQL注入攻击。这个简单的代码将停止所有
$\u请求变量(mysqli示例):


所有<代码> $i请求< /代码>变量现在可以安全使用:(

< p>)我认为一个更合适的回答是“是的,允许,但考虑它是不好的实践,这样就避免了更好的编程质量”。 为什么允许这样做(可能也是你问题的重点):

  • 超全局变量是在程序执行开始时设置的,然后不会以其他方式更改(除非您这样做)。因此,您的更改是永久性的,并且在任何其他功能中都很容易看到。因此,请继续,根据需要进行编辑
但是-为什么最好避免:

  • 通常,了解变量是什么以及它们来自何处是一种很好的做法。假设您有一个函数,它通过操纵$u请求“确保”所有输入的安全。当您开始使用$\u请求时,您永远无法确定“确保安全”功能是否已运行。如果进行单元测试,这将变得特别有问题。如果将$_请求重新分配给另一个变量,则可以更轻松地跟踪该变量的范围。即使你把另一个变量设为“全局变量”,你也知道它的存在是安全的。(缺点是,你可能会浪费内存/编程能力来开发一些非常繁重的应用程序,但如果你问这个问题,你离这还有很长的路要走。)

  • 如果修改$\u请求,则不会编辑$\u POST、$\u GET或$\u COOKIE;如果您想在将来某个时间将代码更改为$\u POST,这可能会导致混淆(例如,您认为已“确保安全”的数据将不可用)

最后,关于一般使用$\u请求的两个简要说明:

  • $\请求是$\ COOKIE、$\ POST和$\ GET(以及旧版本中的$\文件)的组合。但是,除非您阅读php.ini文件-,否则您不知道哪个文件优先。所以不要依赖于$u POST优先于$u GET

  • 如果可以的话,使用$\u POST、$\u GET或$\u COOKIE的另一个原因是:-它使未来的开发人员更容易调试您的代码,因为他们知道您希望变量来自何处。但是,如果您真的不在乎值是来自cookie、get还是post,那么有时它适合于$u请求


免责声明:是的,我使用$\u请求,是的,我修改了它以避开某些情况。如果你想成为一名更好的程序员,就说不要

是的,作业是完全有效的,虽然我不知道它的用途为什么不试试看会发生什么?这就是你学习编码的方式,你可以做到的。不知道你为什么会这样?顺便说一句,你可以试着执行代码;PIt可用于“强制”某个值,以便以后在脚本中使用。它在调试脚本时很有用,但似乎不是很好的实践,即使只是因为它令人困惑。@vascowhite许多语言,包括PHP(例如ftell函数),在有人尝试一些奇怪的东西时,都有未定义的结果。我可以在我的机器上运行监控所有可能变量的测试代码,但不能在所有操作系统上运行,也不能在白天的任何时候运行。和你一样,我也无法理解为什么有些程序员不愿意进行实验:-)我完全不同意“它没有用处”的说法@jedwards他必须小心使用这个超级全局变量,因为他可能会在不知情的情况下重写原始数据。如果你使用这个,你必须知道它是如何工作的。我想,除了@jedwards的注释之外,他没有这样做,难道你不能使用这个变量在控制器级别存储一些东西,并在视图级别检索它吗(假设你给参数名一个非常“唯一”的名称,这样它就不会与一些东西发生冲突)?这似乎是一个很好的例子,说明了它是如何有用的,我错了吗?RE:“作者的注释”-你添加这个警告是非常正确的。事实上,我支持删除这个例子,因为这在很多方面都是非常糟糕的做法。必须有一个更安全的例子(尽管我正在努力想出一个有用的例子)。
function injectionwall($dbinterface)
{
    foreach($_REQUEST as $key => $data)
    {
        $_REQUEST[$key]=$dbinterface->real_escape_string($data);
    }
}