我正在审查具有以下内容的应用程序:
table_name = table_name.replace('`', '')
c.execute('SELECT * FROM `' + table_name + '`')
如果攻击者控制 table_name 字段,这实际上可以利用吗?语言是python,数据库是sqlite fwiw
我正在审查具有以下内容的应用程序:
table_name = table_name.replace('`', '')
c.execute('SELECT * FROM `' + table_name + '`')
如果攻击者控制 table_name 字段,这实际上可以利用吗?语言是python,数据库是sqlite fwiw
攻击者可以使用该代码做一些您可能不想要的事情。
SQLITE_MASTER那么他们可以检索元数据。databasename.tablename,那么他们可以从另一个数据库中检索数据。(select load_extension(...) from tablename)他们可能能够加载扩展。或者,他们可以通过将其括在括号中来运行他们想要的任何选择查询。
有时您必须连接字符串才能生成 SQL 语句。在这种情况下,您当然必须非常小心。变量表名就是这样一种情况。
在这种情况下,您可能应该使用内置的 likequoteIdentifier来确保您应对所有必要的情况。
我还将另外添加对允许字符的限制:
if(table_name.match(".*[^a-zA-Z_].*")) throw_big_error();
是的,这将表名限制在底层 RDBMS 支持的范围之外。
您是否需要支持带有空格的表名?或者在表名中禁止特殊字符是否可以接受?如果可以,请这样做。
“只是做对了,而不是问做错了是否安全”。
由于您正在审查代码,因此这是对编码员的评论。