Python 防御 SQL 注入攻击:最佳实践指南
- 使用参数化查询
使用参数化查询可以使得用户输入的数据作为参数传递给 SQL 语句,而不是直接拼接到 SQL 语句中。这样可以防止 SQL 注入攻击。
例如,使用 Python 的 sqlite3 模块进行参数化查询:
import sqlite3
conn = sqlite3.connect('example.db')
c = conn.cursor()
# 使用参数化查询,将用户输入的数据作为参数传递给 SQL 语句
username = 'admin'
password = 'password'
c.execute('SELECT * FROM users WHERE username=? AND password=?', (username, password))
# 处理查询结果
rows = c.fetchall()
for row in rows:
print(row)
conn.close()
- 过滤用户输入
对用户输入进行过滤,例如限制输入的字符类型、长度等,可以降低 SQL 注入攻击的风险。
例如,限制用户名只能包含字母和数字:
import re
def is_valid_username(username):
if not re.match('^[a-zA-Z0-9]+$', username):
return False
return True
username = input('Enter your username: ')
if not is_valid_username(username):
print('Invalid username')
else:
# 使用参数化查询
password = input('Enter your password: ')
c.execute('SELECT * FROM users WHERE username=? AND password=?', (username, password))
# 处理查询结果
rows = c.fetchall()
for row in rows:
print(row)
- 使用 ORM 框架
使用 ORM 框架可以将数据库操作抽象成对象操作,避免直接操作 SQL 语句,进而防止 SQL 注入攻击。
例如,使用 Python 的 Django 框架进行 ORM 操作:
from django.contrib.auth.models import User
# 使用 ORM 框架查询用户
username = 'admin'
password = 'password'
user = User.objects.filter(username=username, password=password).first()
if user:
print(user)
else:
print('Invalid username or password')
原文地址: https://www.cveoy.top/t/topic/n3hP 著作权归作者所有。请勿转载和采集!