面试题答案
一键面试可能面临的安全问题
- 会话数据泄露:如果会话数据存储在客户端(如使用cookie),并且未进行加密,恶意用户可能窃取并篡改数据。
- 会话劫持:攻击者通过窃取会话ID(例如通过XSS攻击、网络嗅探等),可以冒充合法用户进行操作。
- 会话固定攻击:攻击者预先设定一个已知的会话ID,诱使用户登录,从而劫持会话。
代码层面优化和配置应对方法
- 加密会话数据:
- 使用
Flask - session
扩展,并配置加密密钥。例如:
from flask import Flask from flask_session import Session app = Flask(__name__) app.config['SECRET_KEY'] = 'your_secret_key' app.config['SESSION_TYPE'] = 'filesystem' Session(app)
- 这里的
SECRET_KEY
是加密的关键,要确保其保密性和复杂性。
- 使用
- 防止会话劫持:
- 设置合适的cookie选项。例如,在设置会话cookie时,启用
httponly
和secure
标志:
from flask import Flask, session app = Flask(__name__) app.config['SECRET_KEY'] = 'your_secret_key' @app.route('/') def index(): session['username'] = 'test' session.modified = True resp = app.make_response('Set session') resp.set_cookie('session_id', session.sid, httponly = True, secure = True) return resp
httponly
防止通过JavaScript访问cookie,secure
确保仅在HTTPS连接下传输cookie。
- 设置合适的cookie选项。例如,在设置会话cookie时,启用
- 防范会话固定攻击:
- 在用户登录成功后,更改会话ID。例如:
from flask import Flask, session, request, redirect, url_for app = Flask(__name__) app.config['SECRET_KEY'] = 'your_secret_key' @app.route('/login', methods=['POST']) def login(): # 验证用户登录 if 'username' in request.form and 'password' in request.form: # 验证通过 session.regenerate() return redirect(url_for('index')) return 'Login failed'
session.regenerate()
方法会生成新的会话ID,从而防止会话固定攻击。