微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
) Z7 _# P$ w. f7 g8 W) z, c3 @% s6 l; c
: e) T6 p/ A! u" p; a% S- c\api\StatusesApi.class.php) F* [% R E; z3 F& T4 b6 w b
1 l/ P/ J( U( W* \function uploadpic(){
, ]4 m+ y! X+ ~3 i! u A) v if( $_FILES['pic'] ){3 O0 h6 H1 `) |' z" U3 G! Y
//执行上传操作$ ?. }3 b1 o5 h* z7 O
$savePath = $this->_getSaveTempPath();
; O% R6 }$ \1 Q% K8 L $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);* l) S; c4 }6 @" X7 h' Z
if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
4 `3 S, M( a7 I U3 f {' j' b+ a1 I8 H1 J: I
$result['boolen'] = 1;
2 P( T6 y5 z- W, y' d $result['type_data'] = 'temp/'.$filename;. W2 Y* G$ V2 u8 T/ C0 i
$result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;; V0 @5 W" ^: v5 M/ `4 g
} else {9 q% ?# j5 |* v y" ^9 J$ e6 D* J, E
$result['boolen'] = 0;
* q8 f+ _! }5 S $result['message'] = '上传失败';5 I7 p S1 A3 ~ r
}
. J! _1 g, f p( X; q q }else{
6 g& T: _# Q- N& h% ~7 a/ \ z $result['boolen'] = 0;7 `- K3 T. L! `7 j) U: D" b( T
$result['message'] = '上传失败';6 L4 f2 G! V. @) d; E
}) N+ V" T( E1 w" K
return $result;
9 p- n* l! @6 a/ ` }
3 i' m0 ]3 L7 e3 d* yunloadpic()方法没有对文件类型进行验证- r$ N; O3 r% D- s3 g( |
3 p9 d4 N5 Z/ \! m可以构建表单, 选择任意文件, 提交到
3 G" m* y* {6 g/index.php?app=w3g&mod=Index&act=doPost, h8 V v1 @0 i5 o3 a0 b4 q$ Z
5 @) e6 B3 |& A+ b% @0 b在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)6 i. D! n0 V' w4 Z: a: q1 i" }
/ t' G- E- l! m, o7 [3 T' k
* B6 Z: y+ t9 P" a在登录thinksns官方微博后,
/ _6 _% v9 L* f2 I构建以下表单:# Y! o2 D4 q4 S& b2 `
f1 V) z/ R) o1 N; v3 j. Y2 I<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />3 [6 y% n p# K1 U: J
<textarea name="content">test</textarea>% C4 C! K' E k0 s
file: <input id="file" type="file" name="pic" />
0 y3 k" u1 V5 H/ ?& r/ A2 `<input type="submit" value="Post" />
o/ X$ I7 c! ]6 f/ q</form>
, Q$ \5 G/ x. G2 R+ W0 p8 y* }去掉缩略图的前缀(small_ )- w- L/ m6 P1 P7 ]& Z/ W. t2 p
修复方案:" l2 I. \% ^& s6 L$ L
: U3 n( v4 {% X/ g% a- E
0 U2 ~, F6 y/ b\api\StatusesApi.class.php
X( t$ j6 x- B # U% t5 c9 Z2 s/ X5 [7 U
function uploadpic(){
. T% J/ D6 s9 g$ a5 z /**; B3 c, z6 g" B( R
* 20121018 @yelo
1 o/ }6 q$ B5 j * 增加上传类型验证
1 }% x/ f# b+ ]$ v$ z: N */0 b# J% `2 _; a- A
$pathinfo = pathinfo($_FILES['pic']['name']);) h' f% |2 T; v! f( M. A
$ext = $pathinfo['extension'];
/ c; u/ e4 h! E$ F $allowExts = array('jpg', 'png', 'gif', 'jpeg');7 |+ j) G: [$ d4 m. G- w5 `
9 J* Y* |8 R8 v: I& Z
$uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
$ d) \7 d& ]. S. @5 f! f! A3 P& J
0 u. _2 p1 i5 V; f: _. ]) t: O if( $uploadCondition ){
' @8 `, v' `, @; j. h- v2 O //执行上传操作; o7 t- j; I- }4 ] ^* o
$savePath = $this->_getSaveTempPath();4 |9 A- H2 h/ I
$filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
, I* C7 _6 c/ ?, P if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))$ [" w' a0 ?1 E- y) ~, I$ Q# }
{# r0 F3 V3 x8 C; G$ Y
$result['boolen'] = 1;$ p( ^7 }2 \( i; t! I+ R
$result['type_data'] = 'temp/'.$filename;
m' g3 B' ~+ R9 D5 z $result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;% }4 Y! x; s3 }# A
} else {
: E d2 n" `6 h) Q- B $result['boolen'] = 0;
; u: n) p- {: ^ $result['message'] = '上传失败';5 L V; d) F2 {. j8 ^9 D
}: H; g8 @7 R6 A6 z$ }7 K+ r
}else{( V/ [" O. E- ? ]1 h
$result['boolen'] = 0;
& |" k# s4 u& X2 p) ?/ G) i $result['message'] = '上传失败';; j' G; ?4 p5 h# b; [
}
, Y9 U' }9 }/ S+ J. W8 Mreturn $result;
5 i/ e7 s5 K5 p3 ^. G+ q+ |2 S }
0 O& v6 j' Q+ A7 }2 V& V" M% P$ j& r6 |2 j& u- Y
. q$ T: W7 |4 m! x7 U- ~ |