首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何避免Python中的SQL注入以查询Server?

如何避免Python中的SQL注入以查询Server?
EN

Stack Overflow用户
提问于 2022-11-13 10:51:11
回答 2查看 33关注 0票数 1

我正在执行一个sql查询,并将变量传递到其中。在当前上下文中,我将参数值作为f字符串传递,但此查询容易受到sql注入的影响。我知道有一种方法可以使用存储过程并限制对执行查询的用户的权限。但是,是否有一种方法可以避免不得不选择存储过程路由,或者修改此函数以防止SQL注入?

代码语言:javascript
运行
复制
I have the below query created to execute within a python app.
代码语言:javascript
运行
复制
def sql_gen(tv, kv, join_kv, col_inst, val_inst, val_upd):
    sqlstmt =  f"""
  IF NOT EXISTS (
          SELECT *
          FROM {tv}
          WHERE {kv} = {join_kv}
          )
      INSERT {tv} (
      {col_inst}
      )
      VALUES (
      {val_inst}
      )
  ELSE
      UPDATE {tv}
      SET {val_upd}
      WHERE {kv} = {join_kv};
      """
    engine = create_engine(f"mssql+pymssql://{username}:{password}@{server}/{database}")
    connection = engine.raw_connection()
    cursor = connection.cursor()

    cursor.execute(sqlstmt)
    connection.commit()

    cursor.close()
代码语言:javascript
运行
复制
EN

回答 2

Stack Overflow用户

发布于 2022-11-13 11:19:52

幸运的是,大多数数据库连接器都有查询参数,在这些参数中,您传递变量,而不是自己在查询中提供字符串,以防范您提到的风险。您可以在这里阅读更多内容:https://realpython.com/prevent-python-sql-injection/#understanding-python-sql-injection

示例:

代码语言:javascript
运行
复制
# Vulnerable
cursor.execute("SELECT admin FROM users WHERE username = '" + username + '");
# Safe
cursor.execute("SELECT admin FROM users WHERE username = %s'", (username, ));
票数 0
EN

Stack Overflow用户

发布于 2022-11-13 18:02:31

正如阿曼泽在他的答复中正确提到的那样,Python有安全的通径参数机制。

但是,查询中还有其他元素(表名和列名)不支持作为参数(绑定变量),因为JDBC不支持这些元素。

如果这些是来自不受信任的源(或者将来可能是这样),您应该确保验证这些元素。这是一个很好的编码实践,即使你是确定的。

有一些选择可以安全地做到这一点:

  • 您应该根据正验证限制您的表和列--确保唯一允许的值是被授权的值。

如果这不可能(因为这些是用户创建的?):

  • 您应该确保表或列名限制名称使用一组“安全”字符(字母数字和破折号、下划线.)
  • 您应该引用表名/列名--在对象周围添加双引号。如果这样做,您需要小心地验证名称中没有引号,并错误退出或转义引号。您还需要注意,添加引号将使名称区分大小写。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74420254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档