我的 Python SQLite 代码容易受到 SQL 注入吗? [重复]

问题描述 投票:0回答:1

这个语句容易被注入吗?我尝试将其转换为准备好的语句,但遇到了很多麻烦。

import cgi
import sqlite3

form = cgi.FieldStorage()
user = form['username'].value
passw = form['password'].value

conn = sqlite3.connect('class.db')
c = conn.cursor()

c.execute('select * from users where username="' + user + '" and password="' + passw + '";')
results = c.fetchall()
conn.close()

目的是确保此声明的安全,使其不被拦截。

python sql sqlite sql-injection
1个回答
8
投票

是的,很容易注射。例如,如果有人输入

foo";--
作为登录用户名,他们可以登录名为
foo
的帐户,无需任何密码检查:

user = 'foo";--'
passw = 'anything here'
sql = 'select * from users where username="' + user + '" and password="' + passw + '";'
print(sql)

输出(带有 SQL 语法高亮):

select * from users where username="foo";--" and password="anything here";

还有一百万种其他方式使您的原始代码容易受到注入攻击,重点是您永远不应该为 SQL 语句进行简单的字符串构建。

可以应该只需使用参数化查询即可避免这种情况。除了 100% 安全地防止注入之外,它们还使复杂的查询变得更容易编写和阅读:

import cgi
import sqlite3

form = cgi.FieldStorage()
user = form['username'].value
passw = form['password'].value

conn = sqlite3.connect('class.db')
c = conn.cursor()

c.execute('select * from users where username = ? and password = ?;', (user, passw))
results = c.fetchall()
conn.close()
© www.soinside.com 2019 - 2024. All rights reserved.