微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。4 M9 `+ l) c+ V; `8 [7 Y1 {
: _" O& K' U' z H4 A Y/ O! l( O% f4 m5 z
\api\StatusesApi.class.php. b/ V, Q3 {/ F. \. ~
/ W: m9 e% A3 x
function uploadpic(){
* R7 E i5 E Q0 m; F2 O if( $_FILES['pic'] ){. C$ b- G7 ]7 T K* j7 y1 R
//执行上传操作2 `, v: j; H: j5 ]' c
$savePath = $this->_getSaveTempPath();
# @& v; Z) g; ^! U" e) ?; `* j$ M $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
" ~$ u! H; V: M. D# I' g1 v/ ^9 e if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
" }, Y/ `8 Q5 ?( G' m( g5 C" o- @ {
3 V( z. \0 H7 w. J) J8 s7 E% \1 D $result['boolen'] = 1;
1 i! G P/ c* F8 q& S1 a6 V $result['type_data'] = 'temp/'.$filename;
: Q2 c0 t7 [- i# r $result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;/ m. O9 ~$ U0 M
} else {+ W/ m2 p8 z, K- T3 `2 s1 ^' _
$result['boolen'] = 0;
5 S5 i' w: G/ I4 M $result['message'] = '上传失败';
) Y9 y# G3 `: k3 z) O }
3 y6 z5 ?% T( t9 R5 y/ m" B }else{2 D) t, N/ J4 u% @1 x b, \# t
$result['boolen'] = 0;
8 W, [* j% v# g/ b, T/ P2 ~ $result['message'] = '上传失败';
% }3 d3 W4 s1 D) E' _( H/ e }' {* h+ q# j9 B( R( h
return $result;2 Z! [/ J2 K6 z4 _1 r- s) s! l& l
}
. n, ~' ~2 q9 F8 r( g4 K4 s5 |; yunloadpic()方法没有对文件类型进行验证
e; }/ o5 L8 x- l5 s: b; A4 S% `7 Q; P
; G# M$ C7 ?# y* Q! v可以构建表单, 选择任意文件, 提交到$ n) ~ G, j# x) A0 X" k; C- q E
/index.php?app=w3g&mod=Index&act=doPost
4 j7 t* }! f: r [( w6 k I) @
) N/ ^' g/ Y& ]/ o$ r! X [在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀): ?! y5 }5 E: ]' Z) b% s
7 ~7 }5 Y, ~% r4 ]
$ ^6 N% g& i6 w在登录thinksns官方微博后,
7 y7 o/ ?: G _+ \构建以下表单:$ |; e7 ]7 s! X; S
5 x0 y6 B7 o' H+ ?+ Q( Q
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
% j2 l1 K( f8 s6 m2 T<textarea name="content">test</textarea>, c! O* ~/ _+ a4 i8 e- [5 z1 |3 h
file: <input id="file" type="file" name="pic" />/ [! B. l3 H/ N" {: k5 ]" L
<input type="submit" value="Post" />, Y4 n9 X. z6 U5 E' ^3 J
</form># ]# }8 ]# X/ T% G+ w0 D
去掉缩略图的前缀(small_ )) `/ n6 m+ ^5 d5 H0 } O' H' P" i/ k
修复方案:( V0 L7 r9 R; L2 ^8 f1 e/ m
7 N; B# b* T( p& i+ V5 i% [3 r7 E5 |5 |9 e) [. D: A
\api\StatusesApi.class.php& R8 ^4 w# q% t" ~3 z0 t
, F) N6 m6 ]6 b0 l3 e* t
function uploadpic(){4 l3 W' S9 q( ?9 _! i' u
/**
0 R5 c e( Q7 X5 C * 20121018 @yelo' a# z- r' W5 J o- g
* 增加上传类型验证4 |- B4 d( H. _ j8 A- m+ w
*/
7 e( D7 W: J/ A! O$ [. w$ S $pathinfo = pathinfo($_FILES['pic']['name']);% [1 Q; \- b& o. n% S$ M
$ext = $pathinfo['extension'];) B6 K% Q9 Z( ~: I
$allowExts = array('jpg', 'png', 'gif', 'jpeg');
; R- I; R0 X& @ 5 l" u/ t4 s Q& H+ R( K0 d
$uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
9 }2 S% V+ e. T O/ B& c
$ M J8 }1 [2 ^3 g( H$ W if( $uploadCondition ){
Y/ s$ [! B2 X6 }7 b6 Q0 z //执行上传操作
. \, R) a# g1 ]0 K# u; k0 x; j4 ? $savePath = $this->_getSaveTempPath();
N+ M }% N8 K* ~, ]9 | $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);0 } h9 Y& K% ]* k; D
if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))! b: @7 d# R9 `( Z
{: t1 l) O! n- y1 h1 l, C
$result['boolen'] = 1;9 R# ?: W% b9 ]8 }' V5 E+ |( E* @
$result['type_data'] = 'temp/'.$filename;8 u2 f w- w: m) D
$result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
# l2 V# c* n1 A3 c9 z% X! I" W } else {
/ | h1 L; Z) u# }, ?) R $result['boolen'] = 0;
+ t+ P# F" j$ p7 S, u $result['message'] = '上传失败';
. F# s! c1 E' f6 y. a7 F4 N* _ }
4 ]" \* k$ d# R2 r }else{6 S6 ~: ^( N8 G9 H- \
$result['boolen'] = 0;# h- N, k+ \) J4 b: s- v1 Z: M( ~
$result['message'] = '上传失败';9 ]: m6 E" e8 c
}" {) G6 ^5 y6 o: J
return $result;
2 p/ k0 Z3 H" w% A }
~0 K! T& c0 \0 o/ Z4 p5 N: X: e1 K
, r: V! B9 j/ y8 w9 y+ w3 e7 {: l7 |$ N
|