- 帖子
- 105
- 主题
- 98
- 精华
- 0
- 积分
- 263
- 贡献
- 105
- 激情
- 469
- 阅读权限
- 100
- 最后登录
- 2019-8-18
|
[Bug&安全&补丁] 解决问题sprintf() [function.sprintf]: Too few arguments
本帖最后由 逸乐吱声 于 2013-2-18 17:22 编辑 ; Z1 X8 W p0 R' T
/ M5 \9 O3 A/ [2 J( @. l
Discuz [function.sprintf]: Too few arguments 错误% v+ D" i- }8 x
9 S3 @' |6 x8 P
( Z1 {: X$ }9 `5 n& q
& T5 b; H. E9 w( {2 i: _" ]. N& ^今天一个客户反映论坛中一篇帖子打不开,其它帖子正常。
2 |. U: g6 Z$ M4 _我打开看了下,详细错误信息是: _( a; v* `: H; M
" ~+ j3 j8 d U4 {* w( q- PHP Warning: sprintf() [<a href='function.sprintf'>function.sprintf</a>]: Too few arguments in E:\wwwroot\bbs\include\discuzcode.func.php on line 369
复制代码 ' g3 _ i. }5 e
( P" x3 r" P2 O' u" e$ \3 G求助了下百度,谷哥,很多都是英文帖子,也看懂了一点,但还是没有头绪。( U* _7 R# ]9 m3 L8 Y
1 O2 U2 q# x% k$ E9 _于是找到文件中错误代码的位置:0 [4 n" V* K- O1 J$ H1 L2 p( P! Z/ d/ D: t6 D6 N8 D! G
6 O0 m# B7 \- |* f4 G/ t. A
- function bbcodeurl($url, $tags) {
- if(!preg_match("/<.+?>/s", $url)) {
- if(!in_array(strtolower(substr($url, 0, 6)), array('http:/', 'https:', 'ftp://', 'rtsp:/', 'mms://'))) {
- $url = 'http://'.$url;
- }
- //这一行错误
- return str_replace(array('submit', 'logging.php'), array('', ''), sprintf($tags, $url, addslashes($url)));
- } else {
- return ' '.$url;
- }
- }
复制代码 4 P, U2 y1 |8 Y6 `5 `2 ~ E% h
5 E6 G7 b* y8 ~0 l6 ]
查了下php手册,sprintf并没有很特殊的要求,只有字符串中的%要与参数一一对应。另外又想,既然其它帖子没
. d! o; f9 I* D. r! D问题,只有这一篇,肯定跟帖子内容也有关系的。于是把相关的帖子导出来,并不多,看了下,果然帖子中有如/ @/ z9 h {* h" z) ?9 I$ J8 O% a
下一个图片地址:
" N7 g1 |/ p/ s9 V4 ]6 e2 F7 Y: y9 {- o* C4 ]* I
- http://2012.zhenai.com/userfiles/images/%E5%B7%85%E5%B3%B0.jpg
复制代码
* H- c! M/ a1 C5 i2 m, n9 W- H
看来问题在这里了。肯定是这个网址中的%没有编码就被传入到sprintf中了。调用到bbcodeurl函数的有几个地方
% E- F- U6 I" T$ `,在 discuzcode 这个主函数里有几处
+ J0 P! ~1 w0 L* w* b1 d0 W; l$ C
; a1 x& t6 m* d3 z, H2 E2 T- if(!$bbcodeoff) {
- if($parsetype != 1 && strpos($msglower, '[swf]') !== FALSE) {
- $message = preg_replace("/\[swf\]\s*([^\[\<\r\n]+?)\s*\[\/swf\]/ies",
- "bbcodeurl('\\1', ' <img src=\"images/attachicons/flash.gif\" align=\"absmiddle\" alt=\"\" /> <a
- href=\"%s\" target=\"_blank\">Flash: %s</a> ')", $message);
- }
- if(strpos($msglower, '[/img]') !== FALSE) {
- $message = preg_replace(array(
- "/\[img\]\s*([^\[\<\r\n]+?)\s*\[\/img\]/ies",
- "/\[img=(\d{1,4})[x|\,](\d{1,4})\]\s*([^\[\<\r\n]+?)\s*\[\/img\]/ies"
- ), $allowimgcode ? array(
- "bbcodeurl('\\1', '<img src=\"%s\" onload=\"thumbImg(this)\" alt=\"\" />')",
- "parseimg('\\1', '\\2', '\\3')"
- ) : array(
- "bbcodeurl('\\1', '<a href=\"%s\" target=\"_blank\">%s</a>')",
- "bbcodeurl('\\3', '<a href=\"%s\" target=\"_blank\">%s</a>')"
- ), $message);
- }
- }
复制代码
! R6 u2 `0 n1 ?9 p" j) O
; z" J/ ?1 X: t* l另外,这里也调用到了 parseimg函数, parseimg又调用了bbcodeurl, a: }8 `: Q% F+ D/ s- b- S7 U6 W* N
5 M5 g+ D0 A2 H& n0 A/ ^- function parseimg($width, $height, $src) {
- return bbcodeurl($src, '<img'.($width > 0 ? " width=\"$width\"" : '').($height > 0 ? "
- height=\"$height\"" : '')." src=\"$src\" border=\"0\" alt=\"\" />");
- }
复制代码
8 [; _ X7 l0 V k( c* v6 Y$ a! p; V0 r( Q+ v) R9 f3 R9 G8 ]# c
看来问题就在这里了,这里直接把url替换进img标签中,又把整个标签传给 bbcodeurl,url中的%没有被编码。于是加了个replace
' c& Q* C7 Z1 B% e6 I! u! n oview sourceprint?5 I$ ?$ y9 W, B7 f/ }$ Y
/ i& _& _) T `& }- function parseimg($width, $height, $src) { return bbcodeurl($src, str_replace('%','%%','<img'.($width > 0 ? " width=\"$width\"" : '').($height > 0 ? " height=\"$height\"" : '')." src=\"$src\" border=\"0\" alt=\"\" />"));}
复制代码
. x2 l! s, X! f2 ?
: \) ?1 U; V: m上传覆盖旧文件,问题成功解决。6 k/ _9 g" M' |+ Y3 K% P' i4 [8 u
* T0 `2 v( K2 R
4 M! h) c4 T4 U. J: a& \# q- @参考:http://www.shirne.com/?cid=17&id=157, n; Z8 x' m+ t! u& k2 A0 y
|
|