如何正确转义Location:header值?

时间:2010-10-24 06:23:23

标签: php http xss location

在我的webapp中,我使用HTTP Location:标头进行重定向(例如POST / redirect / GET)。但目标位置必须是动态的(例如login.php?dest=pagexy.php)。我们都知道任何用户可修改的输入都必须正确转义以防止XSS,所以

 header('Location: '.$_REQUEST['dest']);

看起来不对。简单urlencode - 只能用于简单文件,而不能用于路径(例如,使用单点登录的跨域网址)。

我还读过有关漏洞的信息:

Location: javascript:...bad.stuff...  or
Location: data:text/html:base64,...

明确的目的地白名单可能是最安全的解决方案,但是很乏味,甚至可能不适用于所有用例。

解决方案?

修改:

  1. 对于简单文件,urlencoding是否足够/正确? 假设最近的PHP版本(> 5.1.2,AFAIK)禁止在header()中使用换行符。

  2. 如何在不事先了解其他域的情况下安全地处理跨域凭据检查?

2 个答案:

答案 0 :(得分:1)

简单:不要那样做。

如果您必须重定向用户,请不要让他们告诉您他们的目的地。

如果您绝对必须这样做,请对输入进行urlencode,将域列入白名单,并剥去尚未列入白名单的参数。更好的是,不要让他们告诉你什么域 - 使用其他后端切换产生。

如果你没有严重锁定它,你将容易受到各种各样的事情的影响。要特别小心,他们不能在那里放置线路。

更多信息:

答案 1 :(得分:1)

实际上发生了三种攻击:

  1. HTTP Response Splitting,但正如上面提到的那样是一些注释,header()过滤了CRLF符号。
  2. 打开重定向,我认为在您的情况下无法减轻。
  3. XSS。 urlencode()是没用的,不要打扰它。你应该确保URL是http://(或https://),只要它可以重定向到javascript :(某些浏览器允许它,但不是全部)和数据:URIs。
  4. 有关Open Redirect及其问题的更多信息,请参阅sirdarckcat和thornmaker的presentation at OWASP AppSec 2010