如何在Haproxy中根据url参数形成棒表

问题描述 投票:0回答:2

我有以下网址,客户端可以点击该网址。

/AnEndPoint?User=<user_emailid>&DeviceId=<device_id>

我想根据 User+DeviceId 组合对用户进行速率限制。

例如,DeviceId 123 的用户 A 每秒发出超过 x 个请求,应将其添加到粘表中,并且进一步的请求将被拒绝

我在这里看到一些东西https://cbonte.github.io/haproxy-dconv/1.6/configuration.html#7.3.6-url_param

我这里有一些适用于 Deviceid 的示例配置,如何扩展它以存储 userremail+Deviceid 并仅阻止这些配置。

frontend frontend1

    http-request set-var(txn.email) urlp(User)
    http-request set-var(txn.deviceid) urlp(DeviceId)
    http-request deny if { var(txn.deviceid),table_http_req_rate(Abuse) ge 10 }

    http-request track-sc0 var(txn.deviceid) table Abuse


backend somebackend
   stick store-request var(txn.deviceid)  table Abuse #ONLY STORING DEVICEID ,HOW TO STORE EMAIL WITH IT TOO?
backend Abuse
 stick-table type string size 100K expire 30m store http_req_rate(10s)

我在理解如何插入和增加粘表中每个请求的查询字符串生成的值时遇到问题。

haproxy
2个回答
0
投票

最终做到了这一点。

backend Backend1
    http-request set-header  UserInfo       %[urlp(User)]%[urlp(DeviceId)]
    stick store-request hdr(UserInfo) table Abuse
    http-request track-sc0 hdr(UserInfo) table Abuse
    http-request deny if { hdr(UserInfo),table_http_req_rate(Abuse) ge 5 }

0
投票

您可以使用

set-var-fmt
作为描述这里

,而不是设置额外的标头,这可能会产生副作用,例如将信息泄漏到外部后端服务器
backend Backend1
    http-request set-var-fmt(req.user_info) %[urlp(User)]%[urlp(DeviceId)]
    stick store-request var(req.user_info) table Abuse
    http-request track-sc0 var(req.user_info) table Abuse
    http-request deny if { var(req.user_info),table_http_req_rate(Abuse) ge 5 }
© www.soinside.com 2019 - 2024. All rights reserved.