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

时间:2012-11-28 19:37:34

标签: python sql security sqlite

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

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

1 个答案:

答案 0 :(得分:24)

是的,确实如此。使用这样的东西来阻止它:

cursor.execute("INSERT INTO table VALUES ?", args)

请注意,您无法像这样输入表格。理想情况下,表格应该是硬编码的,在任何情况下都不应该来自任何类型的用户输入。您可以使用类似于您对表格所做的字符串,但是您最好100%确定用户无法以某种方式更改它...有关详细信息,请参阅Can I use parameters for the table name in sqlite3?

基本上,您希望将参数放在cursor命令中,因为它确保使数据库安全。使用您的第一个命令,可以相对轻松地创建一个特殊的tableargs,将某些内容放入您的SQL代码中并不安全。请参阅python pages和引用的http://xkcd.com/327/。具体来说,python页面引用:

  

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

     

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

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

args="name; DELETE table"

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

enter image description here

相关问题