这种说法容易注入吗?我试图将其转换为准备好的语句,但遇到了很多麻烦。
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语法):
user = 'foo";--' passw = 'anything here' sql = 'select * from users where username="' + user + '" and password="' + passw + '";' print(sql)
您的原始代码还容易受到注入的百万种其他方式的影响,这意味着您永远都不应为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()