在我的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,...
明确的目的地白名单可能是最安全的解决方案,但是很乏味,甚至可能不适用于所有用例。
解决方案?
修改:
对于简单文件,urlencoding是否足够/正确? 假设最近的PHP版本(> 5.1.2,AFAIK)禁止在header()中使用换行符。
如何在不事先了解其他域的情况下安全地处理跨域凭据检查?
答案 0 :(得分:1)
简单:不要那样做。
如果您必须重定向用户,请不要让他们告诉您他们的目的地。
如果您绝对必须这样做,请对输入进行urlencode,将域列入白名单,并剥去尚未列入白名单的参数。更好的是,不要让他们告诉你什么域 - 使用其他后端切换产生。
如果你没有严重锁定它,你将容易受到各种各样的事情的影响。要特别小心,他们不能在那里放置线路。
更多信息:
答案 1 :(得分:1)
实际上发生了三种攻击:
有关Open Redirect及其问题的更多信息,请参阅sirdarckcat和thornmaker的presentation at OWASP AppSec 2010