参数化查询(防注入)

56.11 参数化查询(防注入)

永远用 ? 占位符传参数,不要把用户输入直接拼进 SQL 字符串。

恶意输入如 ' OR 1=1 -- 若拼接 SQL 可能查出全部数据甚至删表。

本教程站后台、Flask/Django 项目同样必须参数化或使用 ORM。

💡 本教程站就是用 SQLite 存储文章数据。

安全 vs 危险写法

import sqlite3

name = "' OR '1'='1"  # 恶意输入示例
with sqlite3.connect('school.db') as conn:
    # 正确:参数化
    cur = conn.execute('SELECT * FROM students WHERE name=?', (name,))
    print('安全查询行数', len(cur.fetchall()))
    # 错误(勿用):
    # cur.execute(f"SELECT * FROM students WHERE name='{name}'")