
假设用户执行! V6 z/ |) v# Y8 r
+ g# P% H9 g% {) @! x% t" k
select * from product where id = 5
1 \' V9 c" `) h ! n3 Z. L1 t# I* e3 M& O
这条语句。其中5是有用户输入的。$ h$ I( H- {( B) b
1 V8 U9 Y- b# Z" E( N SQL注入的含义就是,一些捣蛋用户输入的不是5,而是+ m& _) g s K, W4 ]9 g
+ ?: o- U6 E0 V; n8 Q: r+ q
' @3 ?0 D; x" @. s3 p N( F) Q- z/ S
3 V& L* b5 W$ m# j( L 5; delete from orders
& h5 F- E1 N* B8 F& P - q1 L p, X! T5 L' r7 I
8 U- C( J+ {" t
+ _2 Z) k& r+ n
那么原来的SQL语句将会变为,
, q) y# @4 J; w& ?" a8 Y ( X8 O' g6 g# H; X; s
; w# j O* @9 w3 ] select * from product where id=5; delete from orders
9 d2 G+ a5 a7 Z* W8 ~ .2 u: h4 H+ _1 r, q* N- U5 y
) @# v, K2 x7 V h$ M
在执行完select后,还将删除orders表里的所有记录。(如果他只删了这些记录,已经谢天谢地了,他可能会做更可怕地事情)。+ f% T- T% P% _; S7 O) }
$ ]7 I9 U% U# P7 p# B) E$ u1 X) o) w
+ n2 L4 s' q: o
' M4 z4 n2 C% [% l$ l! ^& Z& a 不过庆幸的是,Ibatis使用的是预编译语句(PreparedStatement
- T# }* w. N2 N0 \) j s )。
7 g+ ~! F. `6 g- Q: |0 D* @7 s3 \
' m2 A$ u1 C; R 上述语句会被编译为,. \& g2 U1 j0 }: z) H7 B- G
) u _4 l* ?1 G% n
5 {& K2 V/ @) S% [$ X" m% q9 m' ~' ] select * from product where id=? 7 T4 N, ]+ q$ H! M
: c' w7 J6 ]+ f 从而有效防止SQL注入。; t0 Q* m' c4 J. Q9 [$ j
( I, o- A# [' e5 G$ B. C+ u; }& ?
7 }5 }5 V' s1 X
! @% f: F: q" `6 s: Q& { 不过当你使用$占位符时就要注意了。/ `5 x# @. w* w/ j* I4 `
# @6 C7 Z+ l: e
例如:动态的选择列和表. ?! O: |3 S1 J* M2 y- G6 {
+ w' t- k1 F1 o3 ~3 Q2 u2 M ! \5 h ?2 H; j0 C) c
SELECT * FROM $TABLE_NAME$ WHERE $COLUMN_NAME$ = #value#
6 ]4 Z6 a# E/ l r; l 7 T+ ~, A% @/ H4 o
这时你一定要仔细过滤那些值以避免SQL注入。当然这种情况不只存在Ibatis中。
( S6 v" ]5 K" V1 Q7 Z! _9 }! S
, i& D- c: Q: _/ E) K! ?& x 参考资料: @) \# O# Q l( M
! n! j- Y' s) D6 Q4 h/ H
【iBATIS in Action】3.5.2 SQL injection 2 I& P, k! ^: K
& h( ~+ B! R; _; g$ w# b; M: v9 A |
|