如何防护HTTP/0.9规避请求?Flask下拦截旧版本HTTP请求方法问询
关于Flask处理旧版本HTTP请求及异常请求的问题解答
嘿,我来帮你捋捋这个问题!先从你问的两个核心点说起:
一、这些异常请求需要担忧吗?
从你贴的日志来看,这些是HTTP/0.9请求和乱码的无效请求,大多是自动化扫描工具或者脚本在试探你的服务。
- 首先,好消息是:Flask已经自动返回了
400 Bad Request,说明它已经识别到这些不符合规范的请求并拒绝了,暂时不会直接造成危害。 - 但也不能完全掉以轻心:这类扫描通常是攻击者在探测服务的脆弱点(比如旧协议是否存在未修复的漏洞、服务是否有配置错误),如果后续有针对性的攻击,可能会跟着这些试探而来。建议你持续监控日志,尤其是同一个IP频繁发起请求的情况。
二、如何通过Flask自动拒绝HTTP/0.8、HTTP/0.9等旧版本请求?
Flask底层依赖Werkzeug,我们可以通过两种方式在Flask层面拦截旧版本HTTP请求:
方法1:用Flask的before_request钩子(简单易实现)
这个钩子会在每个请求处理前执行,我们可以检查请求的HTTP版本,不符合要求就直接返回400:
from flask import Flask, request, abort app = Flask(__name__) @app.before_request def block_old_http_versions(): # 获取请求使用的HTTP版本,比如"HTTP/1.1"、"HTTP/0.9" http_version = request.environ.get("SERVER_PROTOCOL") # 拒绝HTTP/0.8和HTTP/0.9版本 if http_version in ("HTTP/0.8", "HTTP/0.9"): abort(400, description="Unsupported HTTP version. Please use HTTP/1.0 or later.") # 你的业务路由示例 @app.route("/") def home(): return "Hello World!" if __name__ == "__main__": app.run(host="0.0.0.0", port=5000)
方法2:自定义WSGI中间件(更底层,性能更好)
如果你的服务流量较大,建议用WSGI中间件拦截,它会在请求到达Flask之前就处理,性能更优:
from flask import Flask class OldHTTPBlockerMiddleware: def __init__(self, app): self.app = app def __call__(self, environ, start_response): http_version = environ.get("SERVER_PROTOCOL") if http_version in ("HTTP/0.8", "HTTP/0.9"): # 直接返回400响应,不传递给Flask处理 start_response( "400 Bad Request", [("Content-Type", "text/plain; charset=utf-8")] ) return [b"Unsupported HTTP version. Please use HTTP/1.0 or later."] # 符合要求的请求,交给Flask处理 return self.app(environ, start_response) app = Flask(__name__) # 给Flask添加中间件 app.wsgi_app = OldHTTPBlockerMiddleware(app.wsgi_app) # 业务路由 @app.route("/") def home(): return "Hello World!" if __name__ == "__main__": app.run(host="0.0.0.0", port=5000)
额外建议:前端反向代理拦截(更高效)
如果你用了Nginx或者AWS ALB这类反向代理,建议在代理层就拦截旧版本HTTP请求,这样根本不会让请求打到你的Flask服务,比如Nginx可以加这段配置:
server { # 其他配置... if ($server_protocol ~* "^HTTP/0\.(8|9)$") { return 400; } }
三、额外防护小贴士
- 生产环境绝对不要开Flask的调试模式:调试模式会暴露敏感信息,给攻击者可乘之机。
- 限制可疑IP:如果某个IP频繁发起异常请求,可以通过AWS Security Groups或者Flask的IP黑名单插件(比如
flask-ipfilter)封禁。 - 用AWS WAF增强防护:AWS WAF可以帮你过滤常见的恶意请求,比如SQL注入、XSS,也可以配置规则拦截旧版本HTTP请求。
内容的提问来源于stack exchange,提问作者Kyle Pearson
相关产品推荐
相关产品推荐

