HTTP标头中的额外空间在HAProxy上产生400错误

时间:2016-09-02 07:11:16

标签: http http-headers haproxy citrix

我们最近从Citrix切换到HAProxy以实现负载平衡。

问题在于,对于某些请求,HAProxy开始提供400错误(过去在Citrix上运行良好)。因此,我们暂时从基于HTTP的负载平衡转向基于TCP的负载平衡。

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

profileID<space>:value
vs
profileID:value

这些请求来自Android应用程序,因此我们无法更改源代码。

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

是否有任何配置设置可以让我们忽略空格。

1 个答案:

答案 0 :(得分:4)

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

它放宽了HAProxy 正确在传入请求时默认需要的一些严格协议合规性,因此不应盲目或粗心地使用它而不理解其含义。

来自文档:

  

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

     

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

     

类似地,允许出现在URI中的字符列表由RFC3986很好地定义,并且字符0-31,32(空格),34('“'),60('&lt;'),62(' &gt;'),92('\'),94('^'),96('`'),123('{'),124('|'),125('}'),127(删除根本不允许任何上面的内容.Haproxy总是阻塞其中的一些(0..32,127)。除非启用此选项,否则默认情况下会阻止其余的。此选项还放宽了对HTTP版本的测试,它允许HTTP / 0.9请求通过(没有指定版本)和主要版本和次要版本的多个数字。

     

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

     

http://cbonte.github.io/haproxy-dconv/1.6/configuration.html#4-option%20accept-invalid-http-request   (强调添加)

将此选项添加到配置文件的相应frontend部分应允许接受这些无效的标头。

请注意,文档中提到的潜在安全风险不是HAProxy中固有的风险,而是代理代码后面的漏洞利用漏洞的风险 - 因为通常情况下,HAProxy会将这些组件屏蔽掉此类无效请求。