这个语句容易被注入吗?我尝试将其转换为准备好的语句,但遇到了很多麻烦。
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()
目的是确保此声明的安全,使其不被拦截。
是的,很容易注射。例如,如果有人输入
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()