微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
3 f; l% d) C% k: w( ?/ {: D2 b3 G/ w8 k/ q1 u: W2 O+ e+ P+ a! ?
' u l) o' w1 n! B( B\api\StatusesApi.class.php+ b5 u8 {6 h4 t" k
) x- U* d. d; B9 D
function uploadpic(){
- T y! i0 P g0 ~; V if( $_FILES['pic'] ){4 r8 V8 h# U' {$ \
//执行上传操作
$ ?% h/ v1 W L/ I7 `1 U $savePath = $this->_getSaveTempPath();
+ N. I+ J; @ x9 e $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
) S8 O1 L1 k" I+ \ if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
$ \8 Q1 ?) p% {8 U. t& F: m {
. `8 C' J" \% y* b $result['boolen'] = 1;
9 b9 U& H6 O" f0 z' V( s+ s1 p $result['type_data'] = 'temp/'.$filename;
1 S$ J% ]% n# s3 @# y $result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;4 Q$ f) i' c, V
} else {
% i( L" `2 W- j$ S- u9 G, ?2 [5 F $result['boolen'] = 0;
3 a. }2 l3 M$ o5 b! T" s3 A" h, \ $result['message'] = '上传失败';
& u0 o0 r$ h& w* d }
1 D& h8 d9 ]4 F S }else{$ _0 e7 j: u4 s A, n: T ~
$result['boolen'] = 0;
* x) e: @* t8 _' D" C5 _# B, s9 X% w $result['message'] = '上传失败';4 n# P6 n( ]7 F4 s
}2 j0 k$ _6 C0 o! ]' I' d/ y- f
return $result;1 u6 L5 g W. `4 P% B0 P& v' B
}
7 y" O! _! U B1 ^9 q# munloadpic()方法没有对文件类型进行验证
1 F, i- p, Y( G% p2 C( d& Z m / M, U2 s" o4 @" c4 m* f
可以构建表单, 选择任意文件, 提交到
w3 Z G: k, y6 O. r' L/index.php?app=w3g&mod=Index&act=doPost
. t7 ~, @) ` v , u% M7 b7 I: k j$ r+ h7 S- j
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)
4 Z+ G# G6 J% T4 @% o) B% }1 o) c) p. c6 c7 X2 V0 b8 b
7 ^1 v6 T& g" A) b
在登录thinksns官方微博后," F* h$ x! o' ^" H
构建以下表单:
8 A7 _2 R6 N O3 i 5 q! c$ ~ o' G2 i$ G
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
9 c5 f# r0 M6 `; l. q<textarea name="content">test</textarea>" F% k, V9 q0 ]4 [) u2 `. I) D7 ?2 L
file: <input id="file" type="file" name="pic" />5 z( Q/ N( |& q# T8 @
<input type="submit" value="Post" />7 b: a7 c' f2 f
</form>
3 F2 q* e# A+ ^去掉缩略图的前缀(small_ )
9 p9 I. [3 T/ _4 i1 d修复方案:
8 C' V) }1 y e* a2 n6 s
- z! w! v ^4 K; l& T2 ?7 x2 X7 Y# W9 N. |
\api\StatusesApi.class.php) p5 ~5 Y; }4 B' ?
+ F' Z& j8 H/ R6 D% {+ U1 ffunction uploadpic(){
: D: x& B* z( v. T7 k: m; ?3 F8 s6 ? /**
1 V: x7 j* E& g3 d * 20121018 @yelo$ ?! T R% U& [
* 增加上传类型验证
/ k" }) E3 E; y0 ] */
3 p" ]+ {9 ]! c $pathinfo = pathinfo($_FILES['pic']['name']);. C, \" } p7 D6 b
$ext = $pathinfo['extension'];/ l) t7 @2 j0 N+ |( n
$allowExts = array('jpg', 'png', 'gif', 'jpeg');1 j8 A* f, |5 {# E* j; D4 Q
) j' |+ A9 e6 a+ I
$uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);, T% |9 E3 X$ z9 {* V1 f
& V/ h. |3 G; b5 u7 f0 ?8 M0 e
if( $uploadCondition ){
6 [/ {( _+ z# o8 N //执行上传操作
, j) i. l' \6 H. D5 l0 i% i $savePath = $this->_getSaveTempPath();; q/ ~7 U4 P: z* N
$filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);7 M' ?8 Q% Q* S; g: W; x
if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))0 z/ u) V( Y1 \; E! g+ ~) C
{3 l0 p- G& P3 t9 J4 \
$result['boolen'] = 1;2 n; L, S7 y9 t1 F% y
$result['type_data'] = 'temp/'.$filename;3 W/ O. q1 I4 g# C4 P n9 }3 q
$result['picurl'] = SITE_PATH.'/uploads/temp/'.$filename;& Y1 v# t" V3 G9 c- u$ J! u; u* { g! L7 u1 |
} else {( o: M& `4 I- m6 U: P9 N5 a
$result['boolen'] = 0;4 z5 y: W7 M( B! E6 J* l
$result['message'] = '上传失败';
# y2 h% |, C- x7 B+ |, ?( E8 h }5 \- r5 Z* l" C1 o0 [2 Z
}else{; Z, B7 ]9 d" O0 R
$result['boolen'] = 0;
n; G2 p, h4 D $result['message'] = '上传失败';. Q) w; t( N V1 B' H5 E4 X, _
}
; ^* Q, L3 S6 y& f; Oreturn $result;2 d X# o6 W+ B' C
}- Z' O3 N/ g5 Z, V" g
2 A! \4 K) x+ O8 t- U* Q, E& }2 l/ [0 t m2 O! H
|