在Web开发中,SQL注入是一种常见的安全漏洞,攻击者可以通过在输入框中输入恶意的SQL语句来获取敏感数据或者破坏数据库。Python作为一种流行的编程语言,在处理用户输入时需要特别注意防止SQL注入攻击。本文将介绍Python中防止SQL注入攻击的方法,并给出相应的代码示例。
cursor.execute()
方法。import pymysql
# 连接数据库
conn = pymysql.connect(host='localhost', user='root', password='password', database='mydb')
cursor = conn.cursor()
# 参数化查询
sql = "SELECT * FROM users WHERE username=%s AND password=%s"
cursor.execute(sql, (username, password))
result = cursor.fetchall()
# 关闭连接
cursor.close()
conn.close()
在上面的代码中,我们使用了%s
作为占位符,并将实际的参数传递给execute()
方法。这样可以防止用户输入的内容被解释为SQL语句的一部分。
from sqlalchemy import create_engine, Table, MetaData
from sqlalchemy.sql import select
# 创建引擎
engine = create_engine('mysql+pymysql://root:password@localhost/mydb')
# 创建元数据
metadata = MetaData()
users = Table('users', metadata, autoload_with=engine)
# 使用ORM查询
stmt = select([users]).where(users.c.username == username).where(users.c.password == password)
result = engine.execute(stmt).fetchall()
在使用ORM框架时,开发者无需直接编写SQL语句,框架会自动处理参数化查询,从而避免SQL注入攻击。
import re
# 输入验证
if not re.match(r'^[a-zA-Z0-9_]+$', username):
raise ValueError('Invalid username')
# 输入过滤
username = username.strip()
我们使用正则表达式对用户名进行验证,确保只包含字母、数字和下划线。同时,使用strip()
函数对输入进行过滤,去除首尾的空白字符。