在PHP头中使用$\u POST值(用于重定向)之前,是否需要对其进行清理

在PHP头中使用$\u POST值(用于重定向)之前,是否需要对其进行清理,php,security,redirect,http-headers,sanitization,Php,Security,Redirect,Http Headers,Sanitization,我是否可以安全地使用PHP重定向头中的已发布值而不检查它: header( "Location: $base".$_POST['return'] ); // $base is set to the base of the site (如果用户以某种方式操纵返回到一个不存在的文件,它只会返回一条漂亮的404消息) 这样做有危险吗?用户是否可以将其设置为任何可能危害系统或以任何方式造成损坏的内容?是的,绝对可以!任何时候都不要相信任何$\u GET或$\u POST值 假设第三方站点发布表单。它可

我是否可以安全地使用PHP重定向头中的已发布值而不检查它:

header( "Location: $base".$_POST['return'] ); // $base is set to the base of the site
(如果用户以某种方式操纵
返回到一个不存在的文件,它只会返回一条漂亮的404消息)


这样做有危险吗?用户是否可以将其设置为任何可能危害系统或以任何方式造成损坏的内容?

是的,绝对可以!任何时候都不要相信任何$\u GET或$\u POST值

假设第三方站点发布表单。它可以邮寄任何地址

一个简单的解决方案是不包括地址,而是在表单中包含地址的md5()散列。表单发布后,脚本的任务是将哈希映射到实际地址,然后发出
位置
标题

我的朋友可能会感兴趣

你可能会争辩说,你的应用程序是防弹的。为什么我不应该直接传递URL

事实上,即使是设计良好的应用程序也不是那么防弹的。后退一步,试着记住你最后一句话:“啊,我忘了什么。”。让我们修复它的事件

您是否在每个控制点检查了每个和任何条件

  • 用户在web表单提交按钮上单击两次。因此,控制器运行两次
  • 用户按F5重新提交上次更新的控制器两次
  • 用户以某种方式操纵了参数,并使用传入的off值调用了控制器
因此,我建议不要直接传递链接或其他参数,也不要传递未受保护/未经验证的链接或其他参数

@Col.Shrapnel:我完全知道,任何时候的任何URL都可以提交到web应用程序。那是微不足道的

然而,在控制流的给定点,存在控制流的某些可接受的下一状态

为了确保只达到下一个控制流状态,我建议进行验证

更一般的方法

事实上,我最近更新的从未将任何参数作为GET或POST参数从一个请求传递到另一个请求。所有参数都是从用户会话中保存和检索的[在所谓的流中,更大控制流的一部分]


使用该框架,只传递一个参数——FlowID。如果框架在会话的流存储中找不到FlowID,框架将抛出异常,调度器将发出错误消息。

我对Stefan的答案投了赞成票

我还要补充一点。我为构建和解析URL编写了一个很好的类。如果你愿意,你可以用它来验证

有关用法,请参见Url.php和UrlTest.php

希望这对…有所帮助。

header()函数不再易受攻击。你唯一需要担心的漏洞是

提供除空字符串以外的任何内容的
$base
,将防止攻击者将用户转发到远程域,这可能对网络钓鱼有用。如果攻击者将referer检查为CSRF预防的一种形式,则重定向到同一域可能会对攻击者有用,但这是一种很弱的保护形式,无论如何都不应该使用。即使有一个基,攻击者也可以通过提供如下值来更改路径:
/../../../../../admin.php
,但这仍然是相对于原始域的,在大多数情况下是安全的

处理未验证重定向的一个很好的方法是不使用请求变量来完全避免问题。而是将其存储在
$\u会话['redirect']
中,并将其用于下一个请求。为了更健壮一点,您可以说
$\u SESSION['redirect\u checkout']
,或者一些特定于页面的内容


另一个选项是使用白名单,创建一个您想要接受的所有值的列表,并确保用户提供的值在您的列表中

为什么??你能给我举个例子,说明有人能做些什么来造成损害吗?(很明显,我在检查用户在做任何操作之前总是有做任何事情的权限。)因为
$base
总是在我的域中的某个地方,所以最坏的情况是他们得到了404(但这是他们的错,因为他们搞乱了事情(.我真正的问题是:他们能用
return
变量注入任何恶意的东西吗?也许…如果攻击者能在返回变量中放入换行符…宾果!在位置后添加新的http头。我不确定web浏览器在http头解析方面是否存在缺陷。我的一个朋友曾经在in中使用过$\u GET变量clude语句。查看apache日志,我发现该脚本可用于获取对我们服务器的管理命令行访问权限。这太令人毛骨悚然了。@Frank那又怎样?你的故事与这个问题有什么关系?@Frank Oah是的,我曾经使用GET变量杀死一个人。但我不知道LFI漏洞与此有什么关系。Proba很好的问题。三次尝试,但还没有一个答案。不要让他们用毫无意义的话和无关的威胁来愚弄你。我相信这可能是对Stefan答案的一个很好的评论,因为它似乎没有回答我的问题。我看不出这个答案被否决的原因。我看不出这里有问题。因此:Upvote.G重新回答,谢谢。您认为有必要检查
返回值是否确实是我服务器上存在的文件吗?(还请记住,无论未验证的重定向到哪里,它都会转到我服务器上的某个位置,因为
$base
)如果相关,则上下文是一个登录页面,它会重定向回用户登录前所在的页面。不,绝对不是!PHP不检查脚本文件是否存在。事实上,脚本甚至不需要存在,用户仍然可以得到结果。@Rook解释说,该头()考虑到传入的参数格式不正确-