You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何防护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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:26:31