|
; q8 L3 e; Y! f- J8 q& z7 J% |
1、sql 注入是什么sql 注入就是用户通过输入的参数,拼接到原先的 sql 中,成为 sql 的一部分,从而影响 sql 的功能和执行结果2、sql 注入破坏力-小兵破坏力比如原先 sql 如下select , P7 T& E+ R' e
* fromuserwherename=用户名andpassword=密码;6 X8 l0 C: s* V
用户输入name:臻大虾-- 注释
% {' u( @' f, e6 w, B password:密码
* N+ L- k: N) e4 k& b& z# t4 k$ B 那最终的结果猜猜是什么?select * fromuserwhere ; t8 a9 V. O7 d3 q" V
name=臻大虾-- 注释 and password=密码;两个-- 代表注释,所以这条 sql 只需要输入用户名,就可以获取用户信息,跳过了密码的校验-boss 破坏力来个厉害的,比如用户输入以下参数 4 ~* _: O; C+ c5 L
name:臻大虾
: W9 ?6 k9 O' G9 a" { password:; droptableuser;-- 注释最终的 sql:select * fromuserwherename=臻大虾andpassword=; droptableuser
" i7 e4 k: |# k ;-- 注释;user 表居然被删除了,看到这,此时的你可能想原地爆炸3、对策3.1、PreparedStatement 预编译使用预编译,这样传入的参数,会被当作字符串,也就是被引号包起来拿刚才的例子,用户输入。
" f T4 F9 |- i3 g; _* z, b" x2 g name:臻大虾-- 注释
; J7 U/ x, F( [1 p- ?# ? password:密码
- ], B* \3 G1 z" ^+ s3 H; v 如果使用了预编译,那最终的 sqlselect * fromuserwherename=臻大虾\-- \注释 and password=密码;参数中的引号被转义,从而避免成为 sql 的一部分。 2 v+ _3 ?2 [: ^
3.2、有些语句不能预编译预编译获取参数是根据#,而$ 是拼接的意思#{}:解析为预编译语句的一个参数占位符${}:仅仅作为一个字符串,在动态 sql 中直接替换变量,传入什么值,就是什么值比如传入:臻大虾 or 1=1 ' y7 o. U1 @# t3 L; z7 A* J
1、SELECT * FROMuserWHEREname=#{name} //SELECT * FROM user WHERE name=\臻大虾\ or 1=12、SELECT * FROMuserWHERE : m% ]$ s$ ]% E( l" V/ \9 Z
name=${name} //SELECT * FROMuserWHEREname=臻大虾or1=1但是有些情况使用#会报错,比如 like、in 如果使用#会报错,而使用则不会,所以有些人就直接使用还有 order by,根据传入的参数排序,这些情况就会有 sql 注入的危险,那怎么办呢?
1 a. l# f6 S2 Z3 ?9 U likeselect * fromuserwherenamelike%#{name}% //会报错
* j; u/ f* Z, x" t select * fromuserwherenamelike%${name}% //正常
4 d3 w: L$ o+ J3 ^8 g, ~ 正确写法使用 mysql 的字符串拼接函数 concat 9 X+ ]/ z; K* I! I2 I0 n
select * fromuserwherenamelikeconcat(%,#{name},%)in正确写法,使用 foreach@Select("" +5 x0 }' o! t' \! U
"select * from user where id in "
% C) M: T0 h% Y% `% F C +1 M+ N/ x8 D# n5 ~' w% x( R* w/ o
" " +7 }6 P. h7 A5 ^. G) E
% ~8 { D7 }- B1 h& s* Z' U: F( | "#{item}" +4 `! `7 C6 D4 K2 q* d- `
""+. z( {9 K0 L; V2 U. q# ~
""); i' E# K, s$ D% ^) p
List getByIds(@Param("userIds") List userIds);
/ e) ^ T- `) X5 i8 K
0 V1 T C( a" j& n6 a/ I order by有时需要根据前端传入的参数来排序,此时就会有 sql 注入的危险,此时可以使用白名单比如List allowSortColumnList= Lists.newArrayList( 8 C. F0 g% X+ ]! Y3 T' s
"age","score");
4 z% ~9 D- y. J if(!allowSortColumnList.contains(sortParam)){; R1 k/ a9 Y: k# S0 X2 \, {
thrownew RuntimeException("can not sort by "
- T: {: c* G& s# }2 e +sortParam);( U9 Z$ w3 k4 u( G4 S4 C
}
. [6 A o p2 f 总结了很多有关于java面试的资料,希望能够帮助正在学习java的小伙伴由于资料过多不便发表文章,创作不易,望小伙伴们能够给我一些动力继续创建更好的java类学习资料文章,。
, e6 H- w* ?0 b2 I 请多多支持和关注小作,别忘了点赞+评论+转发。右上角私信我回复【03】即可领取免费学习资料谢谢啦!
& L( \# ~/ S$ s5 s 原文出处:https://mp.weixin.qq.com/s/qW_sOabkx5kK4obuJXSAUw
# K6 b; p/ ], U) X- V* P5 {0 W& `2 z& l6 ]. s& Y
7 r# g) d) v6 R6 |9 A: h' }* R# ?
4 E6 y' H- l: ^5 u8 Q
3 @* \: e$ d- k/ o
|