PHP - 网址被重定向
所以在畸形,我有了这个href
图片链接:PHP - 网址被重定向
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
。
使用$请求 - >输入举例:
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
下运行,你应该有一个叫做access.log
/var/log/apache2/
下(或在/var/log/nginx/
nginx的)文件。
在那里你应该把你所有的HTTP请求的历史。
也许有机会,一些具有多个PARAMS有线请求都来自一个陌生的IP地址。 如果是这种情况,则意味着某些公司出于安全原因正在监控和测试网站(可能含有奇怪的参数)。
如果是这种情况,我想你是在http下,你应该切换到https。
总之,用新的代码,你应该确保有关的代码,并能够调查系统的任何其他部分。
你能给我们一个无限循环URL的例子吗?你为什么选择使用http_build_query?你只有param1和param2或更多? – borracciaBlu
无限循环URL几乎就是'www.target.com?param1=abc¶m2=xyz¶m1=abc¶m2=xyz¶m1=abc¶m2=xyz¶m1=abc¶m2=xyz ...'等等。有时我有更多,其他时间我有更少。 – clueless
你在http或https下运行吗? – borracciaBlu