19

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

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

1 回答 1

37

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

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

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

本质上,您希望将参数放在游标命令中,因为它将确保数据数据库安全。table使用您的第一个命令,制作一个特殊的或args将一些不安全的东西放入您的 SQL 代码中会相对容易。请参阅python pages和引用的http://xkcd.com/327/。具体来说,python页面引用:

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

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

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

args="name; DELETE table"

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

在此处输入图像描述

于 2012-11-28T19:41:28.537 回答