我最近在一个 PHP 脚本中看到了这行代码:
$_REQUEST['start_date']=$date;
在任何情况下,将内容分配给超级全局变量 $ _REQUEST 是否被允许或有用的? 如果存在 $_COOKIE ['start_date'] ,是否会更改cookie值?
我最近在一个 PHP 脚本中看到了这行代码:
$_REQUEST['start_date']=$date;
在任何情况下,将内容分配给超级全局变量 $ _REQUEST 是否被允许或有用的? 如果存在 $_COOKIE ['start_date'] ,是否会更改cookie值?
是的,这是被允许的,并且可能有很多好处。
$_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
变量现在可以安全地使用 :)
通常最好的做法是知道你的变量来自哪里。假设你有一个函数,通过操作 $_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,并且是的,我已经修改了它以解决某些情况。只是说,如果您想成为更好的程序员,请不要使用它。