1 概述
SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,当前端传入后端的参数是攻击者可控制的时,攻击者可以通过构造不同的SQL语句来对数据库进行任意查询,实现无账号登录,甚至篡改数据库。
SQL注入主要原因是程序员在开发用户和数据库的系统时没有对用户输入的字符串进行过滤、转义、限制或处理不严谨,导致攻击者可以通过精心构造的字符串去非法获取到数据库中的数据。
2 SQL注入方式
常见的SQL注入方式包括以下几种:
1)基于错误的SQL注入
攻击者通过输入特定的SQL代码,使应用程序产生错误,并通过错误信息获取数据库结构或其他敏感信息。
2)联合查询注入
攻击者利用UNION操作符将多个SELECT语句组合在一起,以获取额外的数据。
3)盲注
当应用程序不显示错误信息时,攻击者可以通过观察应用程序的行为(如响应时间、页面变化等)来推断数据库的信息。
- 布尔盲注:通过发送不同的SQL查询并根据应用程序的响应来判断查询结果。
- 时间盲注:通过发送会导致数据库延迟响应的SQL查询,根据响应时间来判断查询结果。
4)堆叠查询注入
在支持多条SQL语句同时执行的数据库中,攻击者可以通过分号(;)分隔多条SQL语句,执行额外的操作。
5)带外注入
攻击者通过SQL查询将数据发送到外部系统,例如通过DNS请求或HTTP请求,从而绕过传统的检测方法。
3 防SQL注入方法
JDBC数据视图需要防SQL注入时,首先需要开启视图文件属性中的“禁止SQL注入”开关。
开启后,视图设计时提供两种防SQL注入方式:参数转义方式和预处理SQL方式。
3.1 参数转义方式
参数转义方式主要对参数值中的特殊字符进行转义处理,视图的查询参数配置时,不勾选“预处理SQL方式”即可。
该方式是将参数值中引号等字符进行转义后放入SQL中,参数值是直接替换到SQL中再进行执行的。
支持转义的特殊字符包括:\ 、< 、 > 、& 、* 、; 、’ 、”。
处理方式为:
1)单引号前都加单引号转义,即’前再加一个’;
2)数据库为MySQL时,除单引号外的其他字符加\转义。
但该方式存在如下问题:
1)由于是非参数化的执行方式,对参数值做了引号(’)和关键字的替换,执行性能比较低;
2)由于做了关键字替换,导致带来了副作用:搜索值内不能含有关键字内容,如: or、and等。
3.2 预处理SQL方式
预处理SQL的方式是通过对参数进行占位处理,执行SQL时SQL中的占位符会被实际参数值替换,确保参数值的安全性和正确性。
3.2.1 实现原理
预执行SQL方式的实现分为两个步骤:
1、预编译sql语句
按照参数占位生成预编译的SQL,提交到数据库服务器,预编译会解析SQL语句,优化查询计划,编译完的SQL可以重复利用。
2、参数化执行
执行SQL时将SQL中的占位符替换为实际参数值进行执行。
3.2.2 优点
- 提高性能
预处理SQL语句减少了每次执行时的解析和优化开销,特别是在频繁执行相同或相似的SQL语句时,性能提升明显。
- 增强安全性
参数化查询有效防止SQL注入攻击,因为参数值被正确处理为对应的数据,而不是SQL代码的一部分。
最后编辑:fancy 更新时间:2025-04-24 11:27
