我正在修改openart,其中包含由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:以下是openart中重定向的实际处理方式。
protected function redirect($url, $status = 302) {
header('Status: ' . $status);
header('Location: ' . str_replace(array('&', "'n", "'r"), array('&', '', ''), $url));
exit();
}
通常,您可以通过以下方式在加载时实现自动重定向:
- HTTP头从服务器端脚本,如PHP
header("Location: http://www.example.org/bar");
- HTTP元刷新
<META HTTP-EQUIV=REFRESH CONTENT="1; URL=http://www.example.org/bar" />
- Javascript
window.location.href = 'http://www.example.org/bar';
但也有一些其他的方法,如使用一些小程序,如Flash或Java。但不要依赖这些,因为大多数浏览器都有弹出窗口阻止机制,可能会阻止这种重定向。
关于安全性没有太多可说的,除了重定向命令来自服务器并且客户端应该遵循该命令。但是客户端总是不听…
作为开发人员,你所需要做的就是不要提供任何重定向所需的数据。因此,例如,在PHP中,使用header("Location: http://www.example.org/bar");
后,一定要也做exit();
,这样PHP的其余部分也不会被解析为HTML并发送到客户端。
不安全?为什么?用户可以修改$this->session->data的内容吗?如果没有,我会认为它是"安全的",从某种意义上说,没有注射的可能……话虽如此,我不知道OpenCart的内部。
如果你想做一个不是特定于open cart的重定向,你需要使用PHP的header()函数,或者http_redirect()。