为什么我必须在PHP中通过头('Location ..')重定向后调用'exit'?
你知道,如果你想在PHP中重定向一个用户,你可以使用头函数:
header('Location: http://smowhere.com');
众所周知,放置exit;
也是一个好的做法exit;
在header
调用之后,防止执行其他的php代码。 所以我的问题是:可以有效地执行标题位置调用后的代码? 在哪种情况下? 恶意用户是否可以完全忽略header('Location..')
调用? 怎么样?
标题位置调用之后的代码是否可以被有效地执行?
是的,总是。 header
只是要求浏览器重定向的一行数据。 页面的其余部分仍然由PHP提供,可以通过简单地阻止header
命令执行来由客户端查看。
比如说,像wget
这样的命令行客户端就足够简单了,只要告诉它不要遵循重定向。
底线:如果你不阻止它,即使在header
调用之后,PHP也会发出全身的信号。 该机构完全可用的接收方没有任何特殊的黑客技能。
如果你重定向,但你die()
/ exit()
代码总是执行和显示 。
以下面的例子:
admin.php的:
if (authenticationFails) { // redirect and don't die } // show admin stuff
如果您不确定在位置标题之后结束执行,则每个用户都将获得访问权限。
header()
指示PHP应该发送一个HTTP头…在发送HTTP头时。
而且,当你将这个调用写到header()时,这些不是立即发送的,而是当它们发送的时候(通常,当PHP需要开始发送响应的主体时 – 这可能比你想象的要晚,当output_buffering
是使用) 。
所以,如果你只是调用header()
,绝对保证在这个语句之后编写的代码不会被执行 – 除非你指出它不能,通过使用exit
/ die
。
用户可以忽略Location
标题,如果他想要的话; 但是它不会改变任何事情,因为header()
调用之后的代码可能会或可能不会被执行:这个问题是服务器端的。
PHP代码在一个header()之后将会运行。 有时候,这是必需的,就像php.net上的例子所示。 为了确保它不是,您完全结束程序流程。
re:header-location调用后的代码能否被有效地执行?
是的,如果你不关闭脚本。
re:在哪种情况下?
在任何情况下。
恶意用户能否完全忽略标题('Location ..')的呼叫?
不,这将使得用户在这件事上没有发言权。
如果没有退出调用,脚本将终止的确切点/时间将归结为两个因素:
- 客户端浏览器响应重定向的速度有多快
- 剩下的脚本要执行多少时间。
假设浏览器立即在看到“位置”标题的时刻开始重定向操作。 这意味着它将关闭重定向到的连接,所以它可以开始连接到新的位置。 这通常意味着Web服务器将终止重定向脚本。 然而,从服务器 – >客户端发送头文件需要很长时间,并且从客户端 – >服务器进行的TCP链接关闭过程是脚本可以继续运行的时间。