修复discuz x 3.4下载远程图片在有类似src属性时出错的问题

3 篇文章 0 订阅
2 篇文章 0 订阅

例如这篇文章:http://wf.wenming.cn/wfwlwmcb/201906/t20190604_5887051.shtml
图片处代码:

<img width="600" alt="" oldsrc="W020190605390138630908.jpg" complete="complete" src="http://wf.wenming.cn/wfwlwmcb/201906/W020190605390138630908.jpg" style="margin: 0px; padding: 0px; border: 0px; vertical-align: bottom; max-width: 85%;">

里面含有oldsrc属性,点击远程图片下载未能正常工作,在编辑源码里把oldsrc="W020190605390138630908.jpg"去掉,功能正常。猜想是不是在src的匹配上不够精准?

此问题在https://gitee.com/ComsenzDiscuz/DiscuzX提出issues,燃鹅两个多月没人鸟。只好愤然自己找BUG修BUG了。

这一过程说起来辛酸辛苦,不是专业开发略懂皮毛的我,先从学chrome开发者工具开始。。发现不在JS端在后台。。后台又找了N久。。最终根据某个漏洞信息猜到了地方forum_ajax.php和\source\include\portalcp\portalcp_upload.php

} elseif($_GET['action'] == 'downremoteimg') {
    if(!$_G['group']['allowdownremoteimg']) {
        dexit();
    }
    $_GET['message'] = str_replace(array("\r", "\n"), array($_GET['wysiwyg'] ? '<br />' : '', "\\n"), $_GET['message']);
    preg_match_all("/\[img\]\s*([^\[\<\r\n]+?)\s*\[\/img\]|\[img=\d{1,4}[x|\,]\d{1,4}\]\s*([^\[\<\r\n]+?)\s*\[\/img\]/is", $_GET['message'], $image1, PREG_SET_ORDER);
    preg_match_all("/\<img.+src=('|\"|)?(.*)(\\1)([\s].*)?\>/ismUe", $_GET['message'], $image2, PREG_SET_ORDER);
    $temp = $aids = $existentimg = array();
    if(is_array($image1) && !empty($image1)) {
        foreach($image1 as $value) {
            $temp[] = array(
                '0' => $value[0],
                '1' => trim(!empty($value[1]) ? $value[1] : $value[2])
            );
        }
    }

最后。。。就是个正则表达式的问题(其中各种DEBUG辛苦和技巧省略了数百字),shit!这么牛逼的正则表达式都能写得出,居然还有BUG?这是故意留坑的么?

/\<img.+src=('|\"|)?(.*)(\\1)([\s].*)?\>/ismUe

改为

/\<img.+\bsrc\b\s*=('|\"|)?(.*)(\\1)([\s].*)?\>/ismUe

一开始猜的没错,精准匹配src后,再增加等号前的空格等符号宽容度,解决问题!

PS:经过测试,依然有个遗憾的地方就是微信公众号文章的图片没法下载,因为图片做了防盗链,服务器端下载图片链接提示不存在。下载方式还不是很完美。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值