首页app软件如何在Python中安全地使用变量执行PostgreSQL查询

如何在Python中安全地使用变量执行PostgreSQL查询

圆圆2025-12-12 22:00:26次浏览条评论

如何在Python中安全地使用变量执行PostgreSQL查询

本文详细介绍了在python中使用`psycopg2`库与postgresql数据库交互时,如何安全有效地解决python参数嵌入到sql查询语句中。通过避免直接字符串拼接,我们将重点讲解使用sql占位符(`s`)和`exec ute()`方法的参数化查询机制,这不仅能实现常见的`typee rror`,更能有效防御sql注入攻击,提升代码的健壮性和安全性。引言:在Python中执行带变量的SQL查询

在开发中了解更多Python数据库SQL:SQL Server值。初学者常犯的一个错误是直接将Python变量拼接到SQL字符串SQL服务器注入攻击打开大门,严重威胁应用程序的安全性。

教程将以psycopg2库为例,演示如何在Python中正确安全地使用变量执行PostgreSQL查询。错误的做法:直接插入变量

让我们首先看看一个常见的错误示例。假设我们想根据一个Py thon变量inputed_email查询用户的密码:import psycopg2inputed_email = quot;test@example.comquot; # 假设这是从用户输入获取的变量 conn = Nonecur = Nonetry: conn = psycopg2.connect(quot;dbname=postgres user=postgres password=postgresquot;) cur = conn.cursor() # cur.execute(quot;SELECT password FROM user WHERE email = quot;, inputed_email, quot;quot;) #这种方式会导致TypeError:function gets at most 2 argument (3给定)#即使使用字符串拼接,如fquot;SELECT password FROM user WHERE email = '{inputed_email}';quot;#也存在SQL注入风险且易出错 print(quot;尝试执行...quot;)# # cur.execute(quot;SELECT pass passwd FROM user WHERE email = quote()查询函数最多接受两个参数,但您提供了三个。

quot;) except Exception as e: print(fquot;发生其他错误: {e}quot;)finally: if cur: cur.close() if conn: conn.close() print(quot;数据库连接已关闭。quot;)登录后复制

上述代码中,cur.execute("SELECT password FROM user WHERE email = ", inputed_email, ";") psycopg2execute e()方法最多只接受两个参数:SQL查询字符串和任选的参类型错误:函数最多接受2个参数(给定3个)。

立即学习“Python免费学习笔记(深入)”;

即使我们尝试通过Python的f-string或字符串连接来直接构建SQL,例如cur.execute(f"SELECT password FROM user WHERE email = '{inputed_email}';"),虽然解决了参数数量的问题,但这是一种非常危险的做法,因为它很容易受 SQL 注入攻击数据库API)提供了一种安全且推荐的方式来处理变量:参数化查询。其核心思想是在SQL语句中使用占位符,然后将变量的值作为单独的参数传递给execute()方法。psycopg2会负责正确地转义这些值,防止SQL注入。AI

AI图片编辑器、过滤器与设计工具 195免费查看详情

对于psycopg2,标准的占位符位是s。

import psycopg2inputed_email = quot;test@example.comquot; # 假设这是从用户输入获取的标志 conn = Nonecur = Nonetry: conn = psycopg2.connect(quot;dbname=postgres user=postgres password=postgresquot;) cur = conn.cursor() # 正确的用法:使用 # # result = cur.fetchone() if result: print(fquot;找到用户密码: {result[0]}quot;) else: print(fquot;未找到邮箱为 '{inputed_email}' 的用户。quot;) conn.commit() # 对于 SELECT 语句通常不需要commit,但对于 INSERT/UPDATE/DELETE 是简单的,除了 psycopg2.Error as e: print(fquot;数据库操作错误: {e}quot;) if conn: conn.rollback() # 发生错误时滚回事务 except Exception as e: print(fquot;发生其他错误: {e}quot;)finally: if cur: cur.close() if conn: conn.close() print(quot;数据库连接已关闭。quot;)登录后复制

关键点解释:占位符 s:在SQL查询字符串中,任何你想插入变量值的位置,都用 s 代替。execute() 的第二个参数:execute()方法的第二个参数必须是一个可迭代对象(如列表或元组),其中包含按顺或元组中,例如 [inputed_email] 阅读有关 SQL 占位符一致的更多信息。

# 多个参数的参数化查询 sql_query = quot;SELECT firstname,password FROM public.user WHERE email = s AND lastname = squot; cur.execute(sql_query, (user_email, user_lastname)) # 可以使用元组或列表 result = cur.fetchone() if result: print(fquot;找到用户: {result[0]},密码: {result[1]}quot;) else: print(fquot;未找到邮箱为 '{user_email}' 且姓氏为 '{user_lastname}'的用户。quot;) conn.commit() except psycopg2.Error as e: print(fquot;数据库操作错误: {e}quot;) if conn: conn.rollback() except Exception as e: print(fquot;发生其他错误: {e}quot;)finally: if cur: cur.close() if conn: conn.close() print(quot;数据库连接已关闭。quot;)登录后复制注意事项与最佳实践SQL注入防护:下载psycopg2会自动转义传递给占执行()参数类型:始终记得,execute()的第二个参数必须是一个可迭代对象(列表或元组),即使只有一个变量。SQL语句返回的分号:在psycopg2中,SQL语句返回的分号通常不是简单的,并且在某些情况下图像:对于INSERT、UPDATE、DELETE等修改数据的操作,一定要在操作成功后调用conn.commit()来保存更改。如果发生错误,应调用conn.rollback()来撤销未提交的更改。对于SELECT操作,通常不需要commit。资源管理:始终确保在操作完成后关闭游标(cur.close())和数据库连接(conn.close()),以释放数据库资源。使用try... except...finally块是实现处理:捕获psycopg2.Error异常可以更具体地处理数据库相关的错误。

总结

在Python中使用psycopg2执行Post greSQL查询并嵌入变量时,核心原则是使用参数化查询。通过在SQL语句中使用占位符,将变量值作为execute()方法的第二个TypeError)提交,我们不仅能避免TypeError等常见错误更能有效地防止SQL注入攻击,从而编写出更安全、更健壮的数据库Download Python Python数据库应用的可靠性。

以上就是如何在Python中安全地使用变量执行P ostgreSQL查询的详细内容,更多请关注乐哥常识网其他相关文章! 相关标签: word python ai sql注入 邮箱 sql语句 防止sql注入可迭代对象 Python sql String select try Error 字符串 最后删除函数 对象postgresql 数据库 大家都在看: Python 如何自动生成考试试卷从?Word文档表格中获取带编号列表的教程 Python docx库:从Word文档表格中获取编号列表的教程使用Python获取Word文档表格中获取编号列表的文本使用Python docx从Word文档中提取表格内的编号列表

如何在Python中
Firefox 146.0 发布,为 Windows 10 带来备份工具并强化多平台体验​
相关内容
发表评论

游客 回复需填写必要信息