Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
此Python代码易受SQL注入攻击吗?(SQLite3)_Python_Sql_Security_Sqlite - Fatal编程技术网

此Python代码易受SQL注入攻击吗?(SQLite3)

此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) 请注意,不能像这样在中输入表格。

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

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注入是什么。应该说得很清楚。