- 使用案例:**如果用户超过最大登录尝试次数(5),我的Web应用程序应将用户重定向到401 Lockedout html页面。
- 问题:**一旦所有登录尝试都失败,页面将在6分钟后重定向,而不是立即重定向。这种情况在所有浏览器中都可以观察到。
- 实现方法:**我使用jQuery发送Ajax POST调用来登录。
1.用户输入错误密码并点击登录按钮。页面显示前4次尝试的密码无效。
1.在第5次尝试时,后端代码(cgi)返回HTTP状态代码"303 See Other",URL为:"/重新启动/"
1.我们已经建立了一个名为mod_access的LigHTTPd插件。该插件的工作是检查并返回"303查看其他"代码与URL:如果用户请求任何其他页面(例如主页),在5次尝试失败后,"/errors/en/401lockedout.html "页面作为响应。因此,当浏览器调用/restarting/URL时,mod_access插件将视为未授权请求并发送303。
- 环境和编程语言:**LigHTTPd网络服务器、HTML、jQuery、C++
- 服务器日志分析:**(我跳过前4次尝试的请求,因为第5次尝试在这里很重要)
- 第5次登录请求:**
1980-01-06 02:50:12: (../../lighttpd-1.4.55/src/connections.c.774) fd: 9 request-len: 666 \nPOST /submitLogin/ HTTP/1.1\r\nHost: localhost\r\nConnection: keep-alive\r\nContent-Length: 123\r\nAccept: application/json, text/javascript, /; q=0.01\r\nX-Requested-With: XMLHttpRequest\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.54\r\nContent-Type: application/x-www-form-urlencoded; charset=UTF-8\r\nOrigin: http://localhost\r\nReferer: http://localhost/\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: en-GB,en;q=0.9\r\nCookie: SID=abc; _TESTCOOKIESUPPORT=1; sess=def\r\n\r\n
- CGI应用程序恢复为"303 See Other",位置为/restarting/**
1980年1月6日02时50分13秒:(../../lighttpd-1.4.55/源代码/响应.c.125)响应报头:\nHTTP/1.1 303请参阅其他\r\n位置:/正在重新启动/\ r\n连接:关闭\r\nX内容类型选项:nosniff\r\nX-XSS-保护:1;模式=块\r\n内容长度:992\r\n日期:星期日,1980年1月6日02:50:13 GMT\r\n服务器:XYZ\r\n\r\n 1980年1月6日02:50:13:(../../lighttpd-1.4.55/src/mod_cgi.c.1190)CGI pid 3868已终止,信号为11
- 浏览器发送了/restarting/page的GET请求**
1980-01-06 02:50:13: (../../lighttpd-1.4.55/src/connections.c.774) fd: 9 request-len: 551 \nGET /restarting/ HTTP/1.1\r\nHost: localhost\r\nConnection: keep-alive\r\nAccept: application/json, text/javascript, /; q=0.01\r\nX-Requested-With: XMLHttpRequest\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.54\r\nReferer: http://localhost/\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: en-GB,en;q=0.9\r\nCookie: SID=abc; _TESTCOOKIESUPPORT=1; sess=def\r\n\r\n
- mode_access阻止了请求,并发送了另一个"303 See Other",位置为:本地主机/错误/401锁定。
1980年1月6日02时50分13秒:(../../lighttpd-1.4.55/src/修改访问权限.c.125)锁定已修改为/错误/en/401lockedout.html 1980年1月6日02:50:13:(../../lighttpd-1.4.55/源代码/修改访问.c.322)被阻止的URI:/计算机图形学/用户界面.计算机图形学1980年1月6日02:50:13:(../../lighttpd-1.4.55/src/mod_access.c.323)重定向到锁定页面1980年1月6日02:50:13:(../../lighttpd-1.4.55/源代码/响应.c.125)响应报头:\nHTTP/1.1 303请参阅其他\r\n位置:http://localhost/errors/en/401lockedout.html\r\nX内容类型选项:nosniff\r\nX-XSS-保护:1;模式=块\r\n传输编码:分块\r\n日期:星期日,1980年1月6日02:50:13 GMT\r\n服务器:XYZ\r\n\r\n
服务器未收到请求(来自浏览器开发工具),浏览器未发送401lockedout.html页面的GET请求。
6分钟后,服务器收到浏览器对锁定页面的请求。
1980-01-06 02:56:14: (../../lighttpd-1.4.55/src/connections.c.774) fd: 9 request-len: 646 \nGET /errors/en/401lockedout.htmlHTTP/1.1\r\nHost: localhost\r\nConnection: keep-alive\r\nAccept: application/json, text/javascript, /; q=0.01\r\nX-Requested-With: XMLHttpRequest\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.54\r\nReferer: http://localhost/\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: en-GB,en;q=0.9\r\nCookie: SID=abc; _TESTCOOKIESUPPORT=1; sess=def\r\nIf-None-Match: "1764933797"\r\nIf-Modified-Since: Fri, 16 Dec 2022 08:20:12 GMT\r\n\r\n
1980年1月6日02时56分14秒:(../../lighttpd-1.4.55/源代码/响应.c.125)响应报头:\nHTTP/1.1 304未修改\r\n内容类型:text/html\r\n接受范围:字节\r\nE标记:“1764933797”\r\n上次修改时间:2022年12月16日星期五08:20:12 GMT\r\nX-内容-类型-选项:nosniff\r\nX-XSS-保护:1;模式=块\r\n日期:星期日,1980年1月6日02:56:14 GMT\r\n服务器:XYZ\r\n\r\n
下面是浏览器开发工具x1c 0d1x的代码片段
这以前是有效的,但现在不行了。
我试图找到根本原因并修复它,但无法。任何指针肯定会帮助我修复这个问题。
1条答案
按热度按时间nlejzf6q1#
我们构建了一个名为mod_access的LigHTTPd插件。
你是说你有一个和lighttpd插件(mod_access)同名的定制插件吗?
附带说明:mod_magnet和几行自定义lua代码可能会比自定义C更简单、更可移植,甚至可能更快。
对于您的自定义插件,您很可能没有正确地结束lighttpd内部的响应,因此lighttpd很可能在默认的写空闲超时6分钟到期并且连接关闭时刷新响应。来自lighttpd的mod_access处理程序的响应中的
Transfer-Encoding: chunked\r\n
告诉我,您可能没有告诉lighttpd内部响应已经完成(r->resp_body_finished = 1
)(../../lighttpd-1.4.55/src/mod_cgi.c.1190) CGI pid 3868 died with signal 11
看起来你的CGI也崩溃了。信号11在Linux上是SIGSEGV。
旁白:请回顾一下,当您可以在CGI中处理身份验证策略时,您为什么要编写一个自定义的C插件。为了获得适当的安全性,无论如何,您应该在一个地方处理身份验证策略,作为确保策略强制执行的一部分。
P. S.服务器的正式名称是并且一直是“lighttpd”;从不使用“亮HTTPd”。