【发布时间】:2020-11-06 18:08:17
【问题描述】:
接受用户输入并为用户提供给定用户名的代码。现在它直接接受输入到 SQL 查询中,但我想将它与准备好的语句一起使用,我该怎么做?
# SELECT QUERIES
def get_all_results(q):
cur = mysql.connection.cursor()
cur.execute(q)
mysql.connection.commit()
data = cur.fetchall()
cur.close()
return data
# UPDATE and INSERT QUERIES
def commit_results(q):
cur = mysql.connection.cursor()
cur.execute(q)
mysql.connection.commit()
cur.close()
##### Returns a user for a given username
### in: username
### out: User
def get_user(username):
q = "SELECT * FROM Users"
q+= " WHERE username = '%s'" % (username)
logging.debug("get_user query: %s" % q)
data = get_all_results(q)
if len(data) == 1:
user = User(*(data[0]))
return user
else:
logging.debug("get_user: Something wrong happened with (username):(%s)" % (username))
return None```
【问题讨论】:
-
字符串取模
%,格式化方式为无longer recommended in Python,应替换为str.format(v2.6+)或F-strings(v3.6+)。跨度> -
即使使用
str.format()也不是执行准备好的语句的方法。如果您自己将变量插入 SQL 查询字符串,无论您使用哪种字符串格式样式,这都无助于防止 SQL 注入。
标签: python mysql sql sql-injection