Python Django 防止 SQL 注入:参数化查询实战

Cora
Cora
发布时间:2026-10-13| 5人浏览过
原创

本文详解 Django 中防止 SQL 注入的核心方法。通过对比直接拼接字符串与使用占位符 %s 及参数列表 params 的执行方式,阐述参数化查询如何有效阻断恶意代码注入。重点解析 params 集合中元素顺序与 SQL 语句占位符严格对应的必要性,并强调连接对象 close() 的重要性,帮助开发者构建安全的数据库交互逻辑。

存在 SQL 注入风险的代码示例

首先分析存在 SQL 注入风险的代码示例。


 id = 11001
    sql = """
    SELECT
      id,
      name,
      age
    FROM
      student
    WHERE
      id = """+id+""" 
    """
    cursor = connection.cursor()
    try:
      cursor.execute(sql)
      result = cursor.fetchall()
      for result1 in result:
        // 代码块
        pass
    finally:
      cursor.close()
 

SQL 注入原理与危害

在程序开发中,构建 SQL 语句时若涉及 where 条件,开发者常采用直接拼接字符串的方式。然而,这种写法极易引发 SQL 注入漏洞。所谓 SQL 注入,是指攻击者通过前端页面输入恶意构造的 SQL 片段,将其拼接到原始 SQL 语句中。例如,若登录接口未做防护,攻击者输入类似 1=1 的条件,可能导致系统验证逻辑失效,从而非法进入程序。因此,必须采取有效措施防止此类安全风险。

Django 中防止 SQL 注入的正确做法

接下来介绍具体的 SQL 注入防御方案。


 id = 11001
 params = []
    sql = """
    SELECT
      id,
      name,
      age
    FROM
      student
    WHERE
      id = %s
    """
    params.append(id)
    cursor = connection.cursor()
    try:
      cursor.execute(sql, params)
      result = cursor.fetchall()
      for result1 in result:
        // 代码块
        pass
    finally:
      cursor.close()

参数化查询与连接管理要点

安全的做法是将查询条件变量存入列表(或集合),并将该列表作为参数传递给 SQL 执行方法,从而规避注入风险。在 SQL 语句中使用 %s 作为占位符时,需注意其顺序性。例如,若 SQL 语句中先指定 id=%s 后指定 name=%s,则对应的 params 列表也必须按相同顺序追加元素,即先 append(id) 再 append(name)。若顺序颠倒,如先 append(name) 后 append(id),会导致 SQL 执行时条件对应错乱(如出现 id=name and name = id 的逻辑错误),甚至引发程序报错。此外,使用 django.db 中的 connection 完成数据库操作后,务必调用 close() 方法关闭连接,注意导入模块时不要选错。

总结

以上内容为本文的全部介绍,希望能为各位的学习提供有益帮助,同时也欢迎大家继续支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。