我正在修改Opencart,其中包含PHP页面代表的几个模块。 但我的问题适用于涉及以下的任何案例。因此,无需将此问题作为一个开放式特定问题。
我希望改变一个模块/ PHP页面在完成它的工作后重定向的方式。
我所做的是修改相关模块以处理会话变量以修改要重定向到的URL。
自定义页面
if ( !$this->customer->isLogged() ) {
$this->session->data['redirect'] = $this->url->link('account/blah');
$this->redirect($this->url->link('account/register', '', 'SSL'));
}
已修改重定向的网页
if (isset($this->session->data['redirect'])) {
$this->redirect($this->session->data['redirect']);
}
它有效,但我觉得它不安全。可以做些什么来改善它?
P.S:以下是在opencart中实际处理重定向的方法。
protected function redirect($url, $status = 302) {
header('Status: ' . $status);
header('Location: ' . str_replace(array('&', "\n", "\r"), array('&', '', ''), $url));
exit();
}
答案 0 :(得分:1)
不安全?为什么? 用户是否可以修改$ this-> session->数据的内容?如果没有,我会认为它是“安全的”,因为没有可能的注射......据说,我不知道OpenCart的内部。
如果您想进行非特定于开放购物车的重定向,则需要使用PHP的header()功能或http_redirect()。
答案 1 :(得分:1)
通常,您可以通过以下方式在加载时自动重定向:
header("Location: http://www.example.org/bar");
<META HTTP-EQUIV=REFRESH CONTENT="1; URL=http://www.example.org/bar" />
window.location.href = 'http://www.example.org/bar';
但也有其他一些方法,比如使用一些小程序,如Flash或Java。但不要依赖于这些,因为大多数浏览器都有弹出阻止机制,可能会阻止此类重定向。
除了重定向的顺序来自服务器以及客户端应遵循该顺序之外,没有太多关于安全性的说法。但客户总是可能不会听......
作为开发人员,您需要做的就是不再提供重定向所需的数据。例如,在PHP中,在使用header("Location: http://www.example.org/bar");
之后,请务必执行exit();
,以便PHP的其余部分也不会被解析为HTML并发送到客户端。