问题:是否可以在不使用字符串构造函数的情况下将变量用作表名?
信息:
我现在正在研究一个项目,该项目对来自我的恒星模拟的数据进行分类。为此,我将所有数据加载到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编码。
不幸的是,表不能成为参数替换的目标(我没有找到任何确定的来源,但是我已经在一些网络论坛上看到了)。
如果你担心注入(可能应该这样做),则可以编写一个在传递字符串之前清除字符串的函数。由于你仅在查找表名,因此仅接受字母数字,删除所有标点符号(例如)(][;,和空格)就应该是安全的。基本上,保持即可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'