$7.49 .com domain with free InstantPage Website Builder$1.99 Web Hosting   捷飞网络官方淘宝店   Godaddy 优惠码
返回列表 发帖
分享到:




[Bug&安全&补丁] 解决问题sprintf() [function.sprintf]: Too few arguments

本帖最后由 逸乐吱声 于 2013-2-18 17:22 编辑
9 Y, K6 _# J0 _. g2 ~; x3 q
4 d3 x1 i! p) y8 h; [7 MDiscuz [function.sprintf]: Too few arguments 错误
) v- a8 T* h  G- h; Z
9 S3 @' |6 x8 P( i4 I; ]- r6 l7 [2 o8 P

- u# E5 U% O# E' {5 z, x, e今天一个客户反映论坛中一篇帖子打不开,其它帖子正常。& R) x3 P0 H3 o1 [, [
我打开看了下,详细错误信息是:
' \& N6 B- g3 k4 h: J9 b. ?9 G
5 R1 Q9 i: N5 Q: Q8 a  z1 w
  1. PHP Warning:  sprintf() [<a href='function.sprintf'>function.sprintf</a>]: Too few arguments in E:\wwwroot\bbs\include\discuzcode.func.php on line 369
复制代码
$ W3 s- ?1 N2 H. E2 f

: p2 L0 q' h2 [, D% j/ q求助了下百度,谷哥,很多都是英文帖子,也看懂了一点,但还是没有头绪。( U* _7 R# ]9 m3 L8 Y  |4 o# X9 D, \6 a6 e2 [: ^
于是找到文件中错误代码的位置:0 [4 n" V* K- O1 J$ H1 L! Y  y7 e6 T" I' A6 e& `$ a9 n, u

) C( s5 x1 X/ ~9 P" v. W
  1.      function bbcodeurl($url, $tags) {
  2.             if(!preg_match("/<.+?>/s", $url)) {
  3.                     if(!in_array(strtolower(substr($url, 0, 6)), array('http:/', 'https:', 'ftp://', 'rtsp:/', 'mms://'))) {
  4.                             $url = 'http://'.$url;
  5.                     }
  6.                     //这一行错误
  7.                     return str_replace(array('submit', 'logging.php'), array('', ''), sprintf($tags, $url, addslashes($url)));
  8.             } else {
  9.                     return ' '.$url;
  10.             }
  11.     }
复制代码
( r( Y  i. j" |  c, _' M

+ ~  _6 a% p& W' D1 [( S查了下php手册,sprintf并没有很特殊的要求,只有字符串中的%要与参数一一对应。另外又想,既然其它帖子没
1 ?. X9 g  L) H) h
问题,只有这一篇,肯定跟帖子内容也有关系的。于是把相关的帖子导出来,并不多,看了下,果然帖子中有如
; w- ^- R- S" F+ M* p7 }下一个图片地址:
& S( }& g+ N/ }- H7 I( @# t9 m8 V) M: }/ b" J9 M1 @0 `: `" ?  H. G
  1. http://2012.zhenai.com/userfiles/images/%E5%B7%85%E5%B3%B0.jpg
复制代码

3 U- Z, C7 h7 k5 [& r# ?) S7 F/ @0 T( u+ r1 |! s
看来问题在这里了。肯定是这个网址中的%没有编码就被传入到sprintf中了。调用到bbcodeurl函数的有几个地方+ v" p* s; R: }; [. H6 r2 q7 u5 o
,在 discuzcode  这个主函数里有几处
1 K6 K! w/ E! U! ]( ]* b1 ]
9 T2 e9 u+ b0 ]( q7 _# G0 S. }
  1.              if(!$bbcodeoff) {
  2.                     if($parsetype != 1 && strpos($msglower, '[swf]') !== FALSE) {
  3.                             $message = preg_replace("/\[swf\]\s*([^\[\<\r\n]+?)\s*\[\/swf\]/ies",
  4.     "bbcodeurl('\\1', ' <img src=\"images/attachicons/flash.gif\" align=\"absmiddle\" alt=\"\" /> <a
  5.     href=\"%s\" target=\"_blank\">Flash: %s</a> ')", $message);
  6.                     }
  7.                     if(strpos($msglower, '[/img]') !== FALSE) {
  8.                             $message = preg_replace(array(
  9.                                     "/\[img\]\s*([^\[\<\r\n]+?)\s*\[\/img\]/ies",
  10.                                     "/\[img=(\d{1,4})[x|\,](\d{1,4})\]\s*([^\[\<\r\n]+?)\s*\[\/img\]/ies"
  11.                             ), $allowimgcode ? array(
  12.                                     "bbcodeurl('\\1', '<img src=\"%s\" onload=\"thumbImg(this)\" alt=\"\" />')",
  13.                                     "parseimg('\\1', '\\2', '\\3')"
  14.                             ) : array(
  15.                                     "bbcodeurl('\\1', '<a href=\"%s\" target=\"_blank\">%s</a>')",
  16.                                     "bbcodeurl('\\3', '<a href=\"%s\" target=\"_blank\">%s</a>')"
  17.                             ), $message);
  18.                     }
  19.             }
复制代码

! h7 R7 z) N9 ?. h; P+ M7 S7 a- F: \7 T$ r5 T' y6 x" @! ~
另外,这里也调用到了 parseimg函数, parseimg又调用了bbcodeurl, a: }8 `: Q% F
$ I1 n; a- Z& X
6 R6 D& K0 ?2 `
  1.     function parseimg($width, $height, $src) {
  2.             return bbcodeurl($src, '<img'.($width > 0 ? " width=\"$width\"" : '').($height > 0 ? "
  3.     height=\"$height\"" : '')." src=\"$src\" border=\"0\" alt=\"\" />");
  4.     }
复制代码
" D! `" H9 `$ n* I7 ^3 x6 Y9 v

% K5 L$ P  u9 r! g看来问题就在这里了,这里直接把url替换进img标签中,又把整个标签传给 bbcodeurl,url中的%没有被编码。于是加了个replace
4 H* u4 N; [0 }
view sourceprint?5 I$ ?$ y9 W, B7 f/ }$ Y  A( T( V* s* H! {1 A; `
  1. function parseimg($width, $height, $src) {    return bbcodeurl($src, str_replace('%','%%','<img'.($width > 0 ? " width=\"$width\"" : '').($height > 0 ? " height=\"$height\"" : '')." src=\"$src\" border=\"0\" alt=\"\" />"));}
复制代码
- o, C* {2 V( L8 ?% a4 A, R

% K' R% }( [+ N  C- [上传覆盖旧文件,问题成功解决。6 k/ _9 g" M' |+ Y3 K% P' i4 [8 u
* \) {( G( r5 Y" w2 ~  ?' z$ q
  T9 j( `* Y/ n( Q  A
参考:http://www.shirne.com/?cid=17&id=157
+ z0 B, T3 x, Z; Y& x3 c# p

返回列表
Namecheap
Namecheap.com - Cheap domain name registration, renewal and transfers - Free SSL Certificates - Web Hosting
互联网安全