python - 检测源代码中的 SQL 注入(inject)

标签 python sql security sql-injection static-code-analysis

考虑以下代码片段:

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)攻击的地方。换句话说,查询是通过字符串格式构造的,而不是在单独的参数中传递查询参数。

是否可以借助 pylintpyflakes 或任何其他静态代码分析包静态解决?


我知道 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

尽管该项目未得到积极维护,但可以用作起点。一个好主意是用它制作一个 pylintpyflakes 插件。

关于python - 检测源代码中的 SQL 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27402426/

相关文章:

python - 如何从 Python 程序中调用 OCaml 函数?

javascript - 垃圾邮件链接插入到我的 GitHub 页面网站

python - 如何在 python 中使用 espeak

python - 如何将依赖模式与 spaCy 匹配?

sql - Peewee中的字符串匹配(SQL)

php - PDO 只返回 mysql 的一半结果

php - 如何确保处理 ajax 请求的 PHP 脚本不可访问且用户已通过身份验证?

android - 是否可以阻止调试器在 Android 上附加?

python - CRC校验损坏的BZ2

带有文本数组的 sql IN 运算符