这个Python代码是否容易受到SQL注入攻击?(sqlite3的)

She*_*don 12 python sql sqlite security

正如标题所示,我想知道这段代码是否容易受到SQL注入攻击?如果是这样,是否有更好,更安全的方式来实现同样的目标?

def add(table,*args):
    statement="INSERT INTO %s VALUES %s" % (table,args)
    cursor.execute(statement)
Run Code Online (Sandbox Code Playgroud)

Pea*_*oto 28

是的.使用这样的东西来防止它:

cursor.execute("INSERT INTO table VALUES ?", args)
Run Code Online (Sandbox Code Playgroud)

请注意,您不能像这样输入表格.理想情况下,表格应该是硬编码的,在任何情况下都不应该来自任何类型的用户输入.您可以使用类似于您对表所做的字符串,但您最好100%确定用户无法以某种方式更改它...请参阅我可以在sqlite3中使用参数作为表名吗?更多细节.

实际上,您希望将参数放在cursor命令中,因为它确保使数据库安全.使用第一个命令,可以相对容易地创建一个特殊的table或者args在SQL代码中放入一些不安全的东西.请参阅python页面和引用的http://xkcd.com/327/.具体来说,python页面引用:

通常,您的SQL操作需要使用Python变量中的值.你不应该使用Python的字符串操作来组装你的查询,因为这样做是不安全的; 它使您的程序容易受到SQL注入攻击(请参阅http://xkcd.com/327/以获取可能出错的幽默示例).

而是使用DB-API的参数替换.放?作为占位符,无论您想要使用哪个值,然后提供一个值元组作为游标的execute()方法的第二个参数.(其他数据库模块可能使用不同的占位符,例如%s或:1.)

基本上,有人可以设置执行另一个命令的args,如下所示:

args="name; DELETE table"
Run Code Online (Sandbox Code Playgroud)

使用cursor.execute将填充给定的值,以便参数可以列出,当您对其进行查询时,这正是您将要获得的.XKCD也幽默地解释了这一点.

在此输入图像描述

  • @RyanDalton:使用参数意味着sqlite3(或您的其他数据库库)可以绑定它想要的参数.它可能只是确保所有内容都被正确引用和转义(可能使用特定于该DBMS的功能,否则很难让您正确).或者它可能在将SQL语句解析为内部格式(可能更快,更安全)之后实际绑定params.关键是任何数据库接口都需要使用参数来执行_something_ safe,而使用字符串时你必须弄清楚并自己做同样的事情(而且会做错). (5认同)
  • 这可能很明显,但为了安全起见:对所有语句都执行此操作,而不仅仅是 INSERT。SELECT 语句同样容易受到攻击。 (2认同)
  • 5赞成,接受,没有人打扰检查?(http://stackoverflow.com/questions/5870284/can-i-use-parameters-for-the-table-name-in-sqlite3) (2认同)
  • 您能否更详细地说明在提供相同输入(table,args)字符串的情况下,为什么/如何使用参数(?)不会返回与(%s)相同的可执行SQL代码? (2认同)