Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
HTTP头中的额外空间导致HAProxy上出现400错误_Http_Http Headers_Haproxy_Citrix - Fatal编程技术网

HTTP头中的额外空间导致HAProxy上出现400错误

HTTP头中的额外空间导致HAProxy上出现400错误,http,http-headers,haproxy,citrix,Http,Http Headers,Haproxy,Citrix,我们最近从citrix切换到HAProxy进行负载平衡 问题是,对于某些请求,HAProxy开始给出400错误(过去在citrix上工作得很好)。因此,我们暂时从基于HTTP的负载平衡转向基于TCP的负载平衡 在进一步的调查中,我们发现一些请求在HTTP头中有额外的空间,这导致了400错误 profileID<space>:value vs profileID:value profileID:value vs profileID:value 这些请求来自android应用程序,因

我们最近从citrix切换到HAProxy进行负载平衡

问题是,对于某些请求,HAProxy开始给出400错误(过去在citrix上工作得很好)。因此,我们暂时从基于HTTP的负载平衡转向基于TCP的负载平衡

在进一步的调查中,我们发现一些请求在HTTP头中有额外的空间,这导致了400错误

profileID<space>:value
vs
profileID:value
profileID:value
vs
profileID:value
这些请求来自android应用程序,因此我们无法更改源代码

我们正试图回到基于http的负载平衡


是否存在允许我们忽略空格的配置设置。

HAProxy支持名为
option accept invalid http request的代理配置指令

它放松了HAProxy在默认情况下对传入请求正确要求的一些严格的协议遵从性,因此在不了解其含义的情况下,不应盲目或粗心地使用它

从文件中:

默认情况下,HAProxy在消息解析方面符合RFC7230。这意味着头名称中不允许使用无效字符,并导致将错误返回给客户端。这是理想的行为,因为此类禁止字符基本上用于利用服务器弱点构建攻击,并绕过安全过滤

有时,有缺陷的浏览器或服务器会出于任何原因(配置、实现)发出无效的头名称,并且问题不会立即得到解决。在这种情况下,通过指定此选项,可以放松HAProxy的头名称解析器以接受任何字符,即使这没有意义

类似地,RFC3986很好地定义了允许出现在URI中的字符列表,并且完全不允许使用字符0-31、32(空格)、34(“”)、60(“”)、92(“\”)、94(“^”)、96(“`')、123(“{”)、124(“|”)、125(“}”)、127(删除)以及以上任何内容。Haproxy始终阻止其中的一些字符(0..32、127)。除非启用此选项,否则默认情况下会阻止其余的请求。此选项还可以放松对HTTP版本的测试,它允许HTTP/0.9请求通过(未指定版本),并允许主版本和次版本的多个数字

默认情况下不应启用此选项,因为它隐藏了应用程序错误和公开的安全漏洞。只有在确认问题后才应部署此选项。

(增加重点)

将此选项添加到configurarion文件的相应
前端
部分应允许接受这些无效标题


请注意,文档中提到的潜在安全风险不是HAProxy固有的风险,而是针对代理后堆栈中的漏洞进行攻击的风险——因为通常情况下,HAProxy会屏蔽这些组件,使其免受此类无效请求的影响。

您是否100%确定阻止的头是“冒号空格”而不是“空格-c”冒号“?冒号后面的空格在HTTP中不是无效的,不会被HAProxy阻止。这里还有其他问题。请查看您的日志。如果您使用的是自定义日志格式,请查找终止状态--
%tsc
的值。如果请求成功,这将被记录为
---
。对于失败的请求,first两个字符(至少)将不同,这是非常有用的信息。您在这里看到了什么?您捕获了数据包跟踪吗?是否有任何
req[i]rep
规则?如果你这样做,请向他们展示——你可能用一个不正确的正则表达式破坏了请求。@regilero:Ye你是对的。.更新了问题。@Michael sqlbot Ye。.我把空格的位置弄错了。多余的空格在冒号之前。.已经更正了问题中的相同内容,好的,这是一个完全破坏的客户端。请添加请参阅我在上一篇评论中提出的其他问题。然后,在审阅之后,尝试将
选项accept invalid http request
添加到相关的
frontend
部分,看看这是否能解决该问题。