怎样掩护 Flask API 的安全性?

张春  论坛元老 | 2025-1-25 01:11:57 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1031|帖子 1031|积分 3093

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
掩护 Flask API 的安全性至关重要,以防止未经授权的访问、数据泄露和恶意攻击。以下是加强 Flask API 安全性的最佳实践:

1. 使用身份验证和授权

确保 API 只能被授权用户访问:
(1) 使用 JWT (JSON Web Token)

JWT 是常见的身份验证机制,可用于身份验证和用户权限控制。
安装 Flask-JWT-Extended:

  1. pip install Flask-JWT-Extended
复制代码
设置 JWT:

  1. from flask import Flask, jsonify, request
  2. from flask_jwt_extended import create_access_token, jwt_required, get_jwt_identity, JWTManager
  3. app = Flask(__name__)
  4. app.config['JWT_SECRET_KEY'] = 'super-secret-key'
  5. jwt = JWTManager(app)
  6. @app.route('/login', methods=['POST'])
  7. def login():
  8.     username = request.json.get("username")
  9.     password = request.json.get("password")
  10.     if username == "admin" and password == "password":
  11.         token = create_access_token(identity=username)
  12.         return jsonify(access_token=token)
  13.     return jsonify({"msg": "Invalid credentials"}), 401
  14. @app.route('/protected', methods=['GET'])
  15. @jwt_required()
  16. def protected():
  17.     current_user = get_jwt_identity()
  18.     return jsonify(logged_in_as=current_user)
  19. if __name__ == "__main__":
  20.     app.run()
复制代码
示例哀求:
  1. curl -X POST http://127.0.0.1:5000/login -H "Content-Type: application/json" -d '{"username":"admin","password":"password"}'
复制代码

(2) 使用 OAuth 2.0

OAuth 2.0 答应第三方应用步伐访问 API,保举使用如 Auth0、Okta 等服务。
使用 Flask-OAuthlib:

  1. pip install Flask-OAuthlib
复制代码

(3) API 密钥

为每个客户端分配唯一的 API 密钥,并在哀求头中验证。
  1. from flask import request, abort
  2. API_KEYS = {"valid_key_123": "user1"}
  3. @app.before_request
  4. def check_api_key():
  5.     api_key = request.headers.get("X-API-Key")
  6.     if api_key not in API_KEYS:
  7.         abort(401, "Invalid API Key")
复制代码

2. 使用 HTTPS 掩护数据传输

启用 HTTPS 以加密客户端和服务器之间的通信,防止流量嗅探。


  • 在生产情况中,使用 Let’s Encrypt 免费 SSL 证书:
    1. sudo apt install certbot python3-certbot-nginx
    2. sudo certbot --nginx -d yourdomain.com
    复制代码
  • 在 Flask 开辟情况中使用自签名证书:
    1. app.run(ssl_context=('cert.pem', 'key.pem'))
    复制代码

3. 防止 SQL 注入

使用 ORM(SQLAlchemy) 或参数化查询来防止 SQL 注入。
  1. from sqlalchemy.sql import text
  2. def get_user(user_id):
  3.     result = db.session.execute(text("SELECT * FROM users WHERE id=:id"), {"id": user_id})
  4.     return result.fetchall()
复制代码
避免:
  1. # 易受 SQL 注入攻击
  2. cursor.execute("SELECT * FROM users WHERE id = " + user_id)
复制代码

4. 启用 CSRF 掩护

使用 CSRF 令牌防止跨站哀求伪造攻击。
安装 Flask-WTF:

  1. pip install Flask-WTF
复制代码
在 Flask 中启用 CSRF 掩护:

  1. from flask_wtf.csrf import CSRFProtect
  2. csrf = CSRFProtect(app)
  3. app.config['WTF_CSRF_SECRET_KEY'] = 'a-random-secret-key'
复制代码

5. 速率限制(防止暴力攻击)

使用 Flask-Limiter 限制 API 哀求频率,防止暴力攻击。
安装 Flask-Limiter:

  1. pip install Flask-Limiter
复制代码
设置限流:

  1. from flask_limiter import Limiter
  2. from flask_limiter.util import get_remote_address
  3. limiter = Limiter(get_remote_address, app=app, default_limits=["100 per hour"])
  4. @app.route("/login")
  5. @limiter.limit("5 per minute")
  6. def login():
  7.     return "This is a rate-limited endpoint"
复制代码

6. 安全的错误处理

避免暴露敏感的错误信息,同一错误相应。
  1. @app.errorhandler(500)
  2. def internal_error(error):
  3.     return jsonify({"message": "An unexpected error occurred"}), 500
  4. @app.errorhandler(404)
  5. def not_found(error):
  6.     return jsonify({"message": "Resource not found"}), 404
复制代码

7. 禁止调试模式(生产情况)

永久不要在生产情况中启用 debug=True,否则大概导致代码实验漏洞。
  1. if __name__ == '__main__':
  2.     app.run(debug=False)
复制代码

8. 使用 Content Security Policy (CSP)

设置 HTTP 头防止跨站脚本攻击(XSS):
  1. @app.after_request
  2. def set_security_headers(response):
  3.     response.headers["Content-Security-Policy"] = "default-src 'self'"
  4.     response.headers["X-Content-Type-Options"] = "nosniff"
  5.     response.headers["X-Frame-Options"] = "DENY"
  6.     return response
复制代码

9. 输入验证

验证所有用户输入,防止 XSS、SQL 注入等攻击。
使用 Flask-WTForms 验证表单:
  1. from flask_wtf import FlaskForm
  2. from wtforms import StringField
  3. from wtforms.validators import DataRequired
  4. class LoginForm(FlaskForm):
  5.     username = StringField("Username", validators=[DataRequired()])
复制代码

10. 日记与监控

启用日记记载,跟踪 API 调用与错误:
  1. import logging
  2. logging.basicConfig(filename='app.log', level=logging.INFO)
  3. app.logger.info('API Started')
复制代码

11. 禁止不必要的 HTTP 方法

仅答应特定方法访问 API,如 GET、POST。
  1. @app.route("/data", methods=["GET", "POST"])
  2. def data():
  3.     pass
复制代码

12. 使用安全的依赖

定期使用 pip-audit 或 safety 扫描依赖中的安全漏洞:
  1. pip install safety
  2. safety check
复制代码

13. 运行 Flask 应用步伐的安全情况



  • 使用 gunicorn 取代 Flask 内置服务器:
    1. gunicorn -w 4 -b 0.0.0.0:8000 app:app
    复制代码
  • 使用 Docker 将 Flask 应用容器化:
    1. FROM python:3.9
    2. WORKDIR /app
    3. COPY . /app
    4. RUN pip install -r requirements.txt
    5. CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:8000", "app:app"]
    复制代码

14. 主动化测试

编写测试以检测安全漏洞,例如:
  1. def test_login(client):
  2.     response = client.post('/login', json={"username": "admin", "password": "wrong"})
  3.     assert response.status_code == 401
复制代码

总结

要确保 Flask API 安全,应采取以下步伐:

  • 身份验证与授权(JWT、OAuth、API Key)
  • 启用 HTTPS
  • 防止 SQL 注入
  • CSRF/XSS 掩护
  • 速率限制(防止 DDoS)
  • 禁用调试模式
  • 使用日记和监控
  • 最小权限原则
  • 保持依赖最新


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张春

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表