微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。, t; @1 X; x( V
, e ^* w% F" E, _. g 3 u8 ^% C& d8 G0 b9 Z3 o& Y
\api\StatusesApi.class.php
% R6 x3 e$ o; g8 a% s + Q( U, n0 M- ]' c/ G
function uploadpic(){
7 Z9 X" p T, M7 A% | if( $_FILES['pic'] ){( a0 t" S5 ^- W7 |, s
//执行上传操作1 O* Q8 p# i" D2 e6 Y5 D0 v2 L) m0 s
$savePath = $this->_getSaveTempPath();( y+ E6 \9 p+ _& P
$filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);. H& l2 } x3 n% z
if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
' W8 B; `8 a; m" X4 D. D {# H0 |' G1 q* W. v
$result['boolen'] = 1;/ I+ q( T, i0 q6 S( ^
$result['type_data'] = 'temp/'.$filename;: M" e1 I+ W' ^' J0 [ h
$result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
% z9 d7 X% }2 ^: E } else {
- K R# e# [6 N0 a# h( ^; { $result['boolen'] = 0;
/ D0 y$ E3 V+ X( \* B $result['message'] = '上传失败';2 V& l/ W$ S: ^6 l/ W
}
2 L7 K h, y: Y j6 R6 o" S) E' G }else{2 `2 l9 P4 _7 M3 a9 Q2 S, M
$result['boolen'] = 0;5 ^# Y+ Y- y z+ K$ E; L
$result['message'] = '上传失败';
2 N- s6 G. [ L; H* g/ z- r9 R }" D$ X; J6 q. }' V/ q( R1 E. G
return $result;0 m' l4 ]# a( l- P5 V
}
: f) Q5 c- u, h0 A1 yunloadpic()方法没有对文件类型进行验证8 D8 o6 B3 S% s1 M) H$ [
+ ]) u# t3 L9 m3 }可以构建表单, 选择任意文件, 提交到% u H6 g: f* x' X0 G& A* y5 Y
/index.php?app=w3g&mod=Index&act=doPost1 N, q% I, e# }$ I( ~
$ j" [1 \& X) C! L7 D& Y在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
" K K0 n5 B% Y8 K6 x/ Y/ O# m' @9 V; S# `6 k; \2 |9 R
' W+ }/ w! V: C在登录thinksns官方微博后,% F1 B V! [8 V- j u& o
构建以下表单:* Z% @, u( {- d H" z; s
& E1 ?' Q2 d$ |
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />1 l. z, b: _8 r0 M
<textarea name="content">test</textarea>
+ g! Y+ O6 q) a2 y+ T+ M- wfile: <input id="file" type="file" name="pic" />
; {! p/ o$ ^0 ?. H<input type="submit" value="Post" />
! _8 B* ]* K# q9 k! c2 K4 U</form>+ I7 }) B% W" V% h- {
去掉缩略图的前缀(small_ )6 }$ t) [2 k+ C- e7 _3 n1 ~. f
修复方案:
9 }2 [! a6 z, h3 O* O* k3 w+ u# r
, M% n2 x1 g$ R8 o* y/ Q1 E\api\StatusesApi.class.php- Q+ M' ?( y2 N9 `* ]6 V9 X
5 p k# }/ H& z4 Dfunction uploadpic(){
* S' h0 e7 i& d' y- }+ V0 w" C /**
# [( i8 ?7 S9 ?; N * 20121018 @yelo
/ n+ j$ @0 d7 \" |8 n * 增加上传类型验证/ S) ~ j/ b- s
*/" ^# \" u3 s/ i7 _
$pathinfo = pathinfo($_FILES['pic']['name']);
$ {, \3 q# @# C" N: s7 c* z" D $ext = $pathinfo['extension']; U, f4 {3 h% M3 y% z; ^
$allowExts = array('jpg', 'png', 'gif', 'jpeg');& c8 }6 G& v, ]% }2 S. P6 D4 X1 w
X+ ~# v9 n1 Q% e/ G" O X
$uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);4 V# G% Q: C# \3 x% J
+ X3 w9 h5 v3 q9 c; a" w% K if( $uploadCondition ){) k K+ S' S, D1 v
//执行上传操作& Q, {+ ]4 |7 r. i
$savePath = $this->_getSaveTempPath();
; g6 H4 B& n2 Q9 O $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);# ]- f! ~5 v# `$ e" k6 H
if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))# y6 w( F6 `3 Z; t; e% |) K
{
2 d& y% Y4 ~5 I: }+ u6 E) [ $result['boolen'] = 1;
2 Y/ A( r, G- f3 k$ N9 l) I $result['type_data'] = 'temp/'.$filename; `% F) A' m/ f
$result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;
( @* t0 b3 Y1 O+ t0 a( N! y1 X } else {
$ ^* K# @) `. h3 T7 |7 f! j4 ^5 d $result['boolen'] = 0;% b8 @' O1 ?, V; T% |
$result['message'] = '上传失败';8 b" R$ z: R1 C0 X- p& Q, p
}
& |! C4 _2 `4 E/ [; d7 Q }else{; k+ W( w% }) Q5 Q5 j& d$ o, ^) {
$result['boolen'] = 0;
/ D8 O: r" r# k0 F: t $result['message'] = '上传失败';' @1 S5 k% A; j0 W( _4 I3 z3 A; ]
}4 I, ]: W. J1 W; a4 O. a( v9 H
return $result;
6 M; [( l3 F) }" ]" o- ? }
4 s0 {/ f( M9 V9 X/ C4 f6 { ]! U) s* X6 U3 |# M
L. m% M1 O0 [8 e2 M
|