为什么PyMySQL不容易受到SQL注入攻击?
原学程将引见为何PyMySQL没有轻易遭到SQL注进进击?的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。
成绩描写
我没有熟习PyMySQL,方才测验考试履行盘问:
c.execute('''INSERT INTO mysql_test一 (
data,
duration,
audio,
co妹妹ents
) VALUES (
?,
?,
?,
?
);
''', [
co妹妹ents_var,
duration_var,
audio_var,
co妹妹ents_var
]
);
然则,它激发了以下毛病:
TypeError: not all arguments converted during string formatting
我留意到我的变质必定有成绩,并浏览了怎样在PyMySQL中准确处置它们,希冀应用参数调换办法,但是令我惊奇的是,我甚么也找没有到。相反,我发明的每一个线程皆应用字符串操纵(比方here、here、here以及here(有1条正文宣称字符串操纵将是PyMySQL的尺度操纵)。
这对于我去说颇有趣,由于我之前只处置过SQLite,个中DBAPI文档explicitly warns应用戴有变质的字符串操纵:
SQL操纵平日须要应用去自Python变质的值。然则,请留意没有要应用Python的字符串操纵去组开盘问,由于它们轻易遭到SQL注进进击。
文档经由过程以下代码片断举例解释了这1面:
Never do this -- insecure!
symbol = 'RHAT'
cur.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)
Instead, use the DB-API’s parameter substitution.
当我浏览PyMySQL docs时,我找没有就任何干于这类风险的提法。它只是证明了我之前的发明:
假如args是列表或者元组,则%s不妨用作盘问中的占位符。假如args是辞书,则%(Name)s不妨用作盘问中的占位符。
为何在sqlite三
中应用字符串操纵轻易遭到SQL注进进击,而在pymysql
中却出有遭到质疑?
推举谜底
很遗憾,pymysql的安排者选择应用%s
作为参数占位符。它让很多开辟职员觉得迷惑,由于它与字符串格局化函数中应用的%s
雷同。但是它在pymysql中做的没有是异样的工作。
它不只仅是停止简略的字符串调换。Pymysql将对于值运用,而后再将它们拔出到SQL盘问中。这可避免特别字符变动SQL盘问的语法。
现实上,pymysql也会给您戴去费事。以下是没有平安的:
cur.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)
由于它在将变质symbol
作为参数传播给execute()
之前将其拔出到字符串中。而后,独一的参数是戴有格局化变质的已完成的SQL字符串。
基于这是平安的:
cur.execute("SELECT * FROM stocks WHERE symbol = %s", (symbol,))
由于它传播由symbol
变质构成的列表作为第两个参数。execute()
函数中的代码将本义运用于列表中的每一个元素,并将成果值拔出到SQL盘问字符串中。留意%s
没有是用单引号分割的。execute()
的代码担任这1面。
佳了闭于为何PyMySQL没有轻易遭到SQL注进进击?的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。