一尘不染

Python-sqlite中的变量表名称

python

问题:是否可以在不使用字符串构造函数的情况下将变量用作表名?

信息:

我现在正在研究一个项目,该项目对来自我的恒星模拟的数据进行分类。为此,我将所有数据加载到sqlite数据库中。它工作得很好,但是我决定为数据库增加更多的灵活性,效率和可用性。我计划稍后在模拟中添加小行星,并希望为每个恒星提供一张表格。这样,我就不必查询每个太阳系中1-4k的20m个小行星的表。

有人告诉我使用字符串构造函数是不好的,因为它使我容易受到SQL注入攻击。虽然这并不是什么大问题,因为我是唯一有权访问这些数据库的人,但我想遵循最佳实践。而且通过这种方式,如果我在向公众开放的情况下进行类似的项目,我也知道该怎么做。

目前,我正在这样做:

cursor.execute("CREATE TABLE StarFrame"+self.name+" (etc etc)")

这可行,但是我想做更多类似的事情:

cursor.execute("CREATE TABLE StarFrame(?) (etc etc)",self.name)

尽管我知道这可能是不可能的。虽然我会满足于

cursor.execute("CREATE TABLE (?) (etc etc)",self.name)

如果根本不可能,我将接受该答案,但是如果有人知道执行此操作的方法,请告知。:)

我在用python编码。


阅读 704

收藏
2020-02-18

共1个答案

一尘不染

不幸的是,表不能成为参数替换的目标(我没有找到任何确定的来源,但是我已经在一些网络论坛上看到了)。

如果你担心注入(可能应该这样做),则可以编写一个在传递字符串之前清除字符串的函数。由于你仅在查找表名,因此仅接受字母数字,删除所有标点符号(例如)(][;,和空格)就应该是安全的。基本上,保持即可A-Z a-z 0-9。

def scrub(table_name):
    return ''.join( chr for chr in table_name if chr.isalnum() )

scrub('); drop tables --')  # returns 'droptables'
2020-02-18