1、一个问题引发的思考
大家在群里讨论了一个问题,奉文帅之命写篇作文,且看:
String user_web = "user_web"
String sql = "update user set user_web="+user_web+" where userid=2343";
大家看看这条sql有没有问题,会将user_web字段 更新成什么?
问题的结论是:执行后的记录结果跟执行前一样,(执行时的sql语句为
update user set user_web=user_web where userid=2343;
user_web字段值被update为自己原有的值),这与作者的本意想违背却很难被发现有问题。原来的语句漏掉了一对单引号,正确的写法应该是:
String sql = "update user set user_web='"+user_web+"' where userid=2343";
用这种写法将变量值传递到sql语句中,意图是达到了,但不是好的方式,理由如下:
(1).可读性差。单引号双引号混杂(试想有多个变量的情况,再想下如果稍一不慎在前面的单引号双引号直间多个空格又会怎样?)
(2).会造成潜在的性能问题和sql注入漏洞(对测试代码而言,这两点可能要求不高,但养成良好的编码习惯还是很重要的)
下面以非专业人员的角度大致分析下 ‘”+变量+”‘(未采用绑定变量方式)这种方式组织sql为什么会造成潜在的性能问题和sql注入漏洞问题
2、性能问题
Sql代码不采用绑定变量的方式可能会造成性能问题,表现在以下两个方面:
(1).导致相同的测试计划被重复执行
sql语句的执行过程分几个步骤:语法检查、分析、执行、返回结果。当一条sql通过语法检查后,会在共享池里寻找是否有跟其相同的语句,如果有则用已有的执行计划执行sql语句,如果没有找到,则生成执行计划,然后才执行sql语句。可见,后者比前者多了额外的步骤,消耗了额外的CPU,并导致sql总体执行时间延长,而这里的关键就是“共享池中是否有相同的sql语句”。
String username="test_xx";
String sql = "SELECT id,nick FROM user WHERE username='"+username+"'";
以这样的方式传递到数据库中的sql为
SELECT id,nick FROM user WHERE username='test_xx'
假定这个语句是第一次执行,会生成执行计划。当变量发生变化时(username=”test_yy”),数据库又接收到这样的语句
SELECT id,nick FROM user WHERE username='test_yy'
Oracle不认为以上两条语句是相同的,因此又会生成执行计划,而这两者的执行计划是一样的(做了重复的工作)
(2).导致共享池中的sql语句过多,加速SQL老化,造成共享池内部结构频繁维护。
如果一个某段程序未采用绑定变量的方式而又被大量调用,会导致共享池中不同的sql语句增多,而重用性极低,导致共享池内命中率下降。随着sql数量过多,一些语句逐渐老化,最终被清理出共享池。 而维护共享池内部结构要消耗大量的CPU和内存资源。
3、Sql注入漏洞
不采用绑定变量的方式可能会造成sql注入漏洞,本文仅仅通过示例说明为什么会造成sql注入漏洞,不对攻击方式、攻击类型等展开。以一个用户验证为例。
String sql = "SELECT id,nick FROM user WHERE username='"+username+"' AND password='"+password+"'";
以上代码接收从客户端传来的username和password变量,在数据库中查询验证。假设攻击者从客户端传的username为任意值(如test)password变量为'1' or '1'='1'此时替换变量后的sql变为
SELECT id,nick FROM user WHERE username='test' AND password='1' or '1'='1'
这样得到的结果就是user表中的所有数据了。
4、使用绑定变量
以上两种问题的解决方式就是使用绑定变量,就是在sql语句里不直接写变量,而是用占位符,在执行时再把占位符替换为具体的变量值。代码片段如下
String sql = "SELECT id,nick FROM user WHERE username=? AND password=?";
preparedStatement.setString(1,username);
preparedStatement.setString(2,password);
一些常用Jdbc工具对此进行了良好的封装,使代码更加简洁。比如Spring的SimpleJdbcTemplate
String sql = "SELECT id,nick FROM user WHERE username=? AND password=?";
jdbcTemplate.queryForList(sql,username,password);
上面 ?的做占位符的形式被称为顺序占位符,在传参数值时必须注意顺序对应,还有一种是名称占位符。同样以SimpleJdbcTemplate为例说明.
String sql = "SELECT id,nick FROM user WHERE username=:name AND password=:pass";
map.put("pass",password);
map.put("name",username);
jdbcTemplate.queryForList(sql,map);
上面的例子中的:name和:pass就是名称占位符,在执行时sql时再绑定变量。
iBatis中有两种占位符,#name# 和$name$两种方式,需要注意的是前者会在执行sql时绑定变量,而后者直接是替换为变量值,所以后者仍然存在sql注入漏洞问题。
5、未尽话题
接口测试要不要检查sql注入漏洞问题?这个问题值得商榷,个人认为通过常规的用例设计检查sql注入漏洞恐怕不太可行(工作量太大效果不一定好),如果要做的话可借助(或自己开发)一些工具,通过扫描静态代码再人工排查的方式进行。另外如果这项工作进行的太细致,恐怕会跟安全测试的工作重叠太多,当然如果在测试过程中发现开发的代码存在sql注入漏洞(这往往跟开发者编码习惯有关)问题,一定不要放过,进行排查还是很有必要的。
分享到:
相关推荐
SQL注入漏洞是网络安全领域中的一个重要话题,它涉及到数据库管理和Web应用程序的安全性。在这个"SQL注入漏洞演示源代码"中,我们可以深入理解这种攻击方式的工作原理,并学习如何防止它。 SQL注入是通过输入恶意的...
标题中的“瑞友天翼2024SQL注入漏洞poc”指的是瑞友天翼2024版本存在SQL注入漏洞,而POC(Proof of Concept)是指概念验证,通常是一个简单的程序或脚本,用于证明某个安全漏洞确实存在。在网络安全领域,POC是黑客...
【标题】"YXcms-含有SQL注入漏洞的源码包.zip" 提供了一个关键的安全问题,即SQL注入漏洞,这是许多网站和应用程序面临的一种常见威胁。SQL注入是指攻击者通过在输入字段中插入恶意SQL代码,以获取、修改、删除...
9. **访问网站,转到注入点**:通过浏览器访问网站,并找到可能存在漏洞的位置。 10. **构造注入语句**:在`keyword`参数中加入特定的SQL注入语句,例如`' or 1=1#`,并对其进行双URL编码。 11. **访问修改后的URL**...
SQL注入攻击者可以通过这个漏洞在数据库中执行恶意的SQL语句,从而对网站数据库进行非授权的操作。 ### SQL注入漏洞知识点 1. **SQL注入概念** SQL注入(SQL Injection)是一种攻击技术,攻击者通过在Web表单输入...
利用谷歌搜索SQL注入漏洞关键词 目标关键字+inurl:id 英语字母及单词+inurl:id 网站域名+inurl:id 阿拉伯数字+inurl:id inurl:asp?id= inurl:Article_Print.asp? EnCompHonorBig.asp?id=随便加个数字 showproduct....
SQL注入漏洞是Web应用程序安全领域的一个重要问题,它源于开发者在编写代码时未对用户输入数据进行充分的验证和过滤。当用户输入的数据被直接拼接到SQL查询语句中,攻击者可以通过精心构造的输入来执行非预期的...
- **安全性**:绑定变量可以防止SQL注入攻击,因为它不会将用户输入直接拼接到SQL语句中,而是作为参数传递,降低了恶意代码执行的风险。 2. **绑定变量的应用:** - **动态SQL**:在编程语言如Java、Python等与...
对SQL注入漏洞给相应检测及防御技术进行研究,通过本地创建的实验环境,将Pubs数据库作为案例和多种渗透方法实现SQL注入实验。以SQL注入攻击特点为基础,提出四种具体防御措施。实验表示,此防御措施Web应用系统能够...
本篇将探讨如何自己动手编写一个SQL注入漏洞扫描工具,通过分析提供的程序代码,我们可以了解基本的检测原理和技术。 首先,我们需要理解SQL注入的基本概念。当用户提交的数据被直接拼接到SQL查询中,而没有进行...
# (CVE-2019-13086)CSZ CMS 1.2.Xsql注入漏洞 ## 一、漏洞简介 CSZ CMS是一套基于PHP的开源内容管理系统(CMS)。 CSZ CMS 1.2.X版本(2019-06-20之前)中的core/MY_Security.php文件存在SQL注入漏洞。该漏洞...
### SQL注入漏洞详解及其修复方案 #### 一、SQL注入漏洞概述 SQL注入是一种常见的Web安全漏洞,攻击者可以通过在应用程序的输入字段中插入恶意SQL语句,来操控后端数据库执行非授权操作。这种攻击可能导致敏感数据...
标题与描述中的“SQL绑定变量”这一知识点,主要聚焦于SQL语句中如何使用变量,尤其是在存储过程或函数中动态构建SQL语句时的关键技术。绑定变量允许在SQL语句中使用程序变量作为参数,这不仅提高了代码的可读性和...
"YXcms-含有SQL注入漏洞的源码包 (3).zip" 这个标题表明我们正在处理一个名为 "YXcms" 的内容管理系统(CMS)的源代码包,这个版本(第3个)存在SQL注入漏洞。SQL注入是一种常见的网络安全问题,攻击者可以利用此...
在直接SQL注入方式中,攻击者将恶意SQL命令插入到用户输入变量中,该变量与SQL命令串联在一起。在二次SQL注入方式中,攻击者将恶意字符串通过报文植入数据库表中,未来在程序读取该库表字段时,被动态拼接为SQL命令...