繁体   English   中英

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

[英]Is this Python code vulnerable to SQL injection? (SQLite3)

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

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

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

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

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

实际上,您希望将参数放在cursor命令中,因为它确保使数据库安全。 使用第一个命令,制作一个特殊的tableargs可以相对容易地将一些东西放入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"

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

在此输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM