当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《我的PythonSQLite代码易于进行SQL注入吗?》经验,为你挑选了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()

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

谢谢



1> ruohola..:

是的,它容易注射。例如,如果输入某人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()

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有