python sql注入 Python防SQL注入秘籍大公开,你竟还不知道?

发布时间:2026/10/30 9:54:45
python sql注入 Python防SQL注入秘籍大公开,你竟还不知道? 中防止sql注入的方法详解更新时间为, 二零一七年二月二十五日, 十五时四十四分十秒, 作者是一只猿。SQL注入属于较为常见的网络攻击方式当中的一种, 它并非借助操作系统的漏洞来达成攻击行径, 而是瞄准程序员在编程那会儿所出现的疏忽之处, 借助SQL语句, 达成无需账号便可登录, 甚至还能对数据库予以篡改, 下面的这一篇文章着重给大伙介绍了有关针对SQL注入的防范举措, 有所需求的朋友能够去参考一番。前言众多人理应都清楚当下web漏洞里排在首位的便是sql了, 不论运用哪一种语言来开展web后端开发, 只要用到了关系型数据库, 或许都会碰到sql注入攻击方面的问题。那么在web开发的整个进程当中sql注入到底是怎样出现的, 并且又是怎样去把这个问题给解决掉的?当然, 我这儿可不打算去探讨别的语言究竟是怎样去避免sql注入这种情况发生的, 在网络上, 关于PHP博主注: 据说这是世界上最厉害的语言防止注入的各种各样的方法到处都有, 这些方法实际上是相似的, 在这儿我就通过举例来讲一下。起因造成漏洞的缘由, 最为常见的便是字符串拼接了, 当然, sql注入并非仅仅是拼接这一种情形, 还有诸如宽字节注入, 特殊字符转义等等诸多形式, 在此就讲讲最为常见的字符串拼接, 这也是初级程序员极易犯下的错误。首先咱们定义一个类来处理mysql的操作class Database: aurl 127.0.0.1 user root password root db testdb charset utf8 def __init__(self): self.connection MySQLdb.connect(self.aurl, self.user, self.password, self.db, charsetself.charset) self.cursor self.connection.cursor() def insert(self, query): try: self.cursor.execute(query) self.connection.commit() except Exception, e: print e self.connection.rollback() def query(self, query): cursor self.connection.cursor(MySQLdb.cursors.DictCursor) cursor.execute(query) return cursor.fetchall() def __del__(self): self.connection.close()这段代码, 在我先前好多好多脚本当中, 都是可以见到的, 那些涉及对mysql数据库进行操作的脚本, 我都会把它写进这个类里面, 那么, 这个类存在问题吗?答案是有这样的一个类, 存在着缺陷, 极易致使sql注入情况出现。关于为何会引发sql注入, 下面就要阐述一番。在此, 为对问题真实性予以验证, 写下一种举措, 以此去调用上面那个类之中的方法, 一旦出现差错, 便会直接将异常抛出。def test_query(articleurl): mysql Database() try: querySql SELECT * FROM article WHERE url articleurl chanels mysql.query(querySql) return chanels except Exception, e: print e该方法极其简易是一种极为常见的查询语句, 竟也运用了最为简单的字符串拼接来构成sql语句, 显而易见传入的参数能够操控, 若要开展注入测试, 只需在其值的后面添加上单引号便可进行sql注入测试, 对此不多作阐述, 肯定是存在注入漏洞的, 运行一遍脚本, 瞧瞧是啥结果。(1064, You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near t.tips at line 1)回显报错很眼熟的错误这里我传入的测试参数是t.tips下面再说一种导致注入的情况对上面的方法进行稍微修改后def test_query(articleurl): mysql Database() try: querySql (SELECT * FROM article WHERE url%s % articleurl) chanels mysql.query(querySql) return chanels except Exception, e: print e这个方法当中并非直接运用字符串拼接, 却是运用了 %s 用以替代即将传入的参数这般的方式, 看上去是不是极为类似那种做了预编译处理的 sql ? 那么这样的写法可不可以防止 sql 注入这一情况的发生? 去做一下测试就可以知晓, 回显如下。(1064, You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near t.tips at line 1)参照上面的测试得出的结果, 是相一致的, 因而这种方式同样是不可行的, 并且这种方式并非是针对预编译sql语句而言的, 既然如此那么要以怎样的做法才能够避免sql注入情况的发生之举呢?解决两种方案1 对传入的参数进行编码转义2 使用的模块自带的方法第一种方案, 实际上在诸多PHP的防注入方法当中都存在, 针对特殊字符开展转义或者过滤的操作。存在着第二种方案, 此方案是运用内部方法, 该部方法与PHP里面的PDO相类似, 仅依据这种情况, 对于处在上面位置处的数据库类来说, 进行一番简单的修改便是可行的了。修改后的代码class Database: aurl 127.0.0.1 user root password root db testdb charset utf8 def __init__(self): self.connection MySQLdb.connect(self.aurl, self.user, self.password, self.db, charsetself.charset) self.cursor self.connection.cursor() def insert(self, query, params): try: self.cursor.execute(query, params) self.connection.commit() except Exception, e: print e self.connection.rollback() def query(self, query, params): cursor self.connection.cursor(MySQLdb.cursors.DictCursor) cursor.execute(query, params) return cursor.fetchall() def __del__(self): self.connection.close()这里在执行之际, 会传入两个参数, 其中第一个是经过参数化的sql语句, 第二个是与之对应的实际的参数值。函数内部会针对传入的参数值开展相应的处理, 以此避免sql被注入。实际运用的方法像下面这样。preUpdateSql UPDATE article SET title%s,date%s,mainbody%s WHERE id%s mysql.insert(preUpdateSql, [title, date, content, aid])以防 sql 注入, 如此行事便可, 于传入一列表后, 于模块内部, 会把该列表序列化为一个元组, 随后开展操作。总结我在之前部分脚本里运用了存在 sql 注入破绽的代码, 会逐步改好, 行了, 上面这些便是这篇文章的所有内容, 期望本文内容能给大家的学习或者工作带去一定的助力, 要是有疑问大家能够留言沟通。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询