通过会话定制的重定向:不安全,可以改进


Customizable redirection via session: unsecure and can be improved?

我正在修改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()。