微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。1 Z% B, s( p* M- f; ^" Q2 @
: r! L/ }' O, ~6 V& I! a 0 P/ O! O$ `* p* ?' @- D' }
\api\StatusesApi.class.php/ `% V& O9 V6 y7 }! Y5 W! H& J' V) _
9 `, X+ d1 C0 H2 X* \function uploadpic(){2 G6 ?% j! N/ h6 U
if( $_FILES['pic'] ){
3 w( ^# G J. k9 S9 ~7 m" k) h //执行上传操作
L/ w5 k( O) j. q $savePath = $this->_getSaveTempPath();7 r2 f5 y; A' y1 i4 h1 ~# U
$filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
% S% n# f4 p/ E2 F( t+ Z if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
- ~, U( b% T1 D7 ~& a: j! \5 V' T {$ Z2 M3 f- x! Z8 V" H" m! d5 G
$result['boolen'] = 1;
2 n8 q: K2 s/ ~8 I $result['type_data'] = 'temp/'.$filename; l- Z" O( t- u& p6 {4 t
$result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;$ v$ ^1 Y! N, u- R2 ] P
} else {/ r0 m. }; ?, D9 C, V* B
$result['boolen'] = 0;) r7 n1 M+ t0 G( A/ |- N
$result['message'] = '上传失败';
6 f& P& [5 }% {5 Q }
' O% j* i" q0 N8 G! O }else{
( u1 K1 C2 i1 e Z6 | $result['boolen'] = 0;
; ^5 n* g/ j7 z $result['message'] = '上传失败'; I6 k6 U9 }7 l/ t
}9 _2 s9 P* \ d' I) R
return $result;
4 I2 t% U0 B' i' f- ^' H }
6 H( X7 F/ V1 [- z9 Dunloadpic()方法没有对文件类型进行验证
* A8 @4 ^$ R$ r" Z4 s8 T$ C$ |3 [3 i- f % i# H9 w. k) d
可以构建表单, 选择任意文件, 提交到( Z8 N' U) N5 ]# _2 T3 n8 o& M7 Z
/index.php?app=w3g&mod=Index&act=doPost
* \- Z# V& }4 ]+ f
7 s4 b$ f7 s2 t( H在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
1 ^7 z! } H9 V- M; m& ]
& |' Z9 {% f+ C7 }( d+ h) c0 R: X) \0 o% S" @! o
在登录thinksns官方微博后,
. G3 ~' E' N5 j& I7 Y2 N构建以下表单:% |3 U& r c' i2 f! z4 _
1 O; ]8 h7 P" ~" n% F& l" P/ i<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
0 F) M9 o! Q8 D# x, `* ~( n: n6 J/ c" ^9 C<textarea name="content">test</textarea>
% v( ~4 d% l1 | {- _! ?file: <input id="file" type="file" name="pic" />
9 B( u4 ?% O1 g, A$ m" X9 |. o0 R<input type="submit" value="Post" />( P) d6 [, d6 n/ I/ f8 m. Z% @( B2 t
</form> A/ e2 A5 n) a9 F ^2 L6 C# c
去掉缩略图的前缀(small_ )
4 Q' l3 Q* J" `$ B2 r9 C7 R修复方案:' Q# @+ B- |! y j* w0 L
& ]6 V$ p) K" \4 e: i7 A6 O8 m/ Y' g, N
\api\StatusesApi.class.php0 c! r7 X# _; H) w* `) ^3 R
9 a% C0 v2 S) o' M7 w7 A' W8 L( gfunction uploadpic(){! z* o7 b3 q, }9 X7 ]3 K
/**
L6 {- y1 S! |* }/ }, S( e3 G * 20121018 @yelo- U4 C" S* W6 ~: n
* 增加上传类型验证
3 [+ }1 g z4 P% ^! O$ R5 Z+ ?6 k5 Z */! v, m$ Q4 P$ l M$ f
$pathinfo = pathinfo($_FILES['pic']['name']);, F& i2 _& Q) P( Y/ F
$ext = $pathinfo['extension'];
. N, C1 P' G) S7 @3 G8 P) K7 ~ $allowExts = array('jpg', 'png', 'gif', 'jpeg');
% y+ a8 W H' O5 m. h0 x$ ~ % V2 a' M2 [, _5 o) f
$uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
% a$ ]" ~# V1 E0 c
1 K7 k. Q2 E4 c! u if( $uploadCondition ){
/ }" M1 S* w9 }4 f //执行上传操作
! H% N1 X. _+ X. T4 L7 J/ K5 x5 ? $savePath = $this->_getSaveTempPath();- ], }5 U- A0 c% \ v. R' [
$filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
$ H! s" X* s @ if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
1 ?; S2 E9 O6 n; l- e {" [' K; Z+ B4 H
$result['boolen'] = 1;* y) ^ O5 L+ i! x6 `4 Z1 @. r8 g
$result['type_data'] = 'temp/'.$filename;) O% |* E; F; q1 @
$result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;, ^3 l+ W2 B$ f) E+ {. ?/ n* A
} else {
$ j) s) z1 I- U* k $result['boolen'] = 0;! z2 t$ b- R1 M# Y1 S0 F2 v- \" e
$result['message'] = '上传失败';! ^6 Z( y. A" y* I# Y6 P
}
) K/ y. p* e7 s' w6 Q. P, N* ~8 X }else{
' v: _/ g# C; v$ R* O* J $result['boolen'] = 0;7 u, E) F# f0 k1 H# G+ R% g! k K/ \
$result['message'] = '上传失败';% c8 g3 Q0 ?% m
}
- D- N2 }; V* E3 d6 u0 p- d' ^return $result;
& d. O2 \- @/ o, M& E }$ F) T. r" k$ Z
4 z5 Q8 W* B7 b% t) e6 l( }: P# W. s- ?
|