考虑以下代码片段:
import MySQLdb
def get_data(id):
db = MySQLdb.connect(db='TEST')
cursor = db.cursor()
cursor.execute("SELECT * FROM TEST WHERE ID = '%s'" % id)
return cursor.fetchall()
print(get_data(1))
代码中存在一个主要问题 - 它容易受到 SQL 注入(inject)攻击,因为查询不是通过 DB API 参数化的,而是通过字符串格式构造的。如果您以这种方式调用该函数:
get_data("'; DROP TABLE TEST -- ")
将执行以下查询:
SELECT * FROM TEST WHERE ID = ''; DROP TABLE TEST --
现在,我的目标是分析项目中的代码并检测所有可能易受 SQL 注入(inject)攻击的地方。换句话说,查询是通过字符串格式构造的,而不是在单独的参数中传递查询参数。
是否可以借助 pylint
、pyflakes
或任何其他静态代码分析包静态解决?
我知道 sqlmap
流行的渗透测试工具,但据我所知,它是针对网络资源工作的,通过 HTTP 请求将其作为黑盒进行测试。
最佳答案
有一个工具可以准确解决问题,py-find-injection
:
py_find_injection uses various heuristics to look for SQL injection vulnerabilities in python source code.
它使用 ast
module , 查找session.execute()
和cursor.execute()
调用,并检查里面的查询是否通过string interpolation, concatenation or format()
形成.
这是检查问题中的片段时输出的内容:
$ py-find-injection test.py
test.py:6 string interpolation of SQL query
1 total errors
尽管该项目未得到积极维护,但可以用作起点。一个好主意是用它制作一个 pylint
或 pyflakes
插件。
关于python - 检测源代码中的 SQL 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27402426/