SQLite 中的变量表名称
在 SQLite 中,你可能会遇到这样的情况,你需要动态创建一个表,其名称存储在一个变量。虽然为此目的使用字符串构造函数很常见,但由于潜在的 SQL 注入攻击,会出现安全问题。
不幸的是,SQLite 不允许对表名进行参数替换。然而,最佳实践要求使用参数替换来防范注入攻击。
替代解决方案:清理变量
由于表名称无法直接参数化,因此可行的解决方案是在将包含表名的变量传递给 CREATE TABLE 语句之前对其进行清理。
您可以创建一个函数来清理通过删除除字母数字字符之外的所有字符来更改变量。例如,以下 Python 函数会去除标点符号、空格和其他非字母数字字符:
def scrub(table_name): return ''.join( chr for chr in table_name if chr.isalnum() ) scrub('); drop tables --') # returns 'droptables'
使用此函数,您可以创建具有可变表名的表,确保删除恶意字符,防止注入攻击:
table_name = 'StarFrame' + self.name cursor.execute('CREATE TABLE {} (etc etc)'.format(scrub(table_name)))
以上是如何在 SQLite 中安全地创建具有动态名称的表?的详细内容。更多信息请关注PHP中文网其他相关文章!