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)
目的是保护此语句,以使其不会被截获。
谢谢
是的,它容易注射。例如,如果输入某人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语法):
Run Code Online (Sandbox Code Playgroud)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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
90 次 |
| 最近记录: |