微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
, [. h5 `5 d( L2 p2 }2 Z' w: L; R+ V( j/ j5 @
' ]- i! B$ [$ a
\api\StatusesApi.class.php! m7 [0 e% |0 C8 T; |, l/ [
1 c ]& l6 m& r7 k; t
function uploadpic(){
) q8 Y5 u' V9 s+ M! k% ` if( $_FILES['pic'] ){" Y' R6 H4 v- ]/ r6 b
//执行上传操作
* [! P7 w! R4 D4 Y0 x. p $savePath = $this->_getSaveTempPath();
4 _, @8 n- `. }3 p) c $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
" \7 G( X7 F4 o7 ?" \7 \0 X if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
+ P! R. N7 p2 g& H" ^ {
7 \( U8 S! _6 {* K2 v0 [7 O $result['boolen'] = 1;
: Z) N: i% t7 R! X: p$ b# D, | X $result['type_data'] = 'temp/'.$filename;
& {2 {3 Q, e/ N" [5 O; G $result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
9 a9 H' a% Z1 U3 s, E' ~- Z } else { q' T2 a- r, l: s- N$ G ]
$result['boolen'] = 0;) z/ B. a$ v- N! T6 c0 z- Z7 c4 U" ~
$result['message'] = '上传失败';
/ K6 Q2 h2 Y) z1 v }
. _( Q' z; f0 y; W% { }else{, u4 z! L7 g, D/ b% N
$result['boolen'] = 0;7 m$ H2 A9 x* z. l( Q0 c
$result['message'] = '上传失败';
) v. B+ f$ k( ?9 P }' l" `% l5 C1 b3 i0 l8 S* h( X
return $result;
9 T7 C# @% I, ^6 w2 J; ] }
; m) n6 n/ K tunloadpic()方法没有对文件类型进行验证
, h! C7 s' H# x# C+ |
7 {- l1 _3 F; X, i$ M可以构建表单, 选择任意文件, 提交到
$ R9 d. i# E% r5 |2 v4 A/index.php?app=w3g&mod=Index&act=doPost
0 J5 t4 N' R: n) g7 d, U! s
! V Y0 u* a9 j* O# ]$ ~, k0 k在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
4 N0 D4 E8 t) E
b, f. }5 o* m0 ] v, S+ y% C8 I6 o" z
在登录thinksns官方微博后,4 A1 z" {6 i- L d! x7 @4 ]5 o, P
构建以下表单: [( m- o' p# ]& M v
4 M, T% I3 @& \' f+ i' V: O" d% X5 e<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />4 a; e& j# I- m; Y
<textarea name="content">test</textarea>
( T: o0 V3 ~9 Pfile: <input id="file" type="file" name="pic" />
# J# }" n3 M( ^6 A<input type="submit" value="Post" />
% R' R2 d- g: q: l9 Z; D</form>
( N0 @' B; Z& F. Q! _( `去掉缩略图的前缀(small_ )- P$ W4 o: ]$ W( o6 ~, {
修复方案: v6 J" N% T; N; O6 C* g3 ~
7 L. g* [/ E$ I# `- G9 D8 ?+ x9 N5 a7 I q6 _4 G5 T5 Z( i
\api\StatusesApi.class.php
, ~" q, E& Y0 N
( ~: u' Y" S$ p7 Y9 yfunction uploadpic(){! z! G# s! ]! L8 H0 d
/**1 L3 R5 o6 g% w, n+ y3 b
* 20121018 @yelo% Y; Z9 O, x: d& B; g
* 增加上传类型验证+ s9 n' C* H2 h5 U
*/+ n4 w$ R" ^5 P/ ?7 I# b7 R# f' f/ c0 o
$pathinfo = pathinfo($_FILES['pic']['name']);7 G: X v! j, Q2 q L
$ext = $pathinfo['extension'];, X1 a: r3 i, @3 C- p: q% c
$allowExts = array('jpg', 'png', 'gif', 'jpeg');
5 O% Y6 `2 S7 L2 o
5 r- F+ j% r+ ^! j; I9 H $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);4 h2 h2 m; I8 i, l+ v" \
8 U9 k# F. n+ f5 D& ]8 o$ W" P6 ? if( $uploadCondition ){) P ]6 k' h% M3 n. I. b3 W
//执行上传操作
5 h, f+ A! R {+ ~9 w $savePath = $this->_getSaveTempPath();
4 T0 P6 Y: `% ~) E; `. _/ I $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);2 x' o5 Z& m6 i& u' d; r1 X- W
if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
6 C2 j) U9 N& B2 e {
, e) v. F: q7 e6 y $result['boolen'] = 1;
8 T; J2 t) j; U# I $result['type_data'] = 'temp/'.$filename;7 _/ M% n& y. s$ p4 Y% K: r
$result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
" B% K% a6 c+ k: M } else {
6 M6 D' l' G. U0 X2 D& Z $result['boolen'] = 0;8 c. |2 D) g6 n3 v: M% F
$result['message'] = '上传失败';: ], f9 B; w# _0 G! I8 W4 R" M% Q
}2 ]5 P1 R/ ^% z$ x& U% i2 \
}else{
! u1 O' v' g' C$ e+ e $result['boolen'] = 0;
6 e2 B1 G2 f% O3 a $result['message'] = '上传失败';
# C+ H; r* Q8 E( A" L# S# ^ }2 x/ X8 ~! A2 m- [0 Y; O3 C
return $result;
% L' s1 C- h% M3 ]2 e# O2 L3 y& q }
* z+ T N9 ]8 s9 h# u; O$ R
5 a8 K. h0 `8 ~" R( y0 R9 ^7 r1 M5 ?) y% Q- d3 e ?" T1 j6 b$ {& y
|