首页
技术博客
PHP教程
数据库技术
前端开发
HTML5
Nginx
php论坛
新用户注册
|
会员登录
PHP教程
技术博客
编程问答
PNG素材
编程语言
前端技术
Android
PHP教程
HTML5教程
数据库
Linux技术
Nginx技术
PHP安全
WebSerer
职场攻略
JavaScript
开放平台
业界资讯
大话程序猿
登录
极速注册
取消
热门标签 | HotTags
heatmap
plugins
yaml
range
hashtable
text
keyword
settings
string
substring
default
int
dockerfile
case
datetime
sum
emoji
expression
tree
erlang
fetch
shell
usb
timezone
dll
utf-8
header
jsp
copy
express
vba
main
format
bit
include
subset
python
command
cookie
php8
cpython
php
const
solr
replace
grid
uri
jar
hashcode
bitmap
web3
process
php7
scala
callback
input
integer
md5
export
数组
loops
triggers
random
vbscript
php5
iostream
window
schema
controller
httpclient
spring
require
metadata
dagger
object
search
eval
byte
future
当前位置:
开发笔记
>
编程语言
> 正文
再看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
写下你的评论吧 !
吐个槽吧,看都看了
会员登录
|
用户注册
推荐阅读
case
Go+ 中的上下文处理指南
本文详细介绍 Go+ 编程语言中的上下文处理机制,涵盖其基本概念、关键方法及应用场景。Go+ 是一门结合了 Go 的高效工程开发特性和 Python 数据科学功能的编程语言。 ...
[详细]
蜡笔小新 2024-12-28 11:05:31
int
优化ListView性能
本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ...
[详细]
蜡笔小新 2024-12-28 10:36:30
copy
编写有趣的VBScript恶作剧脚本
本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ...
[详细]
蜡笔小新 2024-12-28 09:46:23
case
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
case
网络链路质量监控:Smokeping部署与配置
本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ...
[详细]
蜡笔小新 2024-12-27 19:31:05
utf-8
Python 爬虫基础教程及代码实例
根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ...
[详细]
蜡笔小新 2024-12-26 10:42:40
header
HTTP请求与响应机制详解
本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ...
[详细]
蜡笔小新 2024-12-23 20:40:08
copy
Python——对象自省
对象自省自省在计算机编程领域里,是指在运行时判断一个对象的类型和能力。dir能够返回一个列表,列举了一个对象所拥有的属性和方法。my_list[ ...
[详细]
蜡笔小新 2024-12-23 12:55:35
jsp
新浪笔试题
1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ...
[详细]
蜡笔小新 2024-12-27 19:32:17
int
深入理解 SQL 视图、存储过程与事务
本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ...
[详细]
蜡笔小新 2024-12-27 17:40:42
int
深入理解Java中的volatile、内存屏障与CPU指令
本文详细探讨了Java中volatile关键字的作用机制,以及其与内存屏障和CPU指令之间的关系。通过具体示例和专业解析,帮助读者更好地理解多线程编程中的同步问题。 ...
[详细]
蜡笔小新 2024-12-27 17:26:33
header
深入解析Spring Cloud Ribbon负载均衡机制
本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ...
[详细]
蜡笔小新 2024-12-27 16:01:25
header
MyBatis:深入解析与应用
在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ...
[详细]
蜡笔小新 2024-12-27 12:17:16
header
Hadoop入门与核心组件详解
本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ...
[详细]
蜡笔小新 2024-12-26 13:12:48
shell
PostgreSQL中的模式管理
本文由瀚高PG实验室撰写,详细介绍了如何在PostgreSQL中创建、管理和删除模式。文章涵盖了创建模式的基本命令、public模式的特性、权限设置以及通过角色对象简化操作的方法。 ...
[详细]
蜡笔小新 2024-12-26 11:37:26
mobiledu2502931997
这个家伙很懒,什么也没留下!
Tags | 热门标签
heatmap
plugins
yaml
range
hashtable
text
keyword
settings
string
substring
default
int
dockerfile
case
datetime
sum
emoji
expression
tree
erlang
fetch
shell
usb
timezone
dll
utf-8
header
jsp
copy
express
RankList | 热门文章
1
天正关闭选择集,天正怎么关闭选择集
2
哪些水果农药含量比较高,农药残留最严重的水果排名
3
怎么把加密的PDF解密?安利几个办公小技巧
4
win8计算机可用内存不足,Win8.1频繁提示内存不足是怎么回事
5
张正友相机标定Opencv实现以及标定流程标定结果评价图像矫正流程解析
6
PB 产程进展图 下载
7
波音747仍然使用3.5寸软盘更新数据 可怜的工程师们每次要使用8张软盘
8
笔记本电脑无法连接wifi的原因分析及解决方法
9
量化交易的尬舞
10
jmeter自动化 一
11
如何更改歌华有线机顶盒的WIFI网络密码?
12
我写的新闻——Adobe校园行西工大站圆满落幕
13
14岁的黑客开发恶意软件,监视Mac用户长达13年
14
修改图片背景_偷偷教你一个少有人知的PPT图片处理技巧,超实用!
15
推荐:优质学术资源免费下载到手软!!!
PHP1.CN | 中国最专业的PHP中文社区 |
DevBox开发工具箱
|
json解析格式化
|
PHP资讯
|
PHP教程
|
数据库技术
|
服务器技术
|
前端开发技术
|
PHP框架
|
开发工具
|
在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved |
京公网安备 11010802041100号
|
京ICP备19059560号-4
| PHP1.CN 第一PHP社区 版权所有