gpt4 book ai didi

python - 这段 Python 代码容易受到 SQL 注入(inject)的攻击吗? (SQLite3)

转载 作者:IT王子 更新时间:2023-10-29 06:19:56 25 4
gpt4 key购买 nike

正如标题所暗示的,我想知道这段代码是否存在 SQL 注入(inject)漏洞?如果是这样,是否有更好、更安全的方法来实现同样的目标?

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

最佳答案

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

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

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

本质上,您希望将参数放在游标命令中,因为这将确保数据数据库安全。使用您的第一个命令,创建一个特殊的 tableargs 将一些不安全的内容放入您的 SQL 代码中会相对容易。查看python pages ,以及引用的 http://xkcd.com/327/ .具体来说,python 页面引用:

Usually your SQL operations will need to use values from Python variables. You shouldn’t assemble your query using Python’s string operations because doing so is insecure; it makes your program vulnerable to an SQL injection attack (see http://xkcd.com/327/ for humorous example of what can go wrong).

Instead, use the DB-API’s parameter substitution. Put ? as a placeholder wherever you want to use a value, and then provide a tuple of values as the second argument to the cursor’s execute() method. (Other database modules may use a different placeholder, such as %s or :1.)

基本上,有人可以设置一个执行另一个命令的参数,像这样:

args="name; DELETE table"

使用 cursor.execute 将填充给定的值,这样参数就可以像列出的那样,当你对其进行查询时,这正是你将得到的结果。 XKCD也幽默地解释了这一点。

enter image description here

关于python - 这段 Python 代码容易受到 SQL 注入(inject)的攻击吗? (SQLite3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13613037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com