[GH-ISSUE #13] CC 防护增加验证码访问功能 #6

Closed
opened 2026-03-04 12:17:52 +03:00 by kerem · 21 comments
Owner

Originally created by @toyops on GitHub (Dec 14, 2020).
Original GitHub issue: https://github.com/ADD-SP/ngx_waf/issues/13

CC 防护是否可以考虑增加一个访问频繁转跳验证码的功能,验证码通过则可以访问,否则锁定一段时间持续要求填写验证码,大部分 toC 的业务层可能都需要这种功能,尤其是业务规模不大的情况下,又遇到刷单的问题。

Originally created by @toyops on GitHub (Dec 14, 2020). Original GitHub issue: https://github.com/ADD-SP/ngx_waf/issues/13 CC 防护是否可以考虑增加一个访问频繁转跳验证码的功能,验证码通过则可以访问,否则锁定一段时间持续要求填写验证码,大部分 toC 的业务层可能都需要这种功能,尤其是业务规模不大的情况下,又遇到刷单的问题。
kerem 2026-03-04 12:17:52 +03:00
Author
Owner

@ADD-SP commented on GitHub (Dec 14, 2020):

考虑了一下,有下面的几个问题暂时不知如何妥善解决,列出来讨论一下可能的解决方法。并非 WEB 方向,可能会有低级错误。

  • 提供验证码服务的平台有很多,如阿里和腾讯。如果直接接入这些平台会带来大量适配工作。不符合本模块的初衷。
  • 本模块直接生成验证码的话,第一验证码可能极易被破解(毕竟不是专业的),第二依然可能是大量的代码。不符合本模块的初衷。

值得一提的是 nginx 允许自定义错误界面,有没有可能通过通过自定义 503(CC 防护生效时就会返回 503 错误)错误页面来实现?

<!-- gh-comment-id:744375138 --> @ADD-SP commented on GitHub (Dec 14, 2020): 考虑了一下,有下面的几个问题暂时不知如何妥善解决,列出来讨论一下可能的解决方法。并非 WEB 方向,可能会有低级错误。 * 提供验证码服务的平台有很多,如阿里和腾讯。如果直接接入这些平台会带来大量适配工作。不符合本模块的初衷。 * 本模块直接生成验证码的话,第一验证码可能极易被破解(毕竟不是专业的),第二依然可能是大量的代码。不符合本模块的初衷。 值得一提的是 nginx 允许自定义错误界面,有没有可能通过通过自定义 503(CC 防护生效时就会返回 503 错误)错误页面来实现?
Author
Owner

@toyops commented on GitHub (Dec 14, 2020):

考虑了一下,有下面的几个问题暂时不知如何妥善解决,列出来讨论一下可能的解决方法。并非 WEB 方向,可能会有低级错误。

* 提供验证码服务的平台有很多,如阿里和腾讯。如果直接接入这些平台会带来大量适配工作。不符合本模块的初衷。

* 本模块直接生成验证码的话,第一验证码可能极易被破解(毕竟不是专业的),第二依然可能是大量的代码。不符合本模块的初衷。

值得一提的是 nginx 允许自定义错误界面,有没有可能通过通过自定义 503(CC 防护生效时就会返回 503 错误)错误页面来实现?

可以考虑调用 Golang ,有合适的库生成 recaptcha 图片,含有图片的页面,及验证功能函数。
https://github.com/dchest/captcha
https://github.com/mojocn/base64Captcha

<!-- gh-comment-id:744381740 --> @toyops commented on GitHub (Dec 14, 2020): > 考虑了一下,有下面的几个问题暂时不知如何妥善解决,列出来讨论一下可能的解决方法。并非 WEB 方向,可能会有低级错误。 > > * 提供验证码服务的平台有很多,如阿里和腾讯。如果直接接入这些平台会带来大量适配工作。不符合本模块的初衷。 > > * 本模块直接生成验证码的话,第一验证码可能极易被破解(毕竟不是专业的),第二依然可能是大量的代码。不符合本模块的初衷。 > > > 值得一提的是 nginx 允许自定义错误界面,有没有可能通过通过自定义 503(CC 防护生效时就会返回 503 错误)错误页面来实现? 可以考虑调用 Golang ,有合适的库生成 recaptcha 图片,含有图片的页面,及验证功能函数。 https://github.com/dchest/captcha https://github.com/mojocn/base64Captcha
Author
Owner

@ADD-SP commented on GitHub (Dec 14, 2020):

考虑了一下,有下面的几个问题暂时不知如何妥善解决,列出来讨论一下可能的解决方法。并非 WEB 方向,可能会有低级错误。

* 提供验证码服务的平台有很多,如阿里和腾讯。如果直接接入这些平台会带来大量适配工作。不符合本模块的初衷。

* 本模块直接生成验证码的话,第一验证码可能极易被破解(毕竟不是专业的),第二依然可能是大量的代码。不符合本模块的初衷。

值得一提的是 nginx 允许自定义错误界面,有没有可能通过通过自定义 503(CC 防护生效时就会返回 503 错误)错误页面来实现?

可以考虑调用 Golang ,有合适的库生成 recaptcha 图片,含有图片的页面,及验证功能函数。
https://github.com/dchest/captcha
https://github.com/mojocn/base64Captcha

出于下列原因不会考虑调用其它语言:

  • C 调用其它语言无非就是要把其它语言编译成 .so.dll 等,要做各个平台的适配。
  • nginx 的模块都是 make 之后立刻使用,就算不动态加载 .sodll 等文件,也需要提前将其它语言编译成二进制格式。需要额外的编译脚本。
<!-- gh-comment-id:744397593 --> @ADD-SP commented on GitHub (Dec 14, 2020): > > > > 考虑了一下,有下面的几个问题暂时不知如何妥善解决,列出来讨论一下可能的解决方法。并非 WEB 方向,可能会有低级错误。 > > ``` > > * 提供验证码服务的平台有很多,如阿里和腾讯。如果直接接入这些平台会带来大量适配工作。不符合本模块的初衷。 > > > > * 本模块直接生成验证码的话,第一验证码可能极易被破解(毕竟不是专业的),第二依然可能是大量的代码。不符合本模块的初衷。 > > ``` > > > > > > 值得一提的是 nginx 允许自定义错误界面,有没有可能通过通过自定义 503(CC 防护生效时就会返回 503 错误)错误页面来实现? > > 可以考虑调用 Golang ,有合适的库生成 recaptcha 图片,含有图片的页面,及验证功能函数。 > https://github.com/dchest/captcha > https://github.com/mojocn/base64Captcha 出于下列原因不会考虑调用其它语言: * C 调用其它语言无非就是要把其它语言编译成 `.so`、`.dll` 等,要做各个平台的适配。 * nginx 的模块都是 `make` 之后立刻使用,就算不动态加载 `.so` 或 `dll` 等文件,也需要提前将其它语言编译成二进制格式。需要额外的编译脚本。
Author
Owner

@ADD-SP commented on GitHub (Dec 14, 2020):

找到一个 C 语言的库:captcha,先记录在这里。考虑一下实现方式决定是否添加本功能,有了进展我会在这里留言的。

<!-- gh-comment-id:744398606 --> @ADD-SP commented on GitHub (Dec 14, 2020): 找到一个 C 语言的库:[captcha](http://brokestream.com/captcha.html),先记录在这里。考虑一下实现方式决定是否添加本功能,有了进展我会在这里留言的。
Author
Owner

@ADD-SP commented on GitHub (Dec 16, 2020):

想到一种作为项目作者可能可以接受但模块用户不一定可以接受的实现方式,所以贴出来讨论一下,或者改进,或者否决。

实现方式

# 是否启用验证码
waf_captcha on;
# 含有若干个验证码图片的目录
waf_captcha_path /path/to/captcha;
# 指向验证码图片目录的 URL
waf_captcha_url /url/to/captcha;
# 指向验证码页面的 URL。
waf_captcha_page_url /url/to/captcha/page;
# 验证码页面发送 GET 请求到这个 URL,使用 GET 参数传递用户输入的验证码的值和验证成功后要跳转到的 URL。
waf_captcha_check_url /url/to/captcha/check;
  • 模块不负责生成验证码以及验证码页面,而是通过配置指令来指定包含有验证码的目录和验证码界面的 URL。
  • 验证码页面通过读取指定的 GET 参数来获取验证码图片的 URL 并显示。
  • 触发 CC 防护时会自动重定向到验证码页面,页面将用户的输入发送到指定的 URL,然后由本模块检查决定放行或者拦截。

优点

  • 模块不负责生成验证码和验证页面,所以不会增加过多的代码复杂度。
  • 验证码页面是灵活的,不是模块内部写死的,可以根据业务场景自己决定。最简单情况就是中文业务用中文页面,非中文业务用非中文页面。
  • 由于验证码图片也不是写死的,可以通过外部方式提前生成一些验证码图片(比如生成 10w 个),避免了临时生成的性能损耗,因为临时生成肯定要先将图片写入磁盘,尽量要避免硬盘 IO。
  • 扩展性较好。因为模块只负责跳转和检查,所以后续如果使用其它类型的验证码如拖动验证码也不易引起大量的代码改动,通常只需要修改验证码页面。

缺点

  • 这虽然是一个向下兼容的更新,但是它的改动容易引起不向下兼容的更新,要慎重考虑。
  • 可能会引入更多的配置,同样要慎重考虑。
  • 把一些工作转移给了模块用户。
<!-- gh-comment-id:745761582 --> @ADD-SP commented on GitHub (Dec 16, 2020): 想到一种作为项目作者可能可以接受但模块用户不一定可以接受的实现方式,所以贴出来讨论一下,或者改进,或者否决。 ## 实现方式 ```conf # 是否启用验证码 waf_captcha on; # 含有若干个验证码图片的目录 waf_captcha_path /path/to/captcha; # 指向验证码图片目录的 URL waf_captcha_url /url/to/captcha; # 指向验证码页面的 URL。 waf_captcha_page_url /url/to/captcha/page; # 验证码页面发送 GET 请求到这个 URL,使用 GET 参数传递用户输入的验证码的值和验证成功后要跳转到的 URL。 waf_captcha_check_url /url/to/captcha/check; ``` * 模块不负责生成验证码以及验证码页面,而是通过配置指令来指定包含有验证码的目录和验证码界面的 URL。 * 验证码页面通过读取指定的 GET 参数来获取验证码图片的 URL 并显示。 * 触发 CC 防护时会自动重定向到验证码页面,页面将用户的输入发送到指定的 URL,然后由本模块检查决定放行或者拦截。 ## 优点 * 模块不负责生成验证码和验证页面,所以不会增加过多的代码复杂度。 * 验证码页面是灵活的,不是模块内部写死的,可以根据业务场景自己决定。最简单情况就是中文业务用中文页面,非中文业务用非中文页面。 * 由于验证码图片也不是写死的,可以通过外部方式提前生成一些验证码图片(比如生成 10w 个),避免了临时生成的性能损耗,因为临时生成肯定要先将图片写入磁盘,尽量要避免硬盘 IO。 * 扩展性较好。因为模块只负责跳转和检查,所以后续如果使用其它类型的验证码如拖动验证码也不易引起大量的代码改动,通常只需要修改验证码页面。 ## 缺点 * 这虽然是一个向下兼容的更新,但是它的改动容易引起不向下兼容的更新,要慎重考虑。 * 可能会引入更多的配置,同样要慎重考虑。 * 把一些工作转移给了模块用户。
Author
Owner

@toyops commented on GitHub (Dec 16, 2020):

感觉干脆就外部接入一个程序也挺好。触发 CC 防护时,可能也要加上速率限制,提供验证码页面的次数不能不限制,会成为攻击点。还有现在是分钟,细粒度是不是不够,面对 CC 攻击都是秒级别的多。使用最简单配置测试的时候也发现 CC 防护没到时间就请求到了后端。
nginx 配置

server {
    listen 80;
    server_name localhost 127.0.0.1;

waf on;
waf_mode STD;
waf_cc_deny_limit 5 1;
location / {
index index.html;
}

}

测试脚本

for i in seq 1 20;do
date
echo $i
curl http://127.0.0.1
echo
done


发件人: ADD-SP notifications@github.com
发送时间: 2020年12月16日 12:48
收件人: ADD-SP/ngx_waf ngx_waf@noreply.github.com
抄送: toyops volqiu@live.com; Author author@noreply.github.com
主题: Re: [ADD-SP/ngx_waf] CC 防护增加验证码访问功能 (#13)

想到一种作为项目作者可能可以接受实现方式,贴出来讨论一下,或者改进,或者否决。

实现方式

含有若干个验证码图片的目录

waf_captcha_path /path/to/captcha;

指向验证码图片目录的 URL

waf_captcha_url /url/to/captcha;

指向验证码页面的 URL。

waf_captcha_page_url /url/to/captcha/page;

验证码页面发送 GET 请求到这个 URL,使用 GET 参数传递用户输入的验证码的值和验证成功后要跳转到的 URL。

waf_captcha_check_url /url/to/captcha/check;

  • 模块不负责生成验证码以及验证码页面,而是通过配置指令来指定包含有验证码的目录和验证码界面的 URL。
  • 验证码页面通过读取指定的 GET 参数来获取验证码图片的 URL 并显示。
  • 触发 CC 防护时会自动重定向到验证码页面,页面将用户的输入发送到指定的 URL,然后由本模块检查决定放行或者拦截。

优点

  • 模块不负责生成验证码和验证页面,所以不会增加过多的代码复杂度。
  • 验证码页面是灵活的,不是模块内部写死的,可以根据业务场景自己决定。
  • 由于验证码图片也不是写死的,可以通过外部方式提前生成一些验证码图片(比如生成 10w 个),避免了临时生成的性能损耗,因为临时生成肯定要先将图片写入磁盘,尽量要避免 IO。
  • 扩展性较好。因为模块只负责跳转和检查,所以后续如果使用其它类型的验证码如拖动验证码也不会引起大量的代码改动。

缺点

  • 这是一个不向下兼容的更新,所以要慎重考虑。因为如果添加后再删除会再引起一次不向下兼容的更新。
  • 可能会引入更多的配置,同样要慎重考虑。
  • 把一些工作转移给了模块用户。


You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHubhttps://github.com/ADD-SP/ngx_waf/issues/13#issuecomment-745761582, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AGEZXHMIJT46Q54GGPCGZN3SVA32LANCNFSM4U2FISQQ.

<!-- gh-comment-id:745929613 --> @toyops commented on GitHub (Dec 16, 2020): 感觉干脆就外部接入一个程序也挺好。触发 CC 防护时,可能也要加上速率限制,提供验证码页面的次数不能不限制,会成为攻击点。还有现在是分钟,细粒度是不是不够,面对 CC 攻击都是秒级别的多。使用最简单配置测试的时候也发现 CC 防护没到时间就请求到了后端。 nginx 配置 server { listen 80; server_name localhost 127.0.0.1; waf on; waf_mode STD; waf_cc_deny_limit 5 1; location / { index index.html; } } 测试脚本 for i in `seq 1 20`;do date echo $i curl http://127.0.0.1 echo done ________________________________ 发件人: ADD-SP <notifications@github.com> 发送时间: 2020年12月16日 12:48 收件人: ADD-SP/ngx_waf <ngx_waf@noreply.github.com> 抄送: toyops <volqiu@live.com>; Author <author@noreply.github.com> 主题: Re: [ADD-SP/ngx_waf] CC 防护增加验证码访问功能 (#13) 想到一种作为项目作者可能可以接受实现方式,贴出来讨论一下,或者改进,或者否决。 实现方式 # 含有若干个验证码图片的目录 waf_captcha_path /path/to/captcha; # 指向验证码图片目录的 URL waf_captcha_url /url/to/captcha; # 指向验证码页面的 URL。 waf_captcha_page_url /url/to/captcha/page; # 验证码页面发送 GET 请求到这个 URL,使用 GET 参数传递用户输入的验证码的值和验证成功后要跳转到的 URL。 waf_captcha_check_url /url/to/captcha/check; * 模块不负责生成验证码以及验证码页面,而是通过配置指令来指定包含有验证码的目录和验证码界面的 URL。 * 验证码页面通过读取指定的 GET 参数来获取验证码图片的 URL 并显示。 * 触发 CC 防护时会自动重定向到验证码页面,页面将用户的输入发送到指定的 URL,然后由本模块检查决定放行或者拦截。 优点 * 模块不负责生成验证码和验证页面,所以不会增加过多的代码复杂度。 * 验证码页面是灵活的,不是模块内部写死的,可以根据业务场景自己决定。 * 由于验证码图片也不是写死的,可以通过外部方式提前生成一些验证码图片(比如生成 10w 个),避免了临时生成的性能损耗,因为临时生成肯定要先将图片写入磁盘,尽量要避免 IO。 * 扩展性较好。因为模块只负责跳转和检查,所以后续如果使用其它类型的验证码如拖动验证码也不会引起大量的代码改动。 缺点 * 这是一个不向下兼容的更新,所以要慎重考虑。因为如果添加后再删除会再引起一次不向下兼容的更新。 * 可能会引入更多的配置,同样要慎重考虑。 * 把一些工作转移给了模块用户。 ― You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub<https://github.com/ADD-SP/ngx_waf/issues/13#issuecomment-745761582>, or unsubscribe<https://github.com/notifications/unsubscribe-auth/AGEZXHMIJT46Q54GGPCGZN3SVA32LANCNFSM4U2FISQQ>.
Author
Owner

@ADD-SP commented on GitHub (Dec 16, 2020):

感觉干脆就外部接入一个程序也挺好。触发 CC 防护时,可能也要加上速率限制,提供验证码页面的次数不能不限制,会成为攻击点。还有现在是分钟,细粒度是不是不够,面对 CC 攻击都是秒级别的多。使用最简单配置测试的时候也发现 CC 防护没到时间就请求到了后端。 nginx 配置 server { listen 80; server_name localhost 127.0.0.1; waf on; waf_mode STD; waf_cc_deny_limit 5 1; location / { index index.html; } } 测试脚本 for i in seq 1 20;do date echo $i curl http://127.0.0.1 echo done

________________________________ 发件人: ADD-SP notifications@github.com 发送时间: 2020年12月16日 12:48 收件人: ADD-SP/ngx_waf ngx_waf@noreply.github.com 抄送: toyops volqiu@live.com; Author author@noreply.github.com 主题: Re: [ADD-SP/ngx_waf] CC 防护增加验证码访问功能 (#13) 想到一种作为项目作者可能可以接受实现方式,贴出来讨论一下,或者改进,或者否决。 实现方式 # 含有若干个验证码图片的目录 waf_captcha_path /path/to/captcha; # 指向验证码图片目录的 URL waf_captcha_url /url/to/captcha; # 指向验证码页面的 URL。 waf_captcha_page_url /url/to/captcha/page; # 验证码页面发送 GET 请求到这个 URL,使用 GET 参数传递用户输入的验证码的值和验证成功后要跳转到的 URL。 waf_captcha_check_url /url/to/captcha/check; * 模块不负责生成验证码以及验证码页面,而是通过配置指令来指定包含有验证码的目录和验证码界面的 URL。 * 验证码页面通过读取指定的 GET 参数来获取验证码图片的 URL 并显示。 * 触发 CC 防护时会自动重定向到验证码页面,页面将用户的输入发送到指定的 URL,然后由本模块检查决定放行或者拦截。 优点 * 模块不负责生成验证码和验证页面,所以不会增加过多的代码复杂度。 * 验证码页面是灵活的,不是模块内部写死的,可以根据业务场景自己决定。 * 由于验证码图片也不是写死的,可以通过外部方式提前生成一些验证码图片(比如生成 10w 个),避免了临时生成的性能损耗,因为临时生成肯定要先将图片写入磁盘,尽量要避免 IO。 * 扩展性较好。因为模块只负责跳转和检查,所以后续如果使用其它类型的验证码如拖动验证码也不会引起大量的代码改动。 缺点 * 这是一个不向下兼容的更新,所以要慎重考虑。因为如果添加后再删除会再引起一次不向下兼容的更新。 * 可能会引入更多的配置,同样要慎重考虑。 * 把一些工作转移给了模块用户。 ― You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub<#13 (comment)>, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AGEZXHMIJT46Q54GGPCGZN3SVA32LANCNFSM4U2FISQQ.

CC 防护并不是每分钟检查一次,而是一分钟内超过指定一次数自动拉黑,并不会等待一分钟过去后再检查。

提供验证码的次数可以限制。


CC 防护没到时间就请求到了后端。

这段话的意思是 CC 拉黑时间还没结束的时候,请求就已经到后端而不是被拦截了?

<!-- gh-comment-id:745936982 --> @ADD-SP commented on GitHub (Dec 16, 2020): > > 感觉干脆就外部接入一个程序也挺好。触发 CC 防护时,可能也要加上速率限制,提供验证码页面的次数不能不限制,会成为攻击点。还有现在是分钟,细粒度是不是不够,面对 CC 攻击都是秒级别的多。使用最简单配置测试的时候也发现 CC 防护没到时间就请求到了后端。 nginx 配置 server { listen 80; server_name localhost 127.0.0.1; waf on; waf_mode STD; waf_cc_deny_limit 5 1; location / { index index.html; } } 测试脚本 for i in `seq 1 20`;do date echo $i curl http://127.0.0.1 echo done > […](#) > ________________________________ 发件人: ADD-SP <notifications@github.com> 发送时间: 2020年12月16日 12:48 收件人: ADD-SP/ngx_waf <ngx_waf@noreply.github.com> 抄送: toyops <volqiu@live.com>; Author <author@noreply.github.com> 主题: Re: [ADD-SP/ngx_waf] CC 防护增加验证码访问功能 (#13) 想到一种作为项目作者可能可以接受实现方式,贴出来讨论一下,或者改进,或者否决。 实现方式 # 含有若干个验证码图片的目录 waf_captcha_path /path/to/captcha; # 指向验证码图片目录的 URL waf_captcha_url /url/to/captcha; # 指向验证码页面的 URL。 waf_captcha_page_url /url/to/captcha/page; # 验证码页面发送 GET 请求到这个 URL,使用 GET 参数传递用户输入的验证码的值和验证成功后要跳转到的 URL。 waf_captcha_check_url /url/to/captcha/check; * 模块不负责生成验证码以及验证码页面,而是通过配置指令来指定包含有验证码的目录和验证码界面的 URL。 * 验证码页面通过读取指定的 GET 参数来获取验证码图片的 URL 并显示。 * 触发 CC 防护时会自动重定向到验证码页面,页面将用户的输入发送到指定的 URL,然后由本模块检查决定放行或者拦截。 优点 * 模块不负责生成验证码和验证页面,所以不会增加过多的代码复杂度。 * 验证码页面是灵活的,不是模块内部写死的,可以根据业务场景自己决定。 * 由于验证码图片也不是写死的,可以通过外部方式提前生成一些验证码图片(比如生成 10w 个),避免了临时生成的性能损耗,因为临时生成肯定要先将图片写入磁盘,尽量要避免 IO。 * 扩展性较好。因为模块只负责跳转和检查,所以后续如果使用其它类型的验证码如拖动验证码也不会引起大量的代码改动。 缺点 * 这是一个不向下兼容的更新,所以要慎重考虑。因为如果添加后再删除会再引起一次不向下兼容的更新。 * 可能会引入更多的配置,同样要慎重考虑。 * 把一些工作转移给了模块用户。 ― You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub<[#13 (comment)](https://github.com/ADD-SP/ngx_waf/issues/13#issuecomment-745761582)>, or unsubscribe<https://github.com/notifications/unsubscribe-auth/AGEZXHMIJT46Q54GGPCGZN3SVA32LANCNFSM4U2FISQQ>. CC 防护并不是每分钟检查一次,而是一分钟内超过指定一次数自动拉黑,并不会等待一分钟过去后再检查。 提供验证码的次数可以限制。 *** > CC 防护没到时间就请求到了后端。 这段话的意思是 CC 拉黑时间还没结束的时候,请求就已经到后端而不是被拦截了?
Author
Owner

@toyops commented on GitHub (Dec 16, 2020):

感觉干脆就外部接入一个程序也挺好。触发 CC 防护时,可能也要加上速率限制,提供验证码页面的次数不能不限制,会成为攻击点。还有现在是分钟,细粒度是不是不够,面对 CC 攻击都是秒级别的多。使用最简单配置测试的时候也发现 CC 防护没到时间就请求到了后端。 nginx 配置 server { listen 80; server_name localhost 127.0.0.1; waf on; waf_mode STD; waf_cc_deny_limit 5 1; location / { index index.html; } } 测试脚本 for i in seq 1 20;do date echo $i curl http://127.0.0.1 echo done

________________________________ 发件人: ADD-SP notifications@github.com 发送时间: 2020年12月16日 12:48 收件人: ADD-SP/ngx_waf ngx_waf@noreply.github.com 抄送: toyops volqiu@live.com; Author author@noreply.github.com 主题: Re: [ADD-SP/ngx_waf] CC 防护增加验证码访问功能 (#13) 想到一种作为项目作者可能可以接受实现方式,贴出来讨论一下,或者改进,或者否决。 实现方式 # 含有若干个验证码图片的目录 waf_captcha_path /path/to/captcha; # 指向验证码图片目录的 URL waf_captcha_url /url/to/captcha; # 指向验证码页面的 URL。 waf_captcha_page_url /url/to/captcha/page; # 验证码页面发送 GET 请求到这个 URL,使用 GET 参数传递用户输入的验证码的值和验证成功后要跳转到的 URL。 waf_captcha_check_url /url/to/captcha/check; * 模块不负责生成验证码以及验证码页面,而是通过配置指令来指定包含有验证码的目录和验证码界面的 URL。 * 验证码页面通过读取指定的 GET 参数来获取验证码图片的 URL 并显示。 * 触发 CC 防护时会自动重定向到验证码页面,页面将用户的输入发送到指定的 URL,然后由本模块检查决定放行或者拦截。 优点 * 模块不负责生成验证码和验证页面,所以不会增加过多的代码复杂度。 * 验证码页面是灵活的,不是模块内部写死的,可以根据业务场景自己决定。 * 由于验证码图片也不是写死的,可以通过外部方式提前生成一些验证码图片(比如生成 10w 个),避免了临时生成的性能损耗,因为临时生成肯定要先将图片写入磁盘,尽量要避免 IO。 * 扩展性较好。因为模块只负责跳转和检查,所以后续如果使用其它类型的验证码如拖动验证码也不会引起大量的代码改动。 缺点 * 这是一个不向下兼容的更新,所以要慎重考虑。因为如果添加后再删除会再引起一次不向下兼容的更新。 * 可能会引入更多的配置,同样要慎重考虑。 * 把一些工作转移给了模块用户。 ― You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub<#13 (comment)>, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AGEZXHMIJT46Q54GGPCGZN3SVA32LANCNFSM4U2FISQQ.

CC 防护并不是每分钟检查一次,而是一分钟内超过指定一次数自动拉黑,并不会等待一分钟过去后再检查。

提供验证码的次数可以限制。

CC 防护没到时间就请求到了后端。

这段话的意思是 CC 拉黑时间还没结束的时候,请求就已经到后端而不是被拦截了?

是的,我这边跑出来的结果有些问题。具体日志我发你邮箱吧。

<!-- gh-comment-id:745986712 --> @toyops commented on GitHub (Dec 16, 2020): > > 感觉干脆就外部接入一个程序也挺好。触发 CC 防护时,可能也要加上速率限制,提供验证码页面的次数不能不限制,会成为攻击点。还有现在是分钟,细粒度是不是不够,面对 CC 攻击都是秒级别的多。使用最简单配置测试的时候也发现 CC 防护没到时间就请求到了后端。 nginx 配置 server { listen 80; server_name localhost 127.0.0.1; waf on; waf_mode STD; waf_cc_deny_limit 5 1; location / { index index.html; } } 测试脚本 for i in `seq 1 20`;do date echo $i curl http://127.0.0.1 echo done > > […](#) > > ________________________________ 发件人: ADD-SP [notifications@github.com](mailto:notifications@github.com) 发送时间: 2020年12月16日 12:48 收件人: ADD-SP/ngx_waf [ngx_waf@noreply.github.com](mailto:ngx_waf@noreply.github.com) 抄送: toyops [volqiu@live.com](mailto:volqiu@live.com); Author [author@noreply.github.com](mailto:author@noreply.github.com) 主题: Re: [ADD-SP/ngx_waf] CC 防护增加验证码访问功能 (#13) 想到一种作为项目作者可能可以接受实现方式,贴出来讨论一下,或者改进,或者否决。 实现方式 # 含有若干个验证码图片的目录 waf_captcha_path /path/to/captcha; # 指向验证码图片目录的 URL waf_captcha_url /url/to/captcha; # 指向验证码页面的 URL。 waf_captcha_page_url /url/to/captcha/page; # 验证码页面发送 GET 请求到这个 URL,使用 GET 参数传递用户输入的验证码的值和验证成功后要跳转到的 URL。 waf_captcha_check_url /url/to/captcha/check; * 模块不负责生成验证码以及验证码页面,而是通过配置指令来指定包含有验证码的目录和验证码界面的 URL。 * 验证码页面通过读取指定的 GET 参数来获取验证码图片的 URL 并显示。 * 触发 CC 防护时会自动重定向到验证码页面,页面将用户的输入发送到指定的 URL,然后由本模块检查决定放行或者拦截。 优点 * 模块不负责生成验证码和验证页面,所以不会增加过多的代码复杂度。 * 验证码页面是灵活的,不是模块内部写死的,可以根据业务场景自己决定。 * 由于验证码图片也不是写死的,可以通过外部方式提前生成一些验证码图片(比如生成 10w 个),避免了临时生成的性能损耗,因为临时生成肯定要先将图片写入磁盘,尽量要避免 IO。 * 扩展性较好。因为模块只负责跳转和检查,所以后续如果使用其它类型的验证码如拖动验证码也不会引起大量的代码改动。 缺点 * 这是一个不向下兼容的更新,所以要慎重考虑。因为如果添加后再删除会再引起一次不向下兼容的更新。 * 可能会引入更多的配置,同样要慎重考虑。 * 把一些工作转移给了模块用户。 ― You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub<[#13 (comment)](https://github.com/ADD-SP/ngx_waf/issues/13#issuecomment-745761582)>, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AGEZXHMIJT46Q54GGPCGZN3SVA32LANCNFSM4U2FISQQ. > > CC 防护并不是每分钟检查一次,而是一分钟内超过指定一次数自动拉黑,并不会等待一分钟过去后再检查。 > > 提供验证码的次数可以限制。 > > > CC 防护没到时间就请求到了后端。 > > 这段话的意思是 CC 拉黑时间还没结束的时候,请求就已经到后端而不是被拦截了? 是的,我这边跑出来的结果有些问题。具体日志我发你邮箱吧。
Author
Owner

@ADD-SP commented on GitHub (Dec 16, 2020):

感觉干脆就外部接入一个程序也挺好。触发 CC 防护时,可能也要加上速率限制,提供验证码页面的次数不能不限制,会成为攻击点。还有现在是分钟,细粒度是不是不够,面对 CC 攻击都是秒级别的多。使用最简单配置测试的时候也发现 CC 防护没到时间就请求到了后端。 nginx 配置 server { listen 80; server_name localhost 127.0.0.1; waf on; waf_mode STD; waf_cc_deny_limit 5 1; location / { index index.html; } } 测试脚本 for i in seq 1 20;do date echo $i curl http://127.0.0.1 echo done

________________________________ 发件人: ADD-SP notifications@github.com 发送时间: 2020年12月16日 12:48 收件人: ADD-SP/ngx_waf ngx_waf@noreply.github.com 抄送: toyops volqiu@live.com; Author author@noreply.github.com 主题: Re: [ADD-SP/ngx_waf] CC 防护增加验证码访问功能 (#13) 想到一种作为项目作者可能可以接受实现方式,贴出来讨论一下,或者改进,或者否决。 实现方式 # 含有若干个验证码图片的目录 waf_captcha_path /path/to/captcha; # 指向验证码图片目录的 URL waf_captcha_url /url/to/captcha; # 指向验证码页面的 URL。 waf_captcha_page_url /url/to/captcha/page; # 验证码页面发送 GET 请求到这个 URL,使用 GET 参数传递用户输入的验证码的值和验证成功后要跳转到的 URL。 waf_captcha_check_url /url/to/captcha/check; * 模块不负责生成验证码以及验证码页面,而是通过配置指令来指定包含有验证码的目录和验证码界面的 URL。 * 验证码页面通过读取指定的 GET 参数来获取验证码图片的 URL 并显示。 * 触发 CC 防护时会自动重定向到验证码页面,页面将用户的输入发送到指定的 URL,然后由本模块检查决定放行或者拦截。 优点 * 模块不负责生成验证码和验证页面,所以不会增加过多的代码复杂度。 * 验证码页面是灵活的,不是模块内部写死的,可以根据业务场景自己决定。 * 由于验证码图片也不是写死的,可以通过外部方式提前生成一些验证码图片(比如生成 10w 个),避免了临时生成的性能损耗,因为临时生成肯定要先将图片写入磁盘,尽量要避免 IO。 * 扩展性较好。因为模块只负责跳转和检查,所以后续如果使用其它类型的验证码如拖动验证码也不会引起大量的代码改动。 缺点 * 这是一个不向下兼容的更新,所以要慎重考虑。因为如果添加后再删除会再引起一次不向下兼容的更新。 * 可能会引入更多的配置,同样要慎重考虑。 * 把一些工作转移给了模块用户。 ― You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub<#13 (comment)>, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AGEZXHMIJT46Q54GGPCGZN3SVA32LANCNFSM4U2FISQQ.

CC 防护并不是每分钟检查一次,而是一分钟内超过指定一次数自动拉黑,并不会等待一分钟过去后再检查。
提供验证码的次数可以限制。

CC 防护没到时间就请求到了后端。

这段话的意思是 CC 拉黑时间还没结束的时候,请求就已经到后端而不是被拦截了?

是的,我这边跑出来的结果有些问题。具体日志我发你邮箱吧。

请查收邮件。

<!-- gh-comment-id:746242637 --> @ADD-SP commented on GitHub (Dec 16, 2020): > > > 感觉干脆就外部接入一个程序也挺好。触发 CC 防护时,可能也要加上速率限制,提供验证码页面的次数不能不限制,会成为攻击点。还有现在是分钟,细粒度是不是不够,面对 CC 攻击都是秒级别的多。使用最简单配置测试的时候也发现 CC 防护没到时间就请求到了后端。 nginx 配置 server { listen 80; server_name localhost 127.0.0.1; waf on; waf_mode STD; waf_cc_deny_limit 5 1; location / { index index.html; } } 测试脚本 for i in `seq 1 20`;do date echo $i curl http://127.0.0.1 echo done > > > […](#) > > > ________________________________ 发件人: ADD-SP [notifications@github.com](mailto:notifications@github.com) 发送时间: 2020年12月16日 12:48 收件人: ADD-SP/ngx_waf [ngx_waf@noreply.github.com](mailto:ngx_waf@noreply.github.com) 抄送: toyops [volqiu@live.com](mailto:volqiu@live.com); Author [author@noreply.github.com](mailto:author@noreply.github.com) 主题: Re: [ADD-SP/ngx_waf] CC 防护增加验证码访问功能 (#13) 想到一种作为项目作者可能可以接受实现方式,贴出来讨论一下,或者改进,或者否决。 实现方式 # 含有若干个验证码图片的目录 waf_captcha_path /path/to/captcha; # 指向验证码图片目录的 URL waf_captcha_url /url/to/captcha; # 指向验证码页面的 URL。 waf_captcha_page_url /url/to/captcha/page; # 验证码页面发送 GET 请求到这个 URL,使用 GET 参数传递用户输入的验证码的值和验证成功后要跳转到的 URL。 waf_captcha_check_url /url/to/captcha/check; * 模块不负责生成验证码以及验证码页面,而是通过配置指令来指定包含有验证码的目录和验证码界面的 URL。 * 验证码页面通过读取指定的 GET 参数来获取验证码图片的 URL 并显示。 * 触发 CC 防护时会自动重定向到验证码页面,页面将用户的输入发送到指定的 URL,然后由本模块检查决定放行或者拦截。 优点 * 模块不负责生成验证码和验证页面,所以不会增加过多的代码复杂度。 * 验证码页面是灵活的,不是模块内部写死的,可以根据业务场景自己决定。 * 由于验证码图片也不是写死的,可以通过外部方式提前生成一些验证码图片(比如生成 10w 个),避免了临时生成的性能损耗,因为临时生成肯定要先将图片写入磁盘,尽量要避免 IO。 * 扩展性较好。因为模块只负责跳转和检查,所以后续如果使用其它类型的验证码如拖动验证码也不会引起大量的代码改动。 缺点 * 这是一个不向下兼容的更新,所以要慎重考虑。因为如果添加后再删除会再引起一次不向下兼容的更新。 * 可能会引入更多的配置,同样要慎重考虑。 * 把一些工作转移给了模块用户。 ― You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub<[#13 (comment)](https://github.com/ADD-SP/ngx_waf/issues/13#issuecomment-745761582)>, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AGEZXHMIJT46Q54GGPCGZN3SVA32LANCNFSM4U2FISQQ. > > > > > > CC 防护并不是每分钟检查一次,而是一分钟内超过指定一次数自动拉黑,并不会等待一分钟过去后再检查。 > > 提供验证码的次数可以限制。 > > > CC 防护没到时间就请求到了后端。 > > > > > > 这段话的意思是 CC 拉黑时间还没结束的时候,请求就已经到后端而不是被拦截了? > > 是的,我这边跑出来的结果有些问题。具体日志我发你邮箱吧。 请查收邮件。
Author
Owner

@ADD-SP commented on GitHub (Dec 17, 2020):

我拍脑袋想到了另外一个实现方式,思考得不多,不过首先需要说明下面几条,这是本功能设计的原则。

  1. 本模块不会负责验证码和验证页面的生成,只负责验证和拦截工作。
  2. 模块需要通过某些方式验证验证码是否正确,但不需要过多复杂的步骤。

实现方式见下文,可以就改进,不行就否决

实现方式

配置语法

# 是否启用验证码
waf_captcha on;
# 验证码页面发送 GET 请求到这个 URL,使用 GET 参数传递用户输入的验证码的值和验证成功后要跳转到的 URL。
waf_captcha_check_url /url/to/captcha/check;

验证过程

假设为字符串形式的验证码。

  1. 条件满足的时候模块自动跳转到验证码页面。
  2. 验证码页面的全部内容由外部生成,模块不负责任何内容。
  3. 验证码页面把正确的验证码的哈希值和用户输入的验证码通过 GET/POST 请求发送到指定的 URL,这个 URL 的请求会被模块读取并启动检查。
  4. 模块计算用户输入的验证码的哈希值,并和正确的哈希值对比。
  5. 哈希值相同则模块会返回成功信息,反之返回失败信息。
  6. 验证码页面根据模块返回的信息决定下一步操作。

优点

  • 模块彻底从验证码的生成中解放出来,仅仅只负责验证和拦截工作。
  • 验证码页面发送的请求并不会暴露正确的验证码,因为根据哈希值反推原文是很难的。

缺点

  • 可能难以支持非字符串类型的验证码比如拖动和点击类型的验证。
  • 肯定还有别的,只是想不到。
<!-- gh-comment-id:747543933 --> @ADD-SP commented on GitHub (Dec 17, 2020): 我拍脑袋想到了另外一个实现方式,思考得不多,不过首先需要说明下面几条,这是本功能设计的原则。 1. 本模块不会负责验证码和验证页面的生成,只负责验证和拦截工作。 2. 模块需要通过某些方式验证验证码是否正确,但不需要过多复杂的步骤。 *** 实现方式见下文,**可以就改进,不行就否决**。 ## 实现方式 ### 配置语法 ```conf # 是否启用验证码 waf_captcha on; # 验证码页面发送 GET 请求到这个 URL,使用 GET 参数传递用户输入的验证码的值和验证成功后要跳转到的 URL。 waf_captcha_check_url /url/to/captcha/check; ``` ### 验证过程 假设为字符串形式的验证码。 1. 条件满足的时候模块自动跳转到验证码页面。 2. 验证码页面的全部内容由外部生成,模块不负责任何内容。 3. 验证码页面把正确的验证码的哈希值和用户输入的验证码通过 GET/POST 请求发送到指定的 URL,这个 URL 的请求会被模块读取并启动检查。 4. 模块计算用户输入的验证码的哈希值,并和正确的哈希值对比。 5. 哈希值相同则模块会返回成功信息,反之返回失败信息。 6. 验证码页面根据模块返回的信息决定下一步操作。 ### 优点 * 模块彻底从验证码的生成中解放出来,仅仅只负责验证和拦截工作。 * 验证码页面发送的请求并不会暴露正确的验证码,因为根据哈希值反推原文是很难的。 ## 缺点 * 可能难以支持非字符串类型的验证码比如拖动和点击类型的验证。 * 肯定还有别的,只是想不到。
Author
Owner

@ADD-SP commented on GitHub (Dec 18, 2020):

突然发现不太对,既然验证码的生成都交给业务代码了,为什么不直接在业务代码里实现验证码,把验证工作交给模块是画蛇添足了。

<!-- gh-comment-id:747829882 --> @ADD-SP commented on GitHub (Dec 18, 2020): 突然发现不太对,既然验证码的生成都交给业务代码了,为什么不直接在业务代码里实现验证码,把验证工作交给模块是画蛇添足了。
Author
Owner

@ADD-SP commented on GitHub (Dec 18, 2020):

本模块设计原则是简单而不是复杂,所以需要将验证码的生成工作交给外部,但是既然验证码的生成已经交给外部了为什么不把验证也一起交给外部呢?把验证过程单独交给模块有些画蛇添足的意思,所以不如不添加这个功能。

所以暂时不考虑添加这个功能,如果有关于这个功能有其它想法可以继续在这里留言讨论。三天后如果没有收到留言我就关掉这个 issue 了。

<!-- gh-comment-id:747835434 --> @ADD-SP commented on GitHub (Dec 18, 2020): 本模块设计原则是简单而不是复杂,所以需要将验证码的生成工作交给外部,但是既然验证码的生成已经交给外部了为什么不把验证也一起交给外部呢?把验证过程单独交给模块有些画蛇添足的意思,所以不如不添加这个功能。 所以暂时不考虑添加这个功能,如果有关于这个功能有其它想法可以继续在这里留言讨论。三天后如果没有收到留言我就关掉这个 issue 了。
Author
Owner

@toyops commented on GitHub (Dec 18, 2020):

给业务模块生成肯定有一个效率问题,而且会有流量导入到后端,但你 CC 防护已经拒绝用户访问了,不提供验证码就只能等待超时放出了,所以在 CC 防护这里提供验证码放行的功能是可以接受的。

<!-- gh-comment-id:747836368 --> @toyops commented on GitHub (Dec 18, 2020): 给业务模块生成肯定有一个效率问题,而且会有流量导入到后端,但你 CC 防护已经拒绝用户访问了,不提供验证码就只能等待超时放出了,所以在 CC 防护这里提供验证码放行的功能是可以接受的。
Author
Owner

@ADD-SP commented on GitHub (Dec 18, 2020):

给业务模块生成肯定有一个效率问题,而且会有流量导入到后端,但你 CC 防护已经拒绝用户访问了,不提供验证码就只能等待超时放出了,所以在 CC 防护这里提供验证码放行的功能是可以接受的。

其实主要矛盾是实现方式的问题,模块最好不要负责验证码生成,但是交给外部必然带来模块用户的不方便。昨晚提到的实现方式有什么看法么?

<!-- gh-comment-id:747837629 --> @ADD-SP commented on GitHub (Dec 18, 2020): > > > 给业务模块生成肯定有一个效率问题,而且会有流量导入到后端,但你 CC 防护已经拒绝用户访问了,不提供验证码就只能等待超时放出了,所以在 CC 防护这里提供验证码放行的功能是可以接受的。 其实主要矛盾是实现方式的问题,模块最好不要负责验证码生成,但是交给外部必然带来模块用户的不方便。**昨晚提到的实现方式有什么看法么?**
Author
Owner

@toyops commented on GitHub (Dec 18, 2020):

给业务模块生成肯定有一个效率问题,而且会有流量导入到后端,但你 CC 防护已经拒绝用户访问了,不提供验证码就只能等待超时放出了,所以在 CC 防护这里提供验证码放行的功能是可以接受的。

其实主要矛盾是实现方式的问题,模块最好不要负责验证码生成,但是交给外部必然带来模块用户的不方便。昨晚提到的实现方式有什么看法么?

和外部模块确实只需要一个转跳功能或者反向代理,以及一个放行状态的维护和交互,就可以了。检测到触发 CC 规则,则一直转跳反向代理到 外部模块,外部模块验证通过后,发送通知,通知 waf 解除这个状态,waf 予以放行。

<!-- gh-comment-id:747841100 --> @toyops commented on GitHub (Dec 18, 2020): > > 给业务模块生成肯定有一个效率问题,而且会有流量导入到后端,但你 CC 防护已经拒绝用户访问了,不提供验证码就只能等待超时放出了,所以在 CC 防护这里提供验证码放行的功能是可以接受的。 > > 其实主要矛盾是实现方式的问题,模块最好不要负责验证码生成,但是交给外部必然带来模块用户的不方便。**昨晚提到的实现方式有什么看法么?** 和外部模块确实只需要一个转跳功能或者反向代理,以及一个放行状态的维护和交互,就可以了。检测到触发 CC 规则,则一直转跳反向代理到 外部模块,外部模块验证通过后,发送通知,通知 waf 解除这个状态,waf 予以放行。
Author
Owner

@ADD-SP commented on GitHub (Dec 18, 2020):

给业务模块生成肯定有一个效率问题,而且会有流量导入到后端,但你 CC 防护已经拒绝用户访问了,不提供验证码就只能等待超时放出了,所以在 CC 防护这里提供验证码放行的功能是可以接受的。

其实主要矛盾是实现方式的问题,模块最好不要负责验证码生成,但是交给外部必然带来模块用户的不方便。昨晚提到的实现方式有什么看法么?

和外部模块确实只需要一个转跳功能或者反向代理,以及一个放行状态的维护和交互,就可以了。检测到触发 CC 规则,则一直转跳反向代理到 外部模块,外部模块验证通过后,发送通知,通知 waf 解除这个状态,waf 予以放行。

看起来我的想法被大致接受了。我确认一下。

  1. 条件满足的时候本模块自动跳转到验证码页面(不负责生成)。
  2. 页面将用户的输入内容和正确的内容的哈希值发送到指定的 URL。
  3. 模块读取这个 URL 的请求并作验证。
  4. 根据验证结果返回相对的信息,同时改变 CC 防护的装填。
  5. 验证码页面根据返回信息决定下一步操作。

同时如果想直接拦截某个 IP 也可以通过直接访问指定的 URL 来实现,只要哈希值计算出来不相同模块就会自动改变 CC 防护的状态。

以上内容有什么意见么?

<!-- gh-comment-id:747842431 --> @ADD-SP commented on GitHub (Dec 18, 2020): > > > > > 给业务模块生成肯定有一个效率问题,而且会有流量导入到后端,但你 CC 防护已经拒绝用户访问了,不提供验证码就只能等待超时放出了,所以在 CC 防护这里提供验证码放行的功能是可以接受的。 > > > > > > 其实主要矛盾是实现方式的问题,模块最好不要负责验证码生成,但是交给外部必然带来模块用户的不方便。**昨晚提到的实现方式有什么看法么?** > > 和外部模块确实只需要一个转跳功能或者反向代理,以及一个放行状态的维护和交互,就可以了。检测到触发 CC 规则,则一直转跳反向代理到 外部模块,外部模块验证通过后,发送通知,通知 waf 解除这个状态,waf 予以放行。 看起来我的想法被大致接受了。我确认一下。 1. 条件满足的时候本模块自动跳转到验证码页面(不负责生成)。 2. 页面将用户的输入内容和正确的内容的哈希值发送到指定的 URL。 3. 模块读取这个 URL 的请求并作验证。 4. 根据验证结果返回相对的信息,同时改变 CC 防护的装填。 5. 验证码页面根据返回信息决定下一步操作。 同时如果想直接拦截某个 IP 也可以通过直接访问指定的 URL 来实现,只要哈希值计算出来不相同模块就会自动改变 CC 防护的状态。 **以上内容有什么意见么?**
Author
Owner

@toyops commented on GitHub (Dec 18, 2020):

给业务模块生成肯定有一个效率问题,而且会有流量导入到后端,但你 CC 防护已经拒绝用户访问了,不提供验证码就只能等待超时放出了,所以在 CC 防护这里提供验证码放行的功能是可以接受的。

其实主要矛盾是实现方式的问题,模块最好不要负责验证码生成,但是交给外部必然带来模块用户的不方便。昨晚提到的实现方式有什么看法么?

和外部模块确实只需要一个转跳功能或者反向代理,以及一个放行状态的维护和交互,就可以了。检测到触发 CC 规则,则一直转跳反向代理到 外部模块,外部模块验证通过后,发送通知,通知 waf 解除这个状态,waf 予以放行。

看起来我的想法被大致接受了。我确认一下。

1. 条件满足的时候本模块自动跳转到验证码页面(不负责生成)。

2. 页面将用户的输入内容和正确的内容的哈希值发送到指定的 URL。

3. 模块读取这个 URL 的请求并作验证。

4. 根据验证结果返回相对的信息,同时改变 CC 防护的装填。

5. 验证码页面根据返回信息决定下一步操作。

同时如果想直接拦截某个 IP 也可以通过直接访问指定的 URL 来实现,只要哈希值计算出来不相同模块就会自动改变 CC 防护的状态。

以上内容有什么意见么?

没有,就是外部模块谁来写的问题。

<!-- gh-comment-id:747857063 --> @toyops commented on GitHub (Dec 18, 2020): > > > > 给业务模块生成肯定有一个效率问题,而且会有流量导入到后端,但你 CC 防护已经拒绝用户访问了,不提供验证码就只能等待超时放出了,所以在 CC 防护这里提供验证码放行的功能是可以接受的。 > > > > > > > > > 其实主要矛盾是实现方式的问题,模块最好不要负责验证码生成,但是交给外部必然带来模块用户的不方便。**昨晚提到的实现方式有什么看法么?** > > > > > > 和外部模块确实只需要一个转跳功能或者反向代理,以及一个放行状态的维护和交互,就可以了。检测到触发 CC 规则,则一直转跳反向代理到 外部模块,外部模块验证通过后,发送通知,通知 waf 解除这个状态,waf 予以放行。 > > 看起来我的想法被大致接受了。我确认一下。 > > 1. 条件满足的时候本模块自动跳转到验证码页面(不负责生成)。 > > 2. 页面将用户的输入内容和正确的内容的哈希值发送到指定的 URL。 > > 3. 模块读取这个 URL 的请求并作验证。 > > 4. 根据验证结果返回相对的信息,同时改变 CC 防护的装填。 > > 5. 验证码页面根据返回信息决定下一步操作。 > > > 同时如果想直接拦截某个 IP 也可以通过直接访问指定的 URL 来实现,只要哈希值计算出来不相同模块就会自动改变 CC 防护的状态。 > > **以上内容有什么意见么?** 没有,就是外部模块谁来写的问题。
Author
Owner

@ADD-SP commented on GitHub (Dec 18, 2020):

给业务模块生成肯定有一个效率问题,而且会有流量导入到后端,但你 CC 防护已经拒绝用户访问了,不提供验证码就只能等待超时放出了,所以在 CC 防护这里提供验证码放行的功能是可以接受的。

其实主要矛盾是实现方式的问题,模块最好不要负责验证码生成,但是交给外部必然带来模块用户的不方便。昨晚提到的实现方式有什么看法么?

和外部模块确实只需要一个转跳功能或者反向代理,以及一个放行状态的维护和交互,就可以了。检测到触发 CC 规则,则一直转跳反向代理到 外部模块,外部模块验证通过后,发送通知,通知 waf 解除这个状态,waf 予以放行。

看起来我的想法被大致接受了。我确认一下。

1. 条件满足的时候本模块自动跳转到验证码页面(不负责生成)。

2. 页面将用户的输入内容和正确的内容的哈希值发送到指定的 URL。

3. 模块读取这个 URL 的请求并作验证。

4. 根据验证结果返回相对的信息,同时改变 CC 防护的装填。

5. 验证码页面根据返回信息决定下一步操作。

同时如果想直接拦截某个 IP 也可以通过直接访问指定的 URL 来实现,只要哈希值计算出来不相同模块就会自动改变 CC 防护的状态。
以上内容有什么意见么?

没有,就是外部模块谁来写的问题。

不一定需要模块,只要指定的 URL 能跳转到验证码页面就行,并且验证码页面能按照本模块的约定发送请求和接收响应即可。所以 URL 甚至可以直接指向一个静态页面,那个静态页面再通过某些方式获取验证码信息。

<!-- gh-comment-id:747857715 --> @ADD-SP commented on GitHub (Dec 18, 2020): > > > > > > > 给业务模块生成肯定有一个效率问题,而且会有流量导入到后端,但你 CC 防护已经拒绝用户访问了,不提供验证码就只能等待超时放出了,所以在 CC 防护这里提供验证码放行的功能是可以接受的。 > > > > > > > > > > > > 其实主要矛盾是实现方式的问题,模块最好不要负责验证码生成,但是交给外部必然带来模块用户的不方便。**昨晚提到的实现方式有什么看法么?** > > > > > > > > > 和外部模块确实只需要一个转跳功能或者反向代理,以及一个放行状态的维护和交互,就可以了。检测到触发 CC 规则,则一直转跳反向代理到 外部模块,外部模块验证通过后,发送通知,通知 waf 解除这个状态,waf 予以放行。 > > > > > > 看起来我的想法被大致接受了。我确认一下。 > > ``` > > 1. 条件满足的时候本模块自动跳转到验证码页面(不负责生成)。 > > > > 2. 页面将用户的输入内容和正确的内容的哈希值发送到指定的 URL。 > > > > 3. 模块读取这个 URL 的请求并作验证。 > > > > 4. 根据验证结果返回相对的信息,同时改变 CC 防护的装填。 > > > > 5. 验证码页面根据返回信息决定下一步操作。 > > ``` > > > > > > 同时如果想直接拦截某个 IP 也可以通过直接访问指定的 URL 来实现,只要哈希值计算出来不相同模块就会自动改变 CC 防护的状态。 > > **以上内容有什么意见么?** > > 没有,就是外部模块谁来写的问题。 不一定需要模块,只要指定的 URL 能跳转到验证码页面就行,并且验证码页面能按照本模块的约定发送请求和接收响应即可。所以 URL 甚至可以直接指向一个静态页面,那个静态页面再通过某些方式获取验证码信息。
Author
Owner

@ADD-SP commented on GitHub (Dec 18, 2020):

突然发现我的方式并不安全,提交给模块检查的 URL 最好还是不要暴露,也就是说检查验证码的请求必须由后端代码发出,不过总归方法还不至于被否决。

话说为什么不直接接入成熟的验证码平台呢?

<!-- gh-comment-id:747862247 --> @ADD-SP commented on GitHub (Dec 18, 2020): 突然发现我的方式并不安全,提交给模块检查的 URL 最好还是不要暴露,也就是说检查验证码的请求必须由后端代码发出,不过总归方法还不至于被否决。 话说为什么不直接接入成熟的验证码平台呢?
Author
Owner

@ADD-SP commented on GitHub (Dec 18, 2020):

否决上次的解决方式,原因是因为 NGINX 的进程模型。

NGINX 启动时会由 master 进程 fork 出多个 worker 进程,然后由 worker 进程负责处理每一个请求。

当一个请求过来的时候会被分配到某一个 worker 进程内,此进程会处理这个请求,本模块也就在此时进行验证操作,并改变 CC 防护的状态。但是多个 worker 进程间模块的上下文不是共享的,所以会导致某个 worker 进程内的模块改变了 CC 防护状态,但是其它 worker 进程内的模块无动于衷的情况。

至于为什么不启用进程间通讯机制来保证模块间同步状态,第一是性能问题,因为多个进程控制同一个信号必然要引入锁。第二是可能会扩大故障范围,一旦某个 worker 进程崩溃,那么它持有的锁可能就永远无法释放,其它的 worker 就会永远无法得到锁从而卡住。第三是不同平台的进程间通讯 API 可能不同,要做多平台适配。

<!-- gh-comment-id:747913298 --> @ADD-SP commented on GitHub (Dec 18, 2020): 否决上次的解决方式,原因是因为 NGINX 的进程模型。 ![](https://user-images.githubusercontent.com/44437200/102584910-5125a280-4142-11eb-8d7f-5ac9290c8f76.jpg) NGINX 启动时会由 master 进程 fork 出多个 worker 进程,然后由 worker 进程负责处理每一个请求。 当一个请求过来的时候会被分配到某一个 worker 进程内,此进程会处理这个请求,本模块也就在此时进行验证操作,并改变 CC 防护的状态。但是多个 worker 进程间模块的上下文不是共享的,所以会导致某个 worker 进程内的模块改变了 CC 防护状态,但是其它 worker 进程内的模块无动于衷的情况。 至于为什么不启用进程间通讯机制来保证模块间同步状态,第一是性能问题,因为多个进程控制同一个信号必然要引入锁。第二是可能会扩大故障范围,一旦某个 worker 进程崩溃,那么它持有的锁可能就永远无法释放,其它的 worker 就会永远无法得到锁从而卡住。第三是不同平台的进程间通讯 API 可能不同,要做多平台适配。
Author
Owner

@ADD-SP commented on GitHub (Dec 18, 2020):

说明一下情况,模块不负责验证码生成,但必须知道验证结果,由于多个 worker 进程间模块上下文不共享,所以需要一种合适的方式保证每个模块都能同步知道验证结果,但是现在没找到。因此对于一个请求可能一个 worker 会放行,而另一个会拦截。

至于验证码的需求,我建议在其它地方实现,本模块目前不打算实现此功能。本 issue 将再开启三天,期间如果没有出现合适的实现方式将关闭本 issue。

<!-- gh-comment-id:747916643 --> @ADD-SP commented on GitHub (Dec 18, 2020): 说明一下情况,模块不负责验证码生成,但必须知道验证结果,由于多个 worker 进程间模块上下文不共享,所以需要一种合适的方式保证每个模块都能同步知道验证结果,但是现在没找到。因此对于一个请求可能一个 worker 会放行,而另一个会拦截。 至于验证码的需求,我建议在其它地方实现,本模块目前不打算实现此功能。本 issue 将再开启三天,期间如果没有出现合适的实现方式将关闭本 issue。
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/ngx_waf#6
No description provided.