PHP - URL 在重定向期间格式错误
PHP - URL gets malformed during redirect
所以,我有一个图像 link 有这个 href
:
http://www.app.com/link?target=www.target.com¶m1=abc¶m2=xyz
这样处理(我用的是laravel):
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);
}
大多数情况下,这是可行的。然而,最近,我们遇到了一个问题,即 param1
和 param2
在看似无限循环中附加到 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->except
和 http_build_query
的情况下重写代码。
如果您没有任何特殊原因使用 http_build_query
我建议使用 $request->input
.
示例 $request->input:
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 . '¶m2=' . $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。
无论如何,有了新代码,您应该对代码有把握并且能够调查系统的任何其他部分。
所以,我有一个图像 link 有这个 href
:
http://www.app.com/link?target=www.target.com¶m1=abc¶m2=xyz
这样处理(我用的是laravel):
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);
}
大多数情况下,这是可行的。然而,最近,我们遇到了一个问题,即 param1
和 param2
在看似无限循环中附加到 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->except
和 http_build_query
的情况下重写代码。
如果您没有任何特殊原因使用 http_build_query
我建议使用 $request->input
.
示例 $request->input:
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 . '¶m2=' . $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。
无论如何,有了新代码,您应该对代码有把握并且能够调查系统的任何其他部分。