我的Python SQLite代码易于进行SQL注入吗?

sat*_*tar 3 python sql sqlite sql-injection

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

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()
Run Code Online (Sandbox Code Playgroud)

目的是保护此语句,以使其不会被截获。

谢谢

ruo*_*ola 6

是的,它容易注射。例如,如果输入某人foo";--作为登录用户名,则他们可以登录到名为的帐户,foo而无需进行任何密码检查:

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

输出(突出显示SQL语法):

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

您的原始代码还容易受到注入的百万种其他方式的影响,这意味着您永远都不应为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()
Run Code Online (Sandbox Code Playgroud)