微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。' f. o* ^/ c/ n: Y5 Q f5 l3 C
4 B( y% l0 c5 g/ @* u
. W7 X- L# Z* |2 S9 n3 W\api\StatusesApi.class.php
8 e# o9 b+ C2 | z
# p ?* H5 X# b pfunction uploadpic(){$ [) ]" |9 F4 D; u3 v5 _
if( $_FILES['pic'] ){3 I* o9 x( k" a- Q
//执行上传操作
% Z Z" m6 a7 c6 X $savePath = $this->_getSaveTempPath();
' Y# x6 c7 w% g! Y3 C3 u $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
! |0 ]9 q3 j( F9 l: w! W if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))1 E/ H. [5 [( }& n" C
{4 t/ K* }8 C4 a' D# s# p4 d/ ]
$result['boolen'] = 1;9 O& s4 Q3 H4 @/ A( E
$result['type_data'] = 'temp/'.$filename;, u' q& H# A- {2 k
$result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
. [ u. I8 d0 a8 f/ X% L } else {
; K% ]4 p2 ^1 v6 ^9 j" k $result['boolen'] = 0;
% i2 w$ v% p# ?) _1 Q $result['message'] = '上传失败';* q7 p4 I7 l& O/ W4 b
}
* M" a3 p* G1 ^9 W. d L+ J }else{
7 P2 d' {% Y3 ^1 m9 d a- V $result['boolen'] = 0;5 b& k9 x- Z+ m) S$ ~$ n$ `+ X
$result['message'] = '上传失败';' h# s, v, d b0 H0 D% |
}
! [8 d, Y* C/ C. _return $result;
/ Q- S L+ _) c5 q/ g }
[) {- {5 o1 m0 s4 s: D& p/ tunloadpic()方法没有对文件类型进行验证
' I, A5 p3 t* ~/ i 8 ~& E5 }) Q! Q" C- m; f2 c. ^
可以构建表单, 选择任意文件, 提交到
0 T1 S; U4 _& l/index.php?app=w3g&mod=Index&act=doPost2 `" y) w/ {/ V- w$ f6 D
7 b% [9 ~: R; p& S1 f% B
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)" q! C) C {- `3 C$ i5 a
/ Z/ Y6 j) K* ]1 L% Z$ y3 f. d) S9 Q: n5 T# D
在登录thinksns官方微博后,
' Q' O" }8 H/ e5 X; U构建以下表单:7 N, |5 f* N! u2 ?7 P
: p0 G+ C% K& K* b
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />1 ]5 S; M# D. B9 \5 ~9 R, [
<textarea name="content">test</textarea>
$ B7 o* p% H1 x6 W/ Kfile: <input id="file" type="file" name="pic" />
! L" _2 r: \+ q) S, u% U6 y<input type="submit" value="Post" />3 E; {1 n2 A* [9 ?3 {- @4 C
</form>- H9 O `. i2 o( a$ M
去掉缩略图的前缀(small_ )
Z# B9 r! F* s6 {, e" j3 y修复方案:
0 T( F% e) B& W
& ]0 e0 I1 a- t6 C5 T9 Z; A! a
\api\StatusesApi.class.php
+ {4 A4 @. T& y2 O 0 k. H) O, X. l( t
function uploadpic(){. w, y& L' }* ?
/**
# C3 a! l) O4 Z& ?; }9 g4 L * 20121018 @yelo+ [( h- ?& N( ^) k5 B' i
* 增加上传类型验证
3 f9 T& E- M8 s4 C/ o m' L */
/ G/ a3 [4 z3 ? $pathinfo = pathinfo($_FILES['pic']['name']);. R* d3 m- h( M1 z9 r( A
$ext = $pathinfo['extension'];! Z) L- V( m$ G4 g) j
$allowExts = array('jpg', 'png', 'gif', 'jpeg');) z6 g: R, {8 \' |* v( e3 z
% L$ S8 G& w2 _3 \5 { $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
" j7 ]% P) ^) a - w6 H( S! i& t' _
if( $uploadCondition ){+ w* R& }. K2 t2 ^
//执行上传操作/ h* y/ i1 M8 _* G+ U2 h/ s
$savePath = $this->_getSaveTempPath();
' c3 p$ c6 C \. a1 U& j $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);) h0 Z& k# ^( a" V X/ ]8 Q, p
if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))8 p, V0 ^% c4 D. x& [7 K5 x+ V( x
{
! ]0 y$ A" W" O- n $result['boolen'] = 1;
4 u0 M3 ]# F1 ?$ O( V6 H: B7 u $result['type_data'] = 'temp/'.$filename;
9 V* r6 P9 `9 q+ S. c $result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
7 d% A( o3 G, L } else {
?8 V# t2 C& G7 ^: [. Y $result['boolen'] = 0;
! ]9 ~, ? M! ?& H- W0 u: i $result['message'] = '上传失败';1 f4 d: M" o! q2 N4 M8 B
}% b# ]7 j; Z/ q7 _+ k' ]7 r% z
}else{
; O8 P$ S: l8 Q" `0 p3 v. c# r $result['boolen'] = 0;
3 M3 p3 L/ ?0 i5 N; a0 k$ O $result['message'] = '上传失败';
) u! c9 |: O& O }$ }- c% h( J O# K
return $result;1 h, i3 S) s& H7 D* |
}
& {! u$ q ]: H( @3 l" G j8 P. O" s9 J( F+ ^
8 i) f# j4 ~: j9 G4 Z
|