首页
技术博客
PHP教程
数据库技术
前端开发
HTML5
Nginx
php论坛
新用户注册
|
会员登录
PHP教程
技术博客
编程问答
PNG素材
编程语言
前端技术
Android
PHP教程
HTML5教程
数据库
Linux技术
Nginx技术
PHP安全
WebSerer
职场攻略
JavaScript
开放平台
业界资讯
大话程序猿
登录
极速注册
取消
热门标签 | HotTags
instance
uml
client
case
php
text
cmd
yaml
python
heatmap
object
frameworks
eval
join
less
heap
foreach
utf-8
copy
stream
web3
config
cSharp
bash
split
c语言
function
usb
random
input
actionscrip
io
cPlusPlus
search
java
express
main
spring
filter
httprequest
flutter
request
triggers
callback
php5
jsp
tree
process
hashset
import
perl
get
list
future
plugins
audio
fetch
typescript
python3
timezone
数组
merge
datetime
char
md5
httpclient
emoji
controller
select
const
bytecode
bitmap
default
erlang
expression
dockerfile
bit
install
shell
当前位置:
开发笔记
>
编程语言
> 正文
再看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
写下你的评论吧 !
吐个槽吧,看都看了
会员登录
|
用户注册
推荐阅读
php
深入理解 SQL 视图、存储过程与事务
本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ...
[详细]
蜡笔小新 2024-12-27 17:40:42
object
新浪笔试题
1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ...
[详细]
蜡笔小新 2024-12-27 19:32:17
object
USACO 2014 Jan - Moolympics区间记录优化算法
题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ...
[详细]
蜡笔小新 2024-12-27 18:14:31
copy
Objective-C 编程中的关键语法点
本文探讨了 Objective-C 中的一些重要语法特性,包括 goto 语句、块(block)的使用、访问修饰符以及属性管理等。通过实例代码和详细解释,帮助开发者更好地理解和应用这些特性。 ...
[详细]
蜡笔小新 2024-12-26 19:42:38
copy
Weight the Tree(树形dp)
题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!----- ...
[详细]
蜡笔小新 2024-12-26 15:55:56
object
Handling Null Object Encoding in OAuth 1.0a API Implementation
Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ...
[详细]
蜡笔小新 2024-12-28 08:54:34
text
java编写的简易计算器
主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ...
[详细]
蜡笔小新 2024-12-27 18:18:10
foreach
MyBatis 动态 SQL 详解与应用
本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ...
[详细]
蜡笔小新 2024-12-27 16:20:10
php
网站与MySQL数据库的连接与交互
本文详细介绍了如何通过多种编程语言(如PHP、JSP)实现网站与MySQL数据库的连接,包括创建数据库、表的基本操作,以及数据的读取和写入方法。 ...
[详细]
蜡笔小新 2024-12-27 14:09:23
object
DataGridView 保存时,为什么当前单元格的值无法保存?
在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ...
[详细]
蜡笔小新 2024-12-27 09:27:14
object
利用存储过程构建年度日历表的详细指南
本文将介绍如何使用SQL存储过程创建一个完整的年度日历表。通过实例演示,帮助读者掌握存储过程的应用技巧,并提供详细的代码解析和执行步骤。 ...
[详细]
蜡笔小新 2024-12-26 18:20:17
config
使用 SQLiteJDBC 和 HikariCP 实现 Java 程序连接 SQLite 数据库
本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ...
[详细]
蜡笔小新 2024-12-26 17:34:42
config
MySQL缓存机制深度解析
本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ...
[详细]
蜡笔小新 2024-12-26 15:15:06
text
VxWorks中的双向链表与环形缓冲应用
本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ...
[详细]
蜡笔小新 2024-12-26 13:26:16
input
Hadoop入门与核心组件详解
本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ...
[详细]
蜡笔小新 2024-12-26 13:12:48
mobiledu2502931997
这个家伙很懒,什么也没留下!
Tags | 热门标签
instance
uml
client
case
php
text
cmd
yaml
python
heatmap
object
frameworks
eval
join
less
heap
foreach
utf-8
copy
stream
web3
config
cSharp
bash
split
c语言
function
usb
random
input
RankList | 热门文章
1
Android控件RadioButton实现多选一功能
2
android handler.post和handler.sendMessage的区别和联系
3
Android编程之自定义ProgressBar示例
4
Android编程之手机壁纸WallPaper设置方法示例
5
Android selector的实例详解
6
Android对图片Drawable实现变色示例代码
7
ExpandableListView实现手风琴效果
8
Android编程之播放器MediaPlayer实现均衡器效果示例
9
Android自定义View展示Wifi信号强弱指示方法示例
10
Android自定义view圆并随手指移动
11
Android AIDL实现跨进程通信的示例代码
12
Android 逐帧动画创建实例详解
13
Android RollPagerView实现轮播图
14
Android view随触碰滑动效果
15
android 右滑返回的示例代码
PHP1.CN | 中国最专业的PHP中文社区 |
DevBox开发工具箱
|
json解析格式化
|
PHP资讯
|
PHP教程
|
数据库技术
|
服务器技术
|
前端开发技术
|
PHP框架
|
开发工具
|
在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved |
京公网安备 11010802041100号
|
京ICP备19059560号-4
| PHP1.CN 第一PHP社区 版权所有