我们使用单点登录(SSO)进行登录和账户创建。在我们的论坛上,没有其他登录或注册方式。
然而,被屏蔽的 IP 地址列表中有数十个 IP 地址,这些地址每天都会自动添加。这是否符合预期?是什么导致一个 IP 地址被添加到“被屏蔽的 IP 地址”列表中?
我们使用单点登录(SSO)进行登录和账户创建。在我们的论坛上,没有其他登录或注册方式。
然而,被屏蔽的 IP 地址列表中有数十个 IP 地址,这些地址每天都会自动添加。这是否符合预期?是什么导致一个 IP 地址被添加到“被屏蔽的 IP 地址”列表中?
我能想到的唯一方法是在你删除账户时选择“删除垃圾信息发送者”按钮。
好观点——正是当我们通过 API 移除账户时,IP 才会被添加到屏蔽 IP 列表中。
不过,我们发出 DELETE 请求时使用了 block_ip=false。以下是来自 Rails 日志的记录:
Parameters: {"delete_posts"=>"1", "block_email"=>"0", "blocked_urls"=>"0", "block_ip"=>"0", "id"=>"123"}
但 IP 仍然被屏蔽了,所以也许某个地方存在 bug?
有可能,不过我觉得不是?我使用的是找到的唯一一个 删除用户 端点:
DELETE /admin/users/{id}.json
该端点确实有一个 block_ip 参数,默认值为 true,而我总是将其设置为 false。尽管如此,IP 地址仍然被添加到了筛选 IP 列表中。
您可能想参考 https://meta.discourse.org/t/how-to-reverse-engineer-the-discourse-api/20576,查看在删除用户并点击标有 <kbd>仅删除</kbd> 的按钮时具体发送了哪些请求。
……因为我可以肯定地告诉您,如果您发现删除用户后 IP 地址被添加到屏蔽列表中,那么您绝对是将该用户作为垃圾邮件发送者进行删除的,例如点击中间那个按钮——删除并封禁。
我可能高兴得太早了。![]()
在将 truthy/falsy 参数修正为 ‘true’/‘false’ 字符串后,我发现在删除用户时,仍有条目被添加到“屏蔽 IP"和“屏蔽邮箱”中。
以下是某次 API 调用的 Rails 日志:
Started DELETE "/admin/users/9553.json" for 123.123.123.123 at 2021-06-10 00:01:21 +0000
Processing by Admin::UsersController#destroy as JSON
Parameters: {"delete_posts"=>"false", "block_email"=>"false", "blocked_urls"=>"false", "block_ip"=>"false", "id"=>"9553"}
Can't verify CSRF token authenticity.
Rendering text template
Rendered text template (Duration: 0.0ms | Allocations: 1)
Completed 418 in 8ms (Views: 1.4ms | ActiveRecord: 0.0ms | Allocations: 2301)
而通过 Web 界面(而非直接调用 API)执行时的请求如下:
Started DELETE "/admin/users/49.json" for 123.123.123.123 at 2021-06-10 08:24:47 +0000
Processing by Admin::UsersController#destroy as JSON
Parameters: {"context"=>"/admin/users/49/XXX", "delete_posts"=>"true", "id"=>"49"}
Rendered text template (Duration: 0.0ms | Allocations: 1)
Completed 418 in 23ms (Views: 4.7ms | ActiveRecord: 0.0ms | Allocations: 1778)
因此,经过一些测试后,似乎 API 端点 /admin/users/{id}.json 的参数只要存在,就始终被解释为 true,而不管其实际值被设置为 ‘true’ 还是 ‘false’?
当我开始仅设置值为 ‘true’ 的参数,而跳过值为 ‘false’ 的参数后,就不再向“屏蔽 IP/邮箱”中添加任何条目了。
这是预期的行为吗?这与我根据 文档 所理解的内容不符。
只要你模仿了在 Reverse engineer the Discourse API 主题中观察到的行为,就应该没问题。当你点击“仅删除”按钮时,在网络监控器中观察到了哪些 API 调用?
在某些情况下,如果 JavaScript 没有显式地向服务器传递 false,服务器会将任何存在的值视为 true。这很可能就是您在此遇到的问题。