python如何防止SQL注入攻击?

python如何防止SQL注入攻击?

在您提供的 ORM 示例中,我们已经有了防止 SQL 注入的基本保障,因为我们使用了参数化查询。但是,为了进一步增强代码的清晰性和安全性,我们可以确保在分页查询和插入等操作中都使用参数化查询,同时加入类型验证以防止意外输入。

以下是修改后的 ORM 代码,加入了更全面的安全措施和分页功能:

import sqlite3
from abc import ABC, abstractmethod


class Database:
    """数据库连接管理类"""
    
    def __init__(self, db_name):
        self.connection = sqlite3.connect(db_name)
        self.cursor = self.connection.cursor()

    def commit(self):
        self.connection.commit()

    def close(self):
        self.connection.close()


class BaseModel(ABC):
    """模型基类"""
    
    @classmethod
    @abstractmethod
    def table_name(cls):
        pass

    @classmethod
    def create_table(cls, db: Database):
        """创建表"""
        raise NotImplementedError("Subclasses must implement this method.")
    
    @classmethod
    def all(cls
SQL 注入是一种常见的安全攻击手段,攻击者通过在输入中插入恶意 SQL 代码,试图操控数据库查询,从而获取敏感信息、篡改数据或删除数据。为了防止 SQL 注入攻击,必须对用户输入进行严格处理,使用安全的编程实践。 --- ## ✅ 防止 SQL 注入的主要方法: ### 1. **使用参数化查询(预编译语句)** 这是最推荐也是最有效的方式。参数化查询将 SQL 语句与数据分离,确保用户输入始终被视为数据而非可执行的 SQL 代码。 #### 示例(以 Python 的 `pymysql` 为例): ```python import pymysql # 连接数据库 conn = pymysql.connect(host='localhost', user='root', password='password', database='testdb') cursor = conn.cursor() # 用户输入 username = "admin" password = "'; DROP TABLE users; --" # 参数化查询(安全) sql = "SELECT * FROM users WHERE username = %s AND password = %s" cursor.execute(sql, (username, password)) # 获取结果 result = cursor.fetchall() print(result) cursor.close() conn.close() ``` **解释:** - `%s` 是占位符,不是字符串格式化。 - `cursor.execute(sql, (username, password))` 会自动对输入进行转义,防止恶意内容被执行。 --- ### 2. **使用 ORM 框架(如 SQLAlchemy、Django ORM)** ORM(对象关系映射)框架会自动处理 SQL 注入问题,开发者无需直接拼接 SQL 语句。 #### 示例(使用 SQLAlchemy): ```python from sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) username = Column(String) password = Column(String) # 创建引擎和会话 engine = create_engine('mysql+pymysql://root:password@localhost/testdb') Session = sessionmaker(bind=engine) session = Session() # 查询用户(自动防止 SQL 注入) user = session.query(User).filter(User.username == "admin", User.password == "'; DROP TABLE users; --'").first() print(user) ``` --- ### 3. **对输入进行过滤和转义** 虽然参数化查询是最优解,但在某些情况下仍需手动转义输入数据。 #### 示例(使用 pymysql 的转义函数): ```python import pymysql conn = pymysql.connect(host='localhost', user='root', password='password', database='testdb') cursor = conn.cursor() user_input = "'; DROP TABLE users; --" safe_input = conn.escape(user_input) # 转义输入 sql = f"SELECT * FROM users WHERE username = {safe_input}" cursor.execute(sql) result = cursor.fetchall() print(result) ``` --- ### 4. **最小权限原则** 确保数据库用户只拥有完成其任务所需的最小权限,比如: - 不允许执行 `DROP`, `DELETE`, `ALTER` 等高危操作。 - 使用只读账户处理查询请求。 --- ### 5. **使用 Web 框架内置的安全机制** 现代 Web 框架(如 Django、Flask、Spring Boot)都内置了防止 SQL 注入的机制,使用这些框架开发时应遵循其最佳实践。 --- ## ✅ 总结 | 方法 | 是否推荐 | 说明 | |------|----------|------| | 参数化查询 | ✅ 强烈推荐 | 最有效、最通用的方式 | | ORM 框架 | ✅ 推荐 | 开发效率高,安全性好 | | 输入过滤/转义 | ⚠️ 一般 | 容易出错,不推荐作为唯一手段 | | 最小权限原则 | ✅ 推荐 | 安全设计的一部分 | | 框架安全机制 | ✅ 推荐 | 利用现成工具减少手动处理 | --- ##
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值