首页
技术博客
PHP教程
数据库技术
前端开发
HTML5
Nginx
php论坛
新用户注册
|
会员登录
PHP教程
技术博客
编程问答
PNG素材
编程语言
前端技术
Android
PHP教程
HTML5教程
数据库
Linux技术
Nginx技术
PHP安全
WebSerer
职场攻略
JavaScript
开放平台
业界资讯
大话程序猿
登录
极速注册
取消
热门标签 | HotTags
input
merge
config
replace
command
install
heatmap
bit
string
golang
join
random
tags
lua
utf-8
dockerfile
case
python3
split
client
php7
email
select
vba
bitmap
cSharp
fetch
java
regex
substring
foreach
heap
node.js
cPlusPlus
solr
netty
copy
web
md5
format
integer
yaml
require
schema
dll
runtime
version
blob
eval
audio
hashset
typescript
spring
jsp
iostream
python
triggers
match
javascript
keyword
buffer
uri
function
jar
future
io
php8
bytecode
ip
python2
main
process
char
header
plugins
default
go
include
search
当前位置:
开发笔记
>
编程语言
> 正文
再看ibatisOrderBy注入问题
作者:mobiledu2502931997 | 来源:互联网 | 2024-09-27 19:50
接上文http:blog.itpub.net29254281viewspace-1318239领导让开发同学鼓捣一个可配置化的后台.又回到了原来的问题如果要灵活,很多参数要
接上文
http://blog.itpub.net/29254281/viewspace-1318239/
领导让开发同学鼓捣一个可配置化的后台.
又回到了原来的问题
如果要灵活,很多参数要从前端页面传过来,有SQL注入的风险.
如果参数化SQL,又很难做到灵活..
先看一个注入的例子:
import
java.sql.Connection;
import
java.sql.DriverManager;
import
java.sql.ResultSet;
import
java.sql.SQLException;
import
java.sql.Statement;
public
class
Test {
public
static
void
main(String[] args)
throws
SQLException {
String para=
"/index.html' union all select * from probe -- "
;
Connection conn = DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:3306/mvbox"
,
"xx"
,
"xx"
);
Statement ps=conn.createStatement();
ResultSet rs = ps.executeQuery(
"select * from probe where path='"
+para+
"'"
);
while
(rs.next()) {
System.out.println(rs.getString(
"host"
)+
":"
+rs.getString(
"path"
));
}
rs.close();
ps.close();
conn.close();
}
}
如果要避免这种风险,可以选择参数化
import
java.sql.Connection;
import
java.sql.DriverManager;
import
java.sql.PreparedStatement;
import
java.sql.ResultSet;
import
java.sql.SQLException;
public
class
Test {
public
static
void
main(String[] args)
throws
SQLException {
String para=
"/index.html' union all select * from probe -- "
;
Connection conn = DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:3306/mvbox"
,
"xx"
,
"xx"
);
PreparedStatement ps=conn.prepareStatement(
"select * from probe where path=?"
);
ps.setString(
1
, para);
ResultSet rs=ps.executeQuery();
while
(rs.next()) {
System.out.println(rs.getString(
"host"
)+
":"
+rs.getString(
"path"
));
}
rs.close();
ps.close();
conn.close();
}
}
为何参数化可以防止注入?
作为MySQL JDBC驱动来说(5.1.31),其实就是对敏感字符做了转义.
观察 com.mysql.jdbc.PreparedStatement 的 setString方法
可以看到有如下的替换过程
String parameterAsString = x;
boolean
needsQuoted =
true
;
if
(
this
.isLoadDataQuery || isEscapeNeededForString(x, stringLength)) {
needsQuoted =
false
;
// saves an allocation later
StringBuffer buf =
new
StringBuffer((
int
) (x.length() *
1.1
));
buf.append(
'\''
);
//
// Note: buf.append(char) is _faster_ than
// appending in blocks, because the block
// append requires a System.arraycopy()....
// go figure...
//
for
(
int
i =
0
; i < stringLength; ++i) {
char
c = x.charAt(i);
switch
(c) {
case
0
:
/* Must be escaped for 'mysql' */
buf.append(
'\\'
);
buf.append(
'0'
);
break
;
case
'\n'
:
/* Must be escaped for logs */
buf.append(
'\\'
);
buf.append(
'n'
);
break
;
case
'\r'
:
buf.append(
'\\'
);
buf.append(
'r'
);
break
;
case
'\\'
:
buf.append(
'\\'
);
buf.append(
'\\'
);
break
;
case
'\''
:
buf.append(
'\\'
);
buf.append(
'\''
);
break
;
case
'"'
:
/* Better safe than sorry */
if
(
this
.usingAnsiMode) {
buf.append(
'\\'
);
}
buf.append(
'"'
);
break
;
case
'\032'
:
/* This gives problems on Win32 */
buf.append(
'\\'
);
buf.append(
'Z'
);
break
;
case
'\u00a5'
:
case
'\u20a9'
:
// escape characters interpreted as backslash by mysql
if
(charsetEncoder !=
null
) {
CharBuffer cbuf = CharBuffer.allocate(
1
);
ByteBuffer bbuf = ByteBuffer.allocate(
1
);
cbuf.put(c);
cbuf.position(
0
);
charsetEncoder.encode(cbuf, bbuf,
true
);
if
(bbuf.get(
0
) ==
'\\'
) {
buf.append(
'\\'
);
}
}
// fall through
default
:
buf.append(c);
}
}
buf.append(
'\''
);
parameterAsString = buf.toString();
}
是不是可以使用 iBatis 的 $ 方式 增加灵活性,而在参数进入iBatis之前,手工进行一下敏感字符替换,而防止SQL注入攻击呢?
注入
http
view
sql
string
io
buffer
int
char
写下你的评论吧 !
吐个槽吧,看都看了
会员登录
|
用户注册
推荐阅读
java
Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ...
[详细]
蜡笔小新 2024-11-21 18:39:23
java
如何将955万数据表的17秒SQL查询优化至300毫秒
本文详细介绍了通过优化SQL查询策略,成功将一张包含955万条记录的财务流水表的查询时间从17秒缩短至300毫秒的方法。文章不仅提供了具体的SQL优化技巧,还深入探讨了背后的数据库原理。 ...
[详细]
蜡笔小新 2024-11-21 12:11:54
case
php + layui 文件上传 以及 拖拽上传
HTML: 将文件拖拽到此区域 ...
[详细]
蜡笔小新 2024-11-20 14:27:32
java
Java代码保护与混淆:ProGuard详解
在Java开发中,保护代码安全是一个重要的课题。由于Java字节码容易被反编译,因此使用代码混淆工具如ProGuard变得尤为重要。本文将详细介绍如何使用ProGuard进行代码混淆,以及其基本原理和常见问题。 ...
[详细]
蜡笔小新 2024-11-18 16:46:17
install
RTThread线程间通信
线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ...
[详细]
蜡笔小新 2024-11-18 14:56:11
java
JUnit下的测试和suite
nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ...
[详细]
蜡笔小新 2024-11-21 16:03:49
java
深入解析 org.apache.jena.atlas.lib.ByteBufferLib 的 acopyArray 方法
本文详细介绍了 Java 中 org.apache.jena.atlas.lib.ByteBufferLib 类下的 acopyArray 方法,并提供了多个实际应用中的代码示例,帮助开发者更好地理解和使用该方法。 ...
[详细]
蜡笔小新 2024-11-21 10:26:11
java
PostgreSQL与MySQL的语法差异详解
本文详细介绍了PostgreSQL与MySQL在SQL语法上的主要区别,包括如何使用COALESCE替代IFNULL、金额格式化的方法、别名处理以及日期处理等关键点。 ...
[详细]
蜡笔小新 2024-11-21 07:40:22
java
使用Service Locator模式实现高效的服务命名访问
本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ...
[详细]
蜡笔小新 2024-11-20 19:26:30
case
Bootstrap Paginator 分页插件详解与应用
本文深入探讨了Bootstrap Paginator这款流行的JavaScript分页插件,提供了详细的使用指南和示例代码,旨在帮助开发者更好地理解和利用该工具进行高效的数据展示。 ...
[详细]
蜡笔小新 2024-11-20 13:39:53
java
fleaframedb使用之JPA封装介绍
flea,frame,db,使用,之 ...
[详细]
蜡笔小新 2024-11-20 12:00:16
command
UE4 中的距离场技术详解
本文将深入探讨 Unreal Engine 4 (UE4) 中的距离场技术,包括其原理、实现细节以及在渲染中的应用。距离场技术在现代游戏引擎中用于提高光照和阴影的效果,尤其是在处理复杂几何形状时。文章将结合具体代码示例,帮助读者更好地理解和应用这一技术。 ...
[详细]
蜡笔小新 2024-11-19 18:21:03
java
如何使用 org.apache.tinkerpop.gremlin.structure.VertexProperty 的 key 方法
本文详细介绍了 `org.apache.tinkerpop.gremlin.structure.VertexProperty` 类中的 `key()` 方法,并提供了多个实际应用的代码示例。通过这些示例,读者可以更好地理解该方法在图数据库操作中的具体用途。 ...
[详细]
蜡笔小新 2024-11-21 17:38:10
select
SQL Server 存储过程实现高效分页查询
本文介绍了一种使用SQL Server存储过程来实现基于单一条件的高效分页查询的方法。通过示例代码,详细说明了如何构建和执行这种分页查询。 ...
[详细]
蜡笔小新 2024-11-21 17:23:20
java
二维码的实现与应用
本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ...
[详细]
蜡笔小新 2024-11-21 17:10:15
mobiledu2502931997
这个家伙很懒,什么也没留下!
Tags | 热门标签
input
merge
config
replace
command
install
heatmap
bit
string
golang
join
random
tags
lua
utf-8
dockerfile
case
python3
split
client
php7
email
select
vba
bitmap
cSharp
fetch
java
regex
substring
RankList | 热门文章
1
微信小程序环形图/折线图(canvas)
2
Mac容易出现的故障及解决办法详解
3
鸂字意思 在新华字典的读音解释笔画常用组词起名
4
os.system返回什么,如何转换其输出?
5
《消逝的光芒》新手如何生存
6
python类方法中使用:修饰符@staticmethod和@classmethod的作用与区别,还有装饰器@property的使用
7
01 MQTT介绍
8
ROW_NUMBER,自治事务--工作备忘2016/1/7
9
python3 解析html_Python 3 解析 html
10
d导入更好C的链接器错误
11
搭载GeForce RTX 3060独显 8499元即可入手华硕天选3游戏本
12
PHP对于建括号字符过滤的问题
13
ping简单的测网速
14
咔嚓咔嚓,我的办公电脑被安全中心扫出了几万个“病毒”
15
faster rcnn如何生成anchors
PHP1.CN | 中国最专业的PHP中文社区 |
DevBox开发工具箱
|
json解析格式化
|
PHP资讯
|
PHP教程
|
数据库技术
|
服务器技术
|
前端开发技术
|
PHP框架
|
开发工具
|
在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved |
京公网安备 11010802041100号
|
京ICP备19059560号-4
| PHP1.CN 第一PHP社区 版权所有