【问题标题】:How can I know if my SQL query not expose to SQL injection我如何知道我的 SQL 查询是否暴露给 SQL 注入
【发布时间】:2021-12-07 07:15:28
【问题描述】:

我有一个原始的 SQL 查询:

f"SELECT FIELDS(ALL) from xxxx WHERE CreatedDate >= {start_time}"

我想让该查询免受 sql 注入攻击,但我不知道我怎么知道我做对了。 这是应该安全的新版本:

f"SELECT FIELDS(ALL) from xxxx WHERE CreatedDate >= %s" % (start_time,)

我在 API 调用中使用它。查询本身将在另一方(第三方)中执行。我想在 api 调用中将查询作为参数发送 我想得到一些关于这个问题的提示 谢谢!

【问题讨论】:

  • 您使用什么库/框架来执行查询?
  • 任何从基本字符串格式化方法构造的 SQL 查询都容易受到注入,您需要使用数据库库的参数化实用程序来确保正确转义值。
  • 我肯定不会是唯一一个不赞成在 API 中使用 Sql 的人吗?这主要表明 API 缺乏某些功能。
  • @Sprint21 你能添加更多关于 API 的信息吗?如果您不能按名称提及它,您是否可以查看它是否有任何参数化选项(请参阅下面的答案以获取示例)?

标签: python sql sql-injection


【解决方案1】:

任何时候您在代码中直接创建字符串时,都会将自己暴露在 SQL 注入中。您希望将数据处理传递给 DBMS。使用像SQLAlchemy 这样的 ORM 将处理很多问题(如果您使用 ORM 并且不直接传递您的 SQL)。大多数用于连接数据库的库都遵循 python 的DB api 标准。由于您没有提及您使用的是什么,我将使用 pyodbc 作为示例。

复制自docs

插入数据 要插入数据,请将插入 SQL 传递给 Cursor execute(),以及任何必要的参数:

cursor.execute("insert into products(id, name) values ('pyodbc', 'awesome library')")
cnxn.commit()

或者,参数化:

cursor.execute("insert into products(id, name) values (?, ?)", 'pyodbc', 'awesome library')
cnxn.commit()

注意参数化版本。这就是你想要的。这里 pyodbc 将您的查询和数据都交给 DBMS。 DBMS 将处理数据清理。这种形式称为 qmark 表示法(注意问号)。还有一些其他符号,但重要的部分是您使用参数化并将数据与查询分开传递。对于大多数库,这看起来像:

cursor.execute(query_string_with_qmark_notation, data_or_tuple_of_data)

【讨论】:

  • OP 不直接与 DBMS 交互,他们必须向 API 提交 SQL 查询。
  • @BradKoch 我现在看到了更新。虽然我倾向于同意 LukStorms 的观点,即接受 SQL 的 API 并不是最好的做法,但如果 OP 可以添加一些细节,我会很乐意更新我的答案
猜你喜欢
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
  • 2014-07-07
  • 1970-01-01
相关资源
最近更新 更多