【问题标题】:PHP - URL gets malformed during redirectPHP - URL 在重定向期间格式错误
【发布时间】:2017-09-08 19:07:30
【问题描述】:

所以,我有一个包含href 的图片链接:

http://www.app.com/link?target=www.target.com&param1=abc&param2=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);
}

大多数时候,这是有效的。然而,最近我们遇到了一个问题,即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)。

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

【问题讨论】:

  • 你能给我们一个无限循环 URL 的例子吗?为什么选择使用 http_build_query?你只有 param1 和 param2 还是更多?
  • 无限循环 URL 几乎是 www.target.com?param1=abc&param2=xyz&param1=abc&param2=xyz&param1=abc&param2=xyz&param1=abc&param2=xyz... 等等。有时我有更多,有时我有更少。
  • 你是在http还是https下运行?

标签: php laravel laravel-5.1


【解决方案1】:

假设和问题 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/ 下(或在/var/log/nginx/ 下使用nginx)有一个名为access.log 的文件。

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

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

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

【讨论】:

    猜你喜欢
    • 2018-04-02
    • 2017-04-29
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多