pymysql详解(connect连接、游标cursor、获取查询结果集、获取实时数据、解决查询数据为历史数据问题、insert into需要注意的地方)

您所在的位置:网站首页 连接查询结果怎么查询 pymysql详解(connect连接、游标cursor、获取查询结果集、获取实时数据、解决查询数据为历史数据问题、insert into需要注意的地方)

pymysql详解(connect连接、游标cursor、获取查询结果集、获取实时数据、解决查询数据为历史数据问题、insert into需要注意的地方)

2024-07-09 16:11| 来源: 网络整理| 查看: 265

​ 在执行查询操作的时候要尽量避免 使用%s 或者 format() 的字符串替换操作,这样是为了避免sql注入的发生

​ sql 注入指:字符串替换操作中如果出现了 如下操作时,返回的结果将是全部数据

sql = "select * from table where id={}".format('5 or 1=1')

​ 字符串替换的方式将会让攻击者有机可乘,攻击者猜测后台数据库的查询语句使用的拼接字符串等方式,从而经过设计为服务端传参,令其拼接处特殊字符串的SQL语句,返回攻击者想要的结果,所有,永远不要相信客户端传来的数据是规范及安全的!

​ 解决此问题的方法:

​ 参数化查询,不仅可以有效的防止注入攻击,还可以提高查询的效率

cursor.execute(query,args=None)

​ args必须是元组 列表或字典,如果查询字符串使用%(name)s,就必须使用字典.

​ 例如:

sql = "select * from table where name like %s and age < %s" cursor.execute(sql,('tom%',25)) 或者 sql = "select * from table where name like %(name)s and age < %(age)s" cursor.execute(sql,{'name':'tom%','age':25})

​ 参数化查询提高了效率,原因是–SQL语句缓存. ​ 数据库服务器一般会对SQL语句编译和缓存,编译只对SQL语句部分,所以参数就算有SQL指令也不会被当作指令执行. ​ 编译过程,需要词法分析、语句分析、生成AST、优化、生成执行计划等过程,比较耗费资源。 ​ 服务端会先查找是否对同一条查询语句进行了缓存,如果缓存未失效,则不需要再次编译,从而降低了编译的成 本,降低了内存消耗。 ​ 可以认为SQL语句字符串就是一个key,如果使用拼接方案,每次发过去的SQL语句都不一样,都需要编译并缓存。 大量查询的时候,首选使用参数化查询,以节省资源。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3