首页 > 解决方案 > SQL注入攻击:SQL语句中的f-string

问题描述

根据sqlite3模块的文档:

你不应该使用 Python 的字符串操作来组装你的查询,因为这样做是不安全的;它使您的程序容易受到 SQL 注入攻击。

我有以下代码使用 Python 的字符串操作之一(f-string),但它并不是真正的查询。在这里使用 f-string 安全吗?

import sqlite3

db = 'example.db'
con = sqlite3.connect(db)
cur = con.cursor()

table = 'mytable'
cur.execute(f'DROP TABLE IF EXISTS {table}')

sqlite3 的文档还说:

相反,使用 DB-API 的参数替换。在要使用值的任何位置放置一个占位符,然后提供一个值元组作为游标的 execute() 方法的第二个参数。SQL 语句可以使用两种占位符之一:问号(qmark 样式)或命名占位符(命名样式)。

但是这些样式似乎在这里不起作用:

import sqlite3

db = 'example.db'
con = sqlite3.connect(db)
cur = con.cursor()

cur.execute(f'DROP TABLE IF EXISTS :table', {"table": "mytable"})
sqlite3.OperationalError: near ":table": syntax error

标签: pythonsqlitesql-injection

解决方案


推荐阅读