收藏
回答

iOS环境微信小程序image组件网络调用referer头不符合文档规范

框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
小程序 Bug image 微信iOS客户端 8.0.23 2.24.5

按照微信小程序网络基础能力文档:

网络请求的 referer header 不可设置。其格式固定为 https://servicewechat.com/{appid}/{version}/page-frame.html,其中 {appid} 为小程序的 appid,{version} 为小程序的版本号,版本号为 0 表示为开发版、体验版以及审核版本,版本号为 devtools 表示为开发者工具,其余为正式版本。

但iOS版本微信小程序的image标签组件似乎并没有遵循这个标准。

我们利用image组件文档上的官方样例创建了一个demo,将image的src属性替换为了我们自己服务的图片地址(该域名已被配置在小程序业务域名中)。主要代码如下:

<view class="page">
  <view class="page__hd">
    <text class="page__title">image</text>
    <text class="page__desc">图片</text>
  </view>
  <view class="page__bd">
    <view class="section section_gap" wx:for-items="{{array}}" wx:for-item="item">
      <view class="section__title">{{item.text}}</view>
      <view class="section__ctn">
        <image style="width: 200px; height: 200px; background-color: #eeeeee;" mode="{{item.mode}}" src="https://***.cn/***"></image>
      </view>
    </view>
  </view>
</view>


随后,我们使用搭载iOS15.5的iPhoneX运行微信8.0.23打开这个小程序,下面是服务端抓到的部分请求头

GET /*** HTTP/1.1
Host: ***.cn
accept: image/webp,image/png,image/svg+xml,image/*;q=0.8,video/*;q=0.8,*/*;q=0.5
accept-encoding: gzip, deflate, br
user-agent: Mozilla/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.23(0x1800172a) NetType/WIFI Language/zh_CN
accept-language: zh-CN,zh-Hans;q=0.9
referer: https://servicewechat.com/

可以看到,referer头仅包含域名servicewechat.com的内容,并没有带上后面的appid等详细信息

然而,我们再使用搭载Android 12的小米10Pro运行微信8.0.23打开这个小程序,下面是服务端抓到的部分请求头

GET /*** HTTP/1.1
Host: ***.cn
user-agent: Mozilla/5.0 (Linux; Android 12; Mi 10 Pro Build/SKQ1.211006.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/86.0.4240.99 XWEB/3235 MMWEBSDK/20220505 Mobile Safari/537.36 MMWEBID/7900 MicroMessenger/8.0.23.2160(0x28001751) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android
accept: image/avif,image/webp,image/wxpic,image/tpg,image/apng,image/*,*/*;q=0.8
x-requested-with: com.tencent.mm
sec-fetch-site: cross-site
sec-fetch-mode: no-cors
sec-fetch-dest: image
referer: https://servicewechat.com/wxf3e783b48943fae6/0/page-frame.html
accept-encoding: gzip, deflate
accept-language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7

可以看到referer头是完全符合文档格式的传递方式。

同时,利用微信开发者工具进行调试时,抓到的请求也是完全符合文档格式的:

由于我们的服务依赖referer头做防盗链校验,且referer头内的appid参与了校验,iOS端的这种传参方式会导致防盗链校验失败。

请问这是否是一个BUG?是否会安排修复?微信官方是否推荐这种防盗链的做法?

回答关注问题邀请回答
收藏

2 个回答

  • sdjl
    sdjl
    2023-10-28

    2023年10月29,这个问题好像依然没有解决。

    2023-10-28
    有用
    回复
  • 小情绪,
    小情绪,
    2022-11-14

    同问,有答案了吗?

    后续你们是怎么处理的呢?

    2022-11-14
    有用
    回复
登录 后发表内容