后端开发中常见的安全漏洞和防御策略
发布时间:2023-12-27 21:52:36
1. SQL注入:攻击者通过注入恶意的SQL代码来修改、删除或者获取数据库中的信息。防御策略包括使用参数化查询、输入合法性验证和引入ORM。
例子:
# 参数化查询
query = "SELECT * FROM users WHERE username = ? AND password = ?"
params = (username, password)
cursor.execute(query, params)
# 输入合法性验证
if not username.isalnum():
raise Exception("Invalid username")
# ORM
class User(db.Model):
username = db.Column(db.String(50), unique=True)
password = db.Column(db.String(50))
user = User.query.filter_by(username=username).first()
2. 跨站脚本攻击(XSS):攻击者通过注入恶意脚本来获取用户的敏感信息或执行恶意操作。防御策略包括 XSS过滤、输入验证和输出编码。
例子:
# XSS过滤
from bleach import clean
clean(user_input, tags=[], attributes={}, styles=[], strip=True)
# 输入验证
if not is_valid_html(user_input):
raise Exception("Invalid input")
# 输出编码
import html
html.escape(user_input)
3. 跨站请求伪造(CSRF):攻击者通过伪造合法用户的请求来执行恶意操作。防御策略包括使用CSRF令牌、验证referer、验证用户请求中的内容等。
例子:
# CSRF令牌
@app.route('/update_password', methods=['POST'])
@csrf_protect
def update_password():
# 更新密码逻辑
# 验证referer
def validate_referer(request):
referer = request.headers.get('Referer')
valid_referer = 'http://example.com/'
if referer is None or not referer.startswith(valid_referer):
raise Exception("Invalid referer")
# 验证用户请求中的内容
def validate_request(request):
if request.method == 'POST':
csrf_token = request.form.get('csrf_token')
if csrf_token != session['csrf_token']:
raise Exception("CSRF token mismatch")
4. 不安全的文件上传:攻击者通过上传恶意文件来执行任意代码或获取敏感信息。防御策略包括限制文件类型和大小、验证文件内容和使用安全的文件存储路径。
例子:
# 限制文件类型和大小
allowed_extensions = ['.jpg', '.png']
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1].lower() in allowed_extensions
def validate_file_size(file):
max_file_size = 10 * 1024 * 1024 # 10MB
if file.content_length > max_file_size:
raise Exception("File size exceeds the limit")
# 验证文件内容
import magic
def validate_file_content(file):
if magic.from_buffer(file.read(1024), mime=True).split('/')[0] != 'image':
raise Exception("File type is not supported")
# 安全的文件存储路径
import random
import string
def generate_filename():
letters = string.ascii_letters
return ''.join(random.choice(letters) for i in range(10))
filename = generate_filename() + '.jpg'
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
5. 不安全的身份验证和会话管理:攻击者通过盗用用户身份或者会话信息来冒充用户执行恶意操作。防御策略包括使用安全的密码存储和传输、使用HTTPS、设置合理的会话过期时间和使用双因素身份验证。
例子:
# 安全的密码存储和传输
from werkzeug.security import generate_password_hash, check_password_hash
password_hash = generate_password_hash(password)
if check_password_hash(password_hash, password):
# 密码匹配
# 使用HTTPS
@app.route('/login', methods=['POST'])
@requires_secure_connection
def login():
# 登录逻辑
# 设置合理的会话过期时间
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=365)
# 使用双因素身份验证
def verify_otp(otp):
# 验证OTP逻辑
以上仅列举了后端开发中常见的一些安全漏洞和相应的防御策略,开发者还需根据具体应用和业务场景,综合考虑不同的安全风险,采取合适的安全措施来保护系统的安全。
