学习笔记:防止SQL注入、XSS攻击和文件上传漏洞(Python3)
本笔记由生成式大模型GPT-4o自动整理。注意AI可能犯错。代码和理论由GPT-4o(2024-5-21)自行撰写未经人工复核。
参数化查询防SQL注入
参数化查询通过将SQL语句和数据分离来防止SQL注入:
import pymysqlconnection = pymysql.connect(host='localhost', user='user', password='passwd', db='db')
cursor = connection.cursor()
username, password = "admin", "password123"sql = "SELECT * FROM users WHERE username=%s AND password=%s"
cursor.execute(sql, (username, password))
result = cursor.fetchall()
防止XSS攻击的方法
-
输出编码:在输出到网页时进行编码。
-
内容安全策略(CSP):使用CSP头限制浏览器执行或加载的内容。
Content-Security-Policy: default-src 'self';
-
输入验证和清理:严格验证和清理用户输入。
-
使用安全的库和框架:例如,使用Django。
-
设置HTTP头:
X-XSS-Protection: 1; mode=block
文件上传漏洞的解决方法(Python3后端)
-
文件类型验证:
from werkzeug.utils import secure_filename from flask import Flask, request, abortapp = Flask(__name__) app.config['UPLOAD_FOLDER'] = '/path/to/upload' app.config['ALLOWED_EXTENSIONS'] = {'png', 'jpg', 'jpeg', 'gif'}def allowed_file(filename):return '.' in filename and filename.rsplit('.', 1)[1].lower() in app.config['ALLOWED_EXTENSIONS']@app.route('/upload', methods=['POST']) def upload_file():if 'file' not in request.files:abort(400, 'No file part')file = request.files['file']if file.filename == '':abort(400, 'No selected file')if file and allowed_file(file.filename):filename = secure_filename(file.filename)file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))return 'File successfully uploaded'else:abort(400, 'File type not allowed')
-
文件名安全处理:
from werkzeug.utils import secure_filenamefilename = secure_filename(file.filename)
-
限制文件大小:
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 # 16MB
-
存储位置和权限:
import osUPLOAD_FOLDER = '/path/to/upload' if not os.path.exists(UPLOAD_FOLDER):os.makedirs(UPLOAD_FOLDER, exist_ok=True) os.chmod(UPLOAD_FOLDER, 0o700)
总结
通过参数化查询防止SQL注入,使用输出编码、CSP、输入验证等技术防止XSS攻击,并在Python3后端通过文件类型验证、文件名处理、限制文件大小等措施防止文件上传漏洞,可以有效提高Web应用的安全性。