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

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


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

此问题在https://gitee.com/ComsenzDiscuz/DiscuzX提出issues,燃鹅两个多月没人鸟。只好愤然自己找BUG修BUG了。修复discuz x 3.4下载远程图片在有类似src属性时出错的问题_第1张图片

这一过程说起来辛酸辛苦,不是专业开发略懂皮毛的我,先从学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'] ? '
' : '', "\\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("/\/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?这是故意留坑的么?

/\/ismUe

改为

/\/ismUe

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

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

你可能感兴趣的:(Debug/调试,PHP,discuz)