Cha*_*aim 6 php security redirect sanitization http-headers
我可以安全地在PHP重定向头中使用已发布的值而不检查它:
header( "Location: $base".$_POST['return'] ); // $base is set to the base of the site
Run Code Online (Sandbox Code Playgroud)
(如果用户以某种方式操作return到不存在的文件,它只会返回一条很好的404消息)
这样做有危险吗?用户是否可以将其设置为可能危及系统或以任何方式损坏?
header() 函数不再容易受到HTTP 响应拆分的影响。您需要担心的唯一漏洞是OWASP a10 - 未经验证的重定向和转发。
提供除$base空字符串之外的任何内容都将阻止攻击者将用户转发到远程域,这对于网络钓鱼可能很有用。如果将检查引用作为 CSRF 预防的一种形式,则重定向到同一域可能对攻击者有用,但这是一种较弱的保护形式,无论如何您都不应该使用。即使有了基础,攻击者也可以通过提供如下值来更改路径:/../../../admin.php,但这仍然相对于原始域,在大多数情况下是安全的。
处理未经验证的重定向的一种好方法是通过不使用 REQUEST 变量来完全避免该问题。相反,将其存储在 a 中$_SESSION['redirect'],并将其用于下一个请求。为了更强大一点,您可以说$_SESSION['redirect_checkout'],或特定于页面的内容。
另一种选择是使用白名单,创建您想要接受的所有值的列表,并确保用户提供的值在您的列表中。