热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

确定SQL注入死透了么?

很长一段时间,我认为后端开发,在安全性方面最容易出问题的地方就在于SQL注入。通过where11这种魔幻的SQL写法,就可以很容易的对一个存在问题的系统进行攻击,以至于最终演进出sqlmap这样的神器存在。

后来的fastjson刷新了我的认知,这个框架也算是对互联网安全概念的一种推动。连不懂技术的老板,都知道fastjson快的要命,作为程序员安全理念就得到了一次提升。

推荐(免费):sql

为什么对sql注入情有独钟?因为开发人员和SQL打交道的地方太多了。甚至有的专门开发报表的同学,写的SQL行数,比写的代码行数还多!

问题是。很久很久之前,早在10年前,就有人在喊SQL注入已经死掉了,但时至今日,依然有一大批的SQL注入教程和SQL注入的案例。

SQL注入是漏洞之王,这可不是吹的。

当然在这方面,PHP的贡献最大,Java甘拜下风。

SQL注入流行的原因,就是开发人员对自己太自信了,或者使用的工具太原始了,没有经过框架层进行一次过滤。如果你用了Java界的MyBatis或者JPA,发生SQL注入的可能性就变的非常的低。现在PHP也有了类似于thinkphp一样的框架,代表着能搞的SQL注入漏洞已经越来越少了。

但不代表着没有,只是门槛提高了。我们以MyBatis为例,看一下到底还能不能发生SQL注入。

MyBatis依然存在SQL注入

使用Mybatis的同学,第一个接触的概念,就是#$的区别。这两个符号非常的像Shell中的魔幻符号,但好在只有两种情况。

  • # 代表的是使用sql预编译方式,安全可靠

  • $ 代表着使用的是拼接方式,有SQL注入的风险

比如下面这个xml配置,就是一个绝对安全的写法。因为整个#{id}会被替换成?

但可惜的是,有些场景,并不能使用预编译方式(或者你仅仅是不知道或者懒)。像一些代码重构,把表名/列名/排序等字段,动态传入的时候,不可避免的就需要SQL拼接的方式,SQL注入依然有搞头。

但更容易发生问题的,还是LIKEIN等类似的语句。

下面是两句Like模糊查询的写法,实际测试会发现,使用#竟然不好使了,会报错,需要使用sql拼接的$。问题由此发生。

SELECT * FROM order WHERE name like '%#{name}%'  //会报语法错
SELECT * FROM order WHERE name like '%${name}%'  //可以运行

而正确的写法,应该使用函数拼接。但是工期压死人,在不知不觉间,大多数人就选择了简单的写法。毕竟功能第一嘛,也是体现工作量的最主要方式。

SELECT * FROM order WHERE  name like concat(‘%’,#{name}, ‘%’) //正确的写法

同样的问题,存在于IN语句。

in (#{tag}) //报错
in (${tag}) //可以运行

既然几个字符就可以运行,当然没人选择下面复杂的写法。

tag in

#{tag} 

还有order by,也千万不要掉以轻心,一不小心就会万劫不复。

SELECT * FROM order order by createDate #{sortType} //报错
SELECT * FROM order order by createDate ${sortType} //正常

这种情况下,就需要把sortType搞成白名单了。不就一个ASC和DESC了,你给我传一个长长的串,是怎么回事?

总结

SQL注入在2021年,依然存在,只不过门槛提高了。现在SQL注入减少,都是框架的功劳,和程序员的水平没半毛关系。sql拼接的情况永远不会消失,因为这是最快捷简单的方式,会让人欲罢不能。无数的外包项目,十几年躺尸不动的系统比比皆是,寄希望于在框架层全部消灭SQL注入,是一个梦想。

因为它的对手,是人性的懒惰。谁也无法战胜它。

以上就是确定SQL注入死透了么?的详细内容,更多请关注其它相关文章!


推荐阅读
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 本文介绍了一个免费的asp.net控件,该控件具备数据显示、录入、更新、删除等功能。它比datagrid更易用、更实用,同时具备多种功能,例如属性设置、数据排序、字段类型格式化显示、密码字段支持、图像字段上传和生成缩略图等。此外,它还提供了数据验证、日期选择器、数字选择器等功能,以及防止注入攻击、非本页提交和自动分页技术等安全性和性能优化功能。最后,该控件还支持字段值合计和数据导出功能。总之,该控件功能强大且免费,适用于asp.net开发。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 从高级程序员到CTO的4次能力跃迁!如何选择适合的技术负责人?
    本文讲解了从高级程序员到CTO的4次能力跃迁,以及如何选择适合的技术负责人。在初创期、发展期、成熟期的每个阶段,创业公司需要不同级别的技术负责人来实现复杂功能、解决技术难题、提高交付效率和质量。高级程序员的职责是实现复杂功能、编写核心代码、处理线上bug、解决技术难题。而技术经理则需要提高交付效率和质量。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
author-avatar
容容1217_778
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有