搜索
首页数据库SQL确定SQL注入死透了么?

确定SQL注入死透了么?

Mar 15, 2021 am 09:46 AM
sql注入

确定SQL注入死透了么?

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

确定SQL注入死透了么?

后来的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}会被替换成?

<select id="queryAll"  resultMap="resultMap">
  SELECT * FROM order WHERE id = #{id}
</select>

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

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

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

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

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

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

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

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

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

tag in
<foreach collection="tag" item="item" open="("separatosr="," close=")">
#{tag} 
</foreach>

还有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注入死透了么?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:CSDN。如有侵权,请联系admin@php.cn删除
SQL:对数据管理的初学者友好方法?SQL:对数据管理的初学者友好方法?Apr 19, 2025 am 12:12 AM

SQL适合初学者,因为它语法简单,功能强大,广泛应用于数据库系统。1.SQL用于管理关系数据库,通过表格组织数据。2.基本操作包括创建、插入、查询、更新和删除数据。3.高级用法如JOIN、子查询和窗口函数增强数据分析能力。4.常见错误包括语法、逻辑和性能问题,可通过检查和优化解决。5.性能优化建议包括使用索引、避免SELECT*、使用EXPLAIN分析查询、规范化数据库和提高代码可读性。

SQL在行动中:现实世界中的示例和用例SQL在行动中:现实世界中的示例和用例Apr 18, 2025 am 12:13 AM

SQL在实际应用中主要用于数据查询与分析、数据整合与报告、数据清洗与预处理、高级用法与优化以及处理复杂查询和避免常见错误。1)数据查询与分析可用于找出销售量最高的产品;2)数据整合与报告通过JOIN操作生成客户购买报告;3)数据清洗与预处理可删除异常年龄记录;4)高级用法与优化包括使用窗口函数和创建索引;5)处理复杂查询可使用CTE和JOIN,避免常见错误如SQL注入。

SQL和MySQL:了解核心差异SQL和MySQL:了解核心差异Apr 17, 2025 am 12:03 AM

SQL是一种用于管理关系数据库的标准语言,而MySQL是一个具体的数据库管理系统。SQL提供统一语法,适用于多种数据库;MySQL轻量、开源,性能稳定但在大数据处理上有瓶颈。

SQL:初学者的学习曲线SQL:初学者的学习曲线Apr 16, 2025 am 12:11 AM

SQL学习曲线陡峭,但通过实践和理解核心概念可掌握。1.基础操作包括SELECT、INSERT、UPDATE、DELETE。2.查询执行分为解析、优化、执行三步。3.基本用法如查询雇员信息,高级用法如使用JOIN连接表。4.常见错误包括未使用别名和SQL注入,需使用参数化查询防范。5.性能优化通过选择必要列和保持代码可读性实现。

SQL:命令,mysql:引擎SQL:命令,mysql:引擎Apr 15, 2025 am 12:04 AM

SQL命令在MySQL中分为DQL、DDL、DML、DCL和TCL五类,用于定义、操作和控制数据库数据。MySQL通过词法分析、语法分析、优化和执行等阶段处理SQL命令,并利用索引和查询优化器提升性能。使用示例包括SELECT用于数据查询,JOIN用于多表操作。常见错误有语法、逻辑和性能问题,优化策略包括使用索引、优化查询和选择合适的存储引擎。

用于数据分析的SQL:商业智能的高级技术用于数据分析的SQL:商业智能的高级技术Apr 14, 2025 am 12:02 AM

SQL的高级查询技巧包括子查询、窗口函数、CTE和复杂JOIN,能够处理复杂数据分析需求。1)子查询用于找出每个部门工资最高的员工。2)窗口函数和CTE用于分析员工的薪资增长趋势。3)性能优化策略包括索引优化、查询重写和使用分区表。

MySQL:SQL的特定实现MySQL:SQL的特定实现Apr 13, 2025 am 12:02 AM

MySQL是开源的关系型数据库管理系统,提供了标准SQL功能和扩展。1)MySQL支持标准SQL操作如CREATE、INSERT、UPDATE、DELETE,并扩展了LIMIT子句。2)它使用InnoDB和MyISAM等存储引擎,适用于不同场景。3)用户可以通过创建表、插入数据和使用存储过程等高级功能高效使用MySQL。

SQL:使所有人都可以访问数据管理SQL:使所有人都可以访问数据管理Apr 12, 2025 am 12:14 AM

sqlmakesdatamanagectAccessibletoAllbyProvidingAsimpleyetpoperfultoolSetSetForQuerquereingAndManagingDatabases.1)ItworkswithrelationalDatabases,允许inserstospecefifywhattheywanttododowithththedata.2)

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境