为什么PyMySQL不容易受到SQL注入攻击?

原学程将引见为何PyMySQL没有轻易遭到SQL注进进击?的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。

为什么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注进进击?的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。