使用haproxy,我尝试添加一个Content-Security-Policy头,除了Safari客户端不处理此头。我尝试使用带有 req.hdr(User-Agent) 的acl来检测iPhone客户端。我不能让它工作:这似乎是inoperant认为我可以记录在日志文件中的User-Agent头。
# uname -a
Linux arnaud 4.19.0-21-amd64 #1 SMP Debian 4.19.249-2 (2022-06-30) x86_64 GNU/Linux
# haproxy --version
HA-Proxy version 1.8.19-1+deb10u3 2020/08/01
Copyright 2000-2019 Willy Tarreau <willy@haproxy.org>
我尝试以下配置:
frontend fe_prod
bind :10083
mode http
capture request header User-Agent len 256
acl iosUA req.fhdr(User-Agent) -m sub iPhone
http-response add-header Content-Security-Policy "frame-ancestors 'self' file://* filesystem:;" unless iosUA
use_backend be_dev
backend be_dev
mode http
server dev 127.0.0.1:83
在haproxy.log文件中,我可以看到:
May 17 10:28:46 arnaud haproxy[29442]: 127.0.0.1:52016 [17/May/2023:10:28:46.077] fe_prod be_dev/dev 0/0/0/2/2 304 183 - - ---- 6/6/0/1/0 0/0 {Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Mobile/15E148 Safari/604.1} "GET /login HTTP/1.1"
但是HTTP响应总是包含Content-Security-Policy标头,即使对于此User-Agent也是如此。我已经花了一整天的时间处理不同的配置,但找不到我错过的东西。
1条答案
按热度按时间68de4m5k1#
我在Server Fault上找到了答案。
我引用@Michael-sqlbot在2018年10月15日的评论中的解释:
这个答案是正确的,但进一步的答案是否定的,ACL在HAProxy中不是这样工作的。ACL仅在测试时进行评估,因此在这种情况下,直到响应处理期间才会对其进行测试...并且不合格的
hdr()
获取在该点假定响应报头…但是如果你将其限定为req.hdr()
,这不会改变预期的行为,因为保存请求头部的缓冲区已经被释放了,所以请求提取没有什么可搜索的。txn变量在请求到响应之间保持不变。