为什么我必须调用'exit'后,通过头文件('Location ..')在PHP中重定向?

sf6xfgos  于 2022-12-28  发布在  PHP
关注(0)|答案(6)|浏览(106)

你知道如果你想在PHP中重定向一个用户,你可以使用header函数:

header('Location: http://smowhere.com');

众所周知,在header调用之后加上一个exit;是一个很好的做法,可以防止其他php代码的执行。头位置调用后的代码是否可以有效执行?在哪些情况下?恶意用户是否可以完全忽略header('Location..')调用?如何执行?

kmb7vmvb

kmb7vmvb1#

头位置调用之后的代码是否可以有效执行?
是的,总是这样。header只是一行数据,* 要求 * 浏览器重定向。页面的其余部分 * 仍然由PHP提供 *,客户端只需阻止header命令执行即可查看。
对于像wget这样的命令行客户机来说,这很容易做到,例如,只需告诉它不要跟随重定向即可。
底线:如果你不阻止它,PHP甚至会在header调用后发送整个正文,接收者不需要任何特殊的黑客技巧就可以完全使用这个正文。

lsmepo6l

lsmepo6l2#

如果您重定向但没有die()/exit(),则始终执行并显示代码
请看下面的例子:
admin.php:

if (authenticationFails)
{
    // redirect and don't die
}

// show admin stuff

如果您不确保在位置标题后结束执行,每个用户都将获得访问权限。

mxg2im7a

mxg2im7a3#

header()指示PHP应该发送一个HTTP头...当HTTP头被发送时。
当您编写对header()的调用时,这些消息不会立即发送,而是在需要发送它们时 (通常,当PHP需要开始发送响应主体时--当启用output_buffering时,这可能比您想象的要晚) 发送。
因此,如果您只调用header(),则绝对不能保证在此语句之后编写的代码不被执行--除非您使用exit/die指明它不能被执行。
如果用户愿意,他可以忽略Location报头;但是它不会改变header()调用之后的代码可能执行也可能不执行的事实:这是服务器端的问题。

rks48beu

rks48beu4#

header()后面的PHP代码将被运行。有时候,这是必需的,如www.example.com上的examplephp.net所示。为了确保不是这样,您需要完全结束程序流。

3lxsmp7m

3lxsmp7m5#

如果没有退出调用,脚本终止的确切时间点将取决于两个因素:
1.客户端浏览器对重定向的React速度
1.执行脚本的其余部分所需的时间。
假设浏览器一看到Location头就立即启动重定向操作,这意味着它会关闭重定向的连接。这样它就可以开始连接到新的位置。这通常意味着Web服务器将终止重定向脚本。无论标头从服务器-〉客户端和TCP链接关闭过程从客户端-〉server是脚本可以保持运行的时间量。

6tqwzwtp

6tqwzwtp6#

  • re:header-location调用后的代码能有效执行吗 *

是的,如果你不关闭脚本。

  • re:在哪些情况下?*

在所有情况下。

  • 恶意用户是否能够完全忽略标头('Location..')调用?*

不,它会被要求用户在这件事上没有发言权。

相关问题