PHP - URL 在重定向过程中格式不正确



所以,我有一个图像链接,它有这个href

http://www.app.com/link?target=www.target.com&param1=abc&param2=xyz

这是这样处理的(我使用拉拉维尔):

function out (Request $request) {
$url = $request->target;
$qs = $request->except('target');
if ( !empty($qs) ) {
$url .= strpos($url, '?') !== false ? '&' : '?';
$url .= http_build_query($qs);
}
return redirect($url);
}

大多数时候,这是有效的。但是,最近,我们遇到了一个问题,即param1param2在看似无限的循环中附加到 URL,导致我们遇到414 Request URI too long错误。

问题是它发生得如此随机,以至于我真的不知道在哪里检查,因为我在return语句之前添加了一个检查器。

if ( substr_count($url, 'param1') > 1 ) {
$file = storage_path() . '/logs/logger.log';
$log = "[ " . date("d-m-Y H:i:sa") . " ] [ {$request->ip()} ] - {$url} n";
file_put_contents($file, $log, FILE_APPEND);
}

而且它没有记录一次命中。即使在我们的测试人员遇到错误之后。

接收应用程序是否有可能以某种方式破坏 URL? 我应该注意哪些信息?你以前见过这样的问题吗?

是可能导致此问题的http_build_query,并且我的检查器无法按预期工作(不过,我确实对其进行了测试,并记录了我的测试 URL)。

关于此事的任何帮助都会很棒。

假设和问题http_build_query:

好吧,您可以尝试的一种尝试是在没有$request->excepthttp_build_query的情况下重写代码。 如果您没有任何特殊理由使用http_build_query我建议您使用$request->input.

具有$request>输入的示例:

function out (Request $request) {
$url = $request->target;
$param1 = $request->input('param1', '');
$param2 = $request->input('param2', '');
if (!empty($param1) || !empty($param2)) {
$url .= '?';
}
if (!empty($param1) && !empty($param2)) {
$url .= 'param1=' . $param1 . '&param2=' . $param2;
} else {
$url .= !empty($param1) 'param1=' . $param1 : '';
$url .= !empty($param2) 'param2=' . $param2 : '';
}
return redirect($url);
}

解决方案有点冗长,但有了这个,你应该确定 100% 这不是生成冗余的代码。

荒谬、遥远的可能性:

我要尝试的第二件事是检查您的日志系统。例如,如果你在apache下运行,你应该在/var/log/apache2/下(或在nginx的/var/log/nginx/下)有一个名为access.log的文件。

在那里,您应该拥有所有http请求的历史记录。

也许某些具有多个参数的有线请求可能来自一个奇怪的 IP 地址。 如果是这种情况,则意味着某些公司出于安全原因正在监视和测试网站(可能使用奇怪的参数)。
如果是这种情况,我想你在http下,你应该切换到https。

无论如何,使用新代码,您应该确定代码并能够调查系统的任何其他部分。

最新更新