Php 如何正确转义位置:标题值?
在我的webapp中,我使用HTTPPhp 如何正确转义位置:标题值?,php,http,xss,location,Php,Http,Xss,Location,在我的webapp中,我使用HTTPLocation:头进行重定向(例如POST/redirect/GET)。但是目标位置必须是动态的(例如,login.php?dest=pagexy.php)。我们都知道,任何用户可修改的输入都必须正确转义以防止XSS,所以 header('Location: '.$_REQUEST['dest']); 看起来不对。简单urlencode-ing只能用于简单文件,不能用于路径(例如单点登录的跨域URL) 我还阅读了有关漏洞的信息,如: Location:
Location:
头进行重定向(例如POST/redirect/GET)。但是目标位置必须是动态的(例如,login.php?dest=pagexy.php
)。我们都知道,任何用户可修改的输入都必须正确转义以防止XSS,所以
header('Location: '.$_REQUEST['dest']);
看起来不对。简单urlencode
-ing只能用于简单文件,不能用于路径(例如单点登录的跨域URL)
我还阅读了有关漏洞的信息,如:
Location: javascript:...bad.stuff... or
Location: data:text/html:base64,...
拥有一个明确的目的地白名单可能是最安全的解决方案,但这很乏味,甚至不可能适用于所有用例
解决方案
编辑:
很简单:永远不要那样做 如果你必须重定向用户,千万不要让他们告诉你他们要去哪里 如果您确实必须这样做,请对输入进行URL编码,将域列入白名单,并删除您尚未列入白名单的参数。更好的是,不要让他们告诉您使用其他后端交换机生成哪个域 如果你不认真地锁定它,你将很容易受到各种事情的影响。要特别小心,他们不能在那里设置断线 更多信息:
- )
有关Open Redirect及其问题的更多信息,请参阅sirdarckcat和thornmaker最近的PHP版本在header()中筛选换行符,这样就可以了。特别是,我如何处理SSO类型的用例,在这种情况下,我无法事先知道所有目标域?从原始函数向应用程序传递一个哈希,并将该哈希匹配到发送头。听起来你可能试图做一些设计上根本不安全的事情,而不仅仅是技术上的困难。你应该详细告诉我们你到底想做什么。涉及到不同的场景:我的应用程序目前有两个严重的缺陷,登录和POST/redirect/GET。我现在非常确信没有“位置”-唯一的解决方案。相反,我必须使用固定的重定向目标和/或cookie。OTOH跨域的事情是关于一些本地富客户端web应用程序,当与我的服务器应用程序上的用户远程帐户结合时,这些应用程序支持扩展的功能(然后,它也应该知道本地应用程序)。AFAICS安全性要求用户至少执行明确的耦合操作,但问题在于细节。需要更多的思考。是的,位置标题很难正确。即使是真正的大玩家也会经常把他们搞砸。我真的相信,允许客户机为他们想要去的地方指定除预映射令牌之外的任何东西在某种程度上都是不安全的。当你弄清楚你的新布局时,试着在这里详细地发布程序,让我们看看。