
假设用户执行
! y3 u2 m- m9 C- f, f- n7 O
( t! @! ~; ~+ O# z7 W S' b4 e select * from product where id = 5 7 O C# \( \$ P/ |
" s3 O, k3 }8 A! V6 N, E% J: z
这条语句。其中5是有用户输入的。1 p) k, l# l' n& [7 H7 ]2 m# E' F: B
$ A: S7 {$ p m" R& [ SQL注入的含义就是,一些捣蛋用户输入的不是5,而是
" O! j$ D& b- w2 |+ l
5 s1 a' u% W+ e/ I3 b+ [# ?5 s ' c, t( G7 M! a" o
* k Y2 f. n+ U1 K7 o' Z, { 5; delete from orders1 z. i: u% [+ c6 f: F
: L# N1 x4 x8 R2 X
7 A* ?) b+ W) a9 I9 @$ e9 J
9 b* m6 P/ \$ G, x$ y* N3 p
那么原来的SQL语句将会变为,+ F6 W- c8 i& I4 V. ~9 o2 a
+ e0 m' Q; k, k* e
7 x* i2 m: h, {, j: @
select * from product where id=5; delete from orders 9 [# x8 o/ D( {5 F
.' g- K; U0 v% m" v
8 a, d- ~& T# ?# Z5 ]- G
在执行完select后,还将删除orders表里的所有记录。(如果他只删了这些记录,已经谢天谢地了,他可能会做更可怕地事情)。
! a6 e! \$ R+ i. ] x' A7 @) }% F& R# H
- W J& y0 u J4 A& I8 R ~
& `! q) S* _- M! I% K 不过庆幸的是,Ibatis使用的是预编译语句(PreparedStatement
`6 g4 T% y$ Q& _- a" u s )。$ S6 D0 J6 }8 I6 ?6 O. ?
, j4 x N* ?) w5 b$ w. K
上述语句会被编译为,# |/ K, d* _' C- E- l
3 { W6 l( M. p2 h/ \& P1 k4 d
- x. K5 Q$ C$ }8 Y
select * from product where id=?
0 [9 r6 [% i- N7 p7 }
* n6 y/ G$ H- ?/ E0 f8 q 从而有效防止SQL注入。2 ]$ ^3 Q( j: j
! S7 y, [6 \5 d8 Z6 _6 s. F
4 |! {& q! X+ m. \$ v- B$ ] 7 P7 J' U% i2 v' V6 w0 }5 a* a& L
不过当你使用$占位符时就要注意了。
! H6 U& f$ C* t8 l, d: I F0 J: D" A
8 D' h7 }* g/ q" h* Z2 A: ?* I$ L 例如:动态的选择列和表
' y0 J$ A7 q* n4 v7 x9 K# m
' i/ N, D$ |0 H3 Z f . J9 F" c. Q: x
SELECT * FROM $TABLE_NAME$ WHERE $COLUMN_NAME$ = #value#
8 K) j- s$ Y3 y! {2 G
: d6 C0 B4 a. c* F' n 这时你一定要仔细过滤那些值以避免SQL注入。当然这种情况不只存在Ibatis中。' ^' @6 Z# F" X0 z0 S$ g
9 ]: ^: [) f" n2 \& h; ^3 n& M
参考资料:
6 l) r# x+ N, @+ O, ~6 {: J1 ]% U : l' Y& p! t; d% g6 u
【iBATIS in Action】3.5.2 SQL injection ) Y9 A0 |9 g$ d' [) i" ^
; T% U0 w* k0 ^5 g3 U V7 z
|
|