【发布时间】:2019-01-31 12:14:24
【问题描述】:
我正在设置一个 mysql 应用程序。这是我使用标准 mysqldb 格式连接的 getUsername 方法。 这是否意味着这是一个准备好的声明?另外,这段代码安全吗,还是我容易受到 SQL 注入的攻击?
def selectUser(userName):
try:
username = pickle.loads(base64.decode(userName))
except:
username = "admin"
query = "SELECT name FROM users WHERE name = '%s'"
conn = MySQLdb.connect('localhost', 'dbAdmin', 'lja8j30lJJal##', 'blog');
with conn:
c = conn.cursor()
c.execute(query, (username,))
【问题讨论】:
-
我相信这是一个 parameterized 语句,而不是一个 prepared 语句。是的,它不会受到 SQL 注入的影响。
-
我不是 100% 确定这在 Python 中是如何工作的,但我怀疑
name = '%s'最终会变成name = ''John''或name = 'NULL',这可能不是什么您打算这样做,在前一种情况下可能会导致 SQL 端出现语法错误。通常参数周围没有引号,因为如有必要,它们将由库添加。 -
我的想法是使攻击向量成为可能,因为 pickle.loads() 会出错,因为方法应该是 load()。这样,它将始终是管理员用户。
标签: python mysql sql security sql-injection