找回密码
 加入怎通
查看: 196|回复: 0

什么是sql注入,这些坑得避开(常见的sql注入技术)

[复制链接]
我来看看 发表于 2023-03-23 00:21:03 | 显示全部楼层 |阅读模式
; 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

暂时无法加载帖子列表

回复

使用道具 举报

    您需要登录后才可以回帖 登录 | 加入怎通

    本版积分规则

    QQ|手机版|小黑屋|网站地图|真牛社区 ( 苏ICP备2023040716号-2 )

    GMT+8, 2026-10-1 06:33 , Processed in 0.074023 second(s), 24 queries , Gzip On.

    免责声明:本站信息来自互联网,本站不对其内容真实性负责,如有侵权等情况请联系420897364#qq.com(把#换成@)删除。

    Powered by Discuz! X3.5

    快速回复 返回顶部 返回列表