【问题标题】:Fix Bandit SQL injection issue in pandas.read_sql()修复 pandas.read_sql() 中的 Bandit SQL 注入问题
【发布时间】:2021-10-13 18:09:26
【问题描述】:

我正在开发一个项目,该项目有很多在 python 中运行的查询。当我执行强盗检查时,我看到了问题 -

Test results:
>> Issue: [B608:hardcoded_sql_expressions] Possible SQL injection vector through string-based query construction.
   Severity: Medium   Confidence: Low
   Location: main.py:160
   More Info: https://bandit.readthedocs.io/en/latest/plugins/b608_hardcoded_sql_expressions.html

我使用原始 SQL 查询的所有地方都存在此问题。

如何修改字符串插值来解决问题?

示例代码 -

import pandas as pd

table_name = "orders"

df = pd.read_sql(sql=f'''
    SELECT * FROM {table_name};
''')

我尝试了以下方法,但没有成功。

import pandas as pd

table_name = "orders"

# Try 1
df = pd.read_sql(sql='''
    SELECT * FROM {};
'''.format(table_name))

# Try 2
df = pd.read_sql(sql='''
    SELECT * FROM %s;
''' %(table_name,))

我关注了this blog,但我可能无法使用来自psycopg2cursor 对象。所以,需要一些可以帮助字符串格式化和插值的东西,因为我可以在 pandas 库中使用它。

【问题讨论】:

    标签: python pandas sql-injection bandit-python


    【解决方案1】:

    如果您将 cur.fetchall 对象转换为数据框,那么它将起作用

    cur.execute("select instrument, price, date from my_prices")
    df = DataFrame(cur.fetchall(), columns=['instrument', 'price', 'date'])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-26
      • 1970-01-01
      • 1970-01-01
      • 2020-04-08
      • 1970-01-01
      • 2022-07-14
      • 2016-01-06
      • 2015-06-15
      相关资源
      最近更新 更多