微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。+ r+ \- ^* C2 x+ s8 ~! _. v
* b: k0 B4 q ? 7 _2 s; `! ^) f& q
\api\StatusesApi.class.php9 x$ m! o: X8 ]5 A
" I) y) H% @, [* s% V/ lfunction uploadpic(){
! n# C6 E* q4 }2 n: t% A if( $_FILES['pic'] ){
/ o% r6 \5 P" j0 Q# h2 F //执行上传操作* y2 E8 }1 y3 W* P1 j; ?4 C
$savePath = $this->_getSaveTempPath();
: }0 C# ]5 c( |+ H4 G, { C$ N $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
/ \% o+ `* S3 S) M8 m1 o if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))9 z% y* I. N j
{2 |6 I) ]( u8 q& W9 [8 y
$result['boolen'] = 1;6 z/ }! m- y8 p3 u" o) N0 U
$result['type_data'] = 'temp/'.$filename;
6 n+ a" r# l% b2 E $result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;0 n4 ~5 u# ~$ O6 O; f
} else {
~+ B. i- Y9 M3 J $result['boolen'] = 0;3 Q( `9 [4 {5 f. L; v' `$ G* l6 f
$result['message'] = '上传失败';
$ w& n6 h' E1 G, w! b$ Q- h }$ t# a5 c4 }3 |/ Z3 ^+ p% |
}else{- V" |% x8 t0 h; b
$result['boolen'] = 0;5 f8 u1 O4 }: w, v5 S1 H( F6 z
$result['message'] = '上传失败';
* a- U& F( h5 c$ {6 R }7 x( k* A4 b# u; M+ Z
return $result;. Q0 u* c$ j6 c4 n/ r
}& Y7 K) C" J2 l& h; o) v
unloadpic()方法没有对文件类型进行验证
, x! J' L7 H4 I
" o3 n0 S: W& _9 s可以构建表单, 选择任意文件, 提交到! C, k# h Q: \( T e1 j
/index.php?app=w3g&mod=Index&act=doPost1 ^5 t% {1 J8 d" q: m6 |
1 B2 S3 S7 C. q6 H7 M在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
( X3 X- d1 n- v) m# T0 A
1 ~: r( |2 i& H& m" p
P- I5 B+ l2 l4 M' g在登录thinksns官方微博后,
* Y+ D) A$ K# T构建以下表单:1 g/ w4 `! h7 _
+ f+ [8 l3 e) B+ z" a
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />" @! Y, V1 L" H/ u
<textarea name="content">test</textarea>' v" f( V( I7 s% s1 M* f0 v
file: <input id="file" type="file" name="pic" />
) L+ X8 \) ]! E<input type="submit" value="Post" />! L. Q9 I5 P* f, {. m* ^( w
</form>
' a" U) F- T4 @' K去掉缩略图的前缀(small_ )
" B; a _3 H; |9 H修复方案:
4 q7 t- H1 |/ D$ w, s
( }6 s1 S( ^& B2 V$ \) r$ D% y. Q
. D. j2 k+ J) J E# R\api\StatusesApi.class.php
1 f4 e: L" b0 Z+ d& Y
& f- u, u4 O0 F$ A/ x: Efunction uploadpic(){
& Y6 L8 _$ _8 E' C* m" M4 Q' E /**' J" Q( V0 s1 @$ @# Z+ o
* 20121018 @yelo
- b) _( ]( }! R* i, [6 L * 增加上传类型验证
; v4 |/ J' ~, } */
1 Y a4 G! ]" C( s2 i) A. M8 a# X( ? $pathinfo = pathinfo($_FILES['pic']['name']);% p4 @+ \4 v& Q2 c* F
$ext = $pathinfo['extension'];0 Z# [3 G h7 @% r0 ^* y" I
$allowExts = array('jpg', 'png', 'gif', 'jpeg');: I, _: `$ M2 e7 d: l4 w4 i, |
2 ~7 B2 Q% V7 G9 e$ e( ]; e $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);9 `# C6 v. X2 r1 U
. ?* \' I# M8 d- W if( $uploadCondition ){
; H+ G) ?9 K$ s. H% M" } //执行上传操作! R+ V) E" Y# r& U3 i" E6 j
$savePath = $this->_getSaveTempPath();7 T+ ^7 N: Z" O! a: U
$filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
3 g* b+ a$ o @) p3 D# S if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))2 D8 i0 i4 ]/ Q% Y9 X* X
{2 Z6 e' }! J8 j' Q) B% C8 o
$result['boolen'] = 1;' t1 Q3 j$ g7 y9 N' b
$result['type_data'] = 'temp/'.$filename;$ p+ D f; d) D; g3 K: m. ~
$result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;3 @" g7 @4 A* B5 S
} else {3 d: W% ]$ ^9 Z1 o* K/ Q
$result['boolen'] = 0;6 D- N4 C, |! |. I/ b
$result['message'] = '上传失败';2 W: Q" C. n) z5 D, c
}
- f/ v* T- E, _/ J& \; m }else{
9 b+ v7 i2 M3 a1 m6 {6 z! _: F6 C $result['boolen'] = 0; j0 u# y, T. b) l7 }2 V
$result['message'] = '上传失败';5 I; t0 l9 A+ u& Y( Q
}: \ ]5 x+ s9 e! o. X
return $result;
$ R* Q) g/ r3 R' _. z; \ }
, k0 `- \' z" Q9 X% R$ v& ?/ L( p3 ?1 f& S
- j% V8 Q3 n: ] \% O) v |