2017-04-12 153 views
1

所以在畸形,我有了这个href图片链接:PHP - 网址被重定向

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)。

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

+0

你能给我们一个无限循环URL的例子吗?你为什么选择使用http_build_query?你只有param1和param2或更多? – borracciaBlu

+0

无限循环URL几乎就是'www.target.com?param1=abc¶m2=xyz¶m1=abc¶m2=xyz¶m1=abc¶m2=xyz¶m1=abc¶m2=xyz ...'等等。有时我有更多,其他时间我有更少。 – clueless

+0

你在http或https下运行吗? – borracciaBlu

回答

0

假设和问题与http_build_query:

嗯,一个尝试,你可以尝试是重写代码,而无需$request->excepthttp_build_query。 如果您没有任何特别的理由使用http_build_query我建议使用$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 . '&param2=' . $param2; 
    } else { 
     $url .= !empty($param1) 'param1=' . $param1 : ''; 
     $url .= !empty($param2) 'param2=' . $param2 : ''; 
    } 

    return redirect($url); 
} 

解决的办法是多一点点冗长,但这一说法,你应该确保100%是不产生冗余代码。

荒谬的,遥远的可能性:

我会尝试的第二件事是检查你登录系统。例如,如果你正在apache下运行,你应该有一个叫做access.log/var/log/apache2/下(或在/var/log/nginx/ nginx的)文件。

在那里你应该把你所有的HTTP请求的历史。

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

总之,用新的代码,你应该确保有关的代码,并能够调查系统的任何其他部分。