此Python代码易受SQL注入攻击吗?(SQLite3)
正如标题所示,我想知道这段代码是否容易受到SQL注入的攻击?如果是这样,有没有更好、更安全的方法来实现同样的目标此Python代码易受SQL注入攻击吗?(SQLite3),python,sql,security,sqlite,Python,Sql,Security,Sqlite,正如标题所示,我想知道这段代码是否容易受到SQL注入的攻击?如果是这样,有没有更好、更安全的方法来实现同样的目标 def add(table,*args): statement="INSERT INTO %s VALUES %s" % (table,args) cursor.execute(statement) 是的。使用类似的方法来防止它: cursor.execute("INSERT INTO table VALUES ?", args) 请注意,不能像这样在中输入表格。
def add(table,*args):
statement="INSERT INTO %s VALUES %s" % (table,args)
cursor.execute(statement)
是的。使用类似的方法来防止它:
cursor.execute("INSERT INTO table VALUES ?", args)
请注意,不能像这样在中输入表格。理想情况下,表应该是硬编码的,在任何情况下都不应该来自任何类型的用户输入。您可以使用类似于您对表所做的操作的字符串,但您最好100%确定用户无法以某种方式更改它。。。有关更多详细信息,请参阅
基本上,您希望将参数放在cursor命令中,因为它将确保数据数据库的安全。使用第一个命令,创建一个特殊的表
或args
,将一些不安全的内容放入SQL代码中相对容易。请参见,以及引用的。具体而言,python页面引用:
通常,SQL操作需要使用Python中的值
变量。您不应该使用Python的字符串组合查询
因为这样做是不安全的;它使你的程序
易受SQL注入攻击(有关详细信息,请参阅
可以出错的幽默例子)
相反,使用DB-API的参数替换。放?作为一个
在需要使用值的任何位置使用占位符,然后提供元组
作为游标的execute()方法的第二个参数的值。
(其他数据库模块可能使用不同的占位符,例如%s或%s。)
:1)
基本上,有人可以设置一个args来执行另一个命令,如下所示:
args="name; DELETE table"
使用cursor.execute将填充给定的值,这样参数就可以如清单所示,而当您对其进行查询时,您将得到的正是这个值。也幽默地解释了这一点
谢谢。你能详细解释一下为什么它容易受到攻击吗?这可能是显而易见的,但为了安全起见:对所有语句都这样做,而不仅仅是插入。SELECT语句同样容易受到攻击。5张赞成票,被接受,而且没有人费心检查?()如果提供了相同的输入(表、参数)字符串,您能否更详细地解释为什么/如何使用参数(?)不会返回与(%s)相同的可执行SQL代码?@RyanDalton:使用参数意味着sqlite3(或您的其他DB库)可以根据需要绑定参数。它可能只是确保所有内容都被正确引用和转义(可能使用特定于该DBMS的特性,或者您很难正确理解)。或者,它可能在将SQL语句解析为内部格式后实际绑定参数(这可能更快,也更安全)。关键是,任何DB接口都需要对参数做一些安全的事情,而对于字符串,您必须自己找出并做同样的事情(而且会做错事)。我建议您仔细阅读SQL注入是什么。应该说得很清楚。