本站首页 返回顶部 关于博主

给小程序中的图片增加安全内容检查

背景

9月30日晚上,在没有任何突然收到一条信息提示 图片水印工具 因涉嫌违规,封禁“被搜索”能力,如下图所示。

图片水印工具仅在用户的手机本地对图片进行处理,仅限个人使用,上传到服务器,也不无法分享。小程序上线一年半,功能比较简单,最近一次更新是一年前修复一个小 bug。

收到这条信息,下意识认为这是个误会,10月1日发起了申诉。遗憾的是,10月10日收到回复,申诉失败。仍旧提示“该小程序中涉嫌存在政治敏感信息等内容安全问题,未接入内容安全接口相关能力及建立审核巡查机制。”

我困惑了,看来不是误会。怎么解决呢?网上一搜,案例还挺多的,对于图片处理的小程序,都应该接入微信的安全检查 API:imgSecCheck,所有的图片在处理之前,都应该使用 imgSecCheck 进行检查。

改吧,人在屋檐下,不得不低头。

思路

在小程序的内容安全中找到 security.imgSecCheck 函数的说明,这个函数必须早服务端调用,需要给它传 2 个参数,1个是 accessToken,一个是图片的内容。

图片水印工具是一个纯客户端的应用,没有服务端。如果要调用 imgSecCheck,那必须增加一个服务器,做 2 件事情:1. 在服务器端维护好 accessToken,保证每2小时更新一次;2.增加一个 API 供小程序端调用,当小程序调用这个API时,服务端调用 imgSecCheck,并把返回值返回给小程序。

为了增加一个内容安全检查的功能,增加一台服务器,成本有点高。有没有其他的方案呢?

微信最近引入了云开发的功能。采用云开发作为服务端,应该可以节省不少成本。

实现

那就决定采用云开发。

先在本机搭建云开发环境,云开发的服务端是 nodejs。详细步骤可参见:小程序云开发全套实战教程,本文不再赘述。

接下来,创建云开发(服务端)的API,命名为 imgSecCheck,在index.js文件中加入安全内容检查的代码,代码如下:

 // 云函数入口文件 

我们来读一下这段代码。第 10 行、11行先读取两个参数 contentType、value,其中 contentType 是图片类型,可能值是“image/png”、“image/jpg”等常见的图片类型,第二个值是图片数据,类型为 ArrayBuffer。

由于 腾讯的图片内容检查函数可接受的图片数据为 Buffer,所以需要使用 Buffer.from() 转换成 Buffer。第15行 ~ 第20行是调用腾讯的内容检查函数security.imgSecCheck,获取结果之后再返回给小程序端。

本来在调用 security.imgSecCheck 函数时,需要传入参数 access_token,以确保调用方的可信度。在腾讯看来,云开发环境是天然的可信方,所以云开发在调用时无需 access_token。

以上是服务端的实现,现在我们开发小程序端。

首先,通过 wx.getImageInfo() 获取图片的类型,然后使用  wx.getFileSystemManager().readFile() 读取文件,获取的数据 res.data 即是文件 Buffer,最后调用刚才开发的云函数既可以了。详细代码如下:

 

最后,把服务端代码上传到云开发环境,就可以运行了。

总结

小程序的环境…. 不容乐观。

使用云开发环境,免去了 access_token 的维护工作,一定程度上也简化了开发,挺好的。

在重新提交代码之后,很快就审批了,我也把它提交上线了。

只是,我心里仍旧有很深的疑虑:一个在用户本地处理图片的小程序,无需上传图片,也没有分享功能,怎么可能存在内容不安全因素呢?加上内容安全检查功能,一方面增加开发这的工作量,另一方面,在浪费用户流量的同时,也影响了小程序的性能。这个内容安全检查功能真的这么重要吗?

后续

遗憾的是,即使重新提交上线了,“被搜索”功能仍旧被限制,没有申诉渠道。也就是说,从今以后,用户无论如何都搜索不到 图片水印工具 这个小程序了。向小程序的客服反馈,也没有回音。

Google的代码Review实践与一些感悟

接触到《Google的工程实践文档》纯属机缘巧合。自认为是一枚资深码农,对代码review早已驾轻就熟。读完之后,仍旧受益匪浅。受到原文中“希望其他组织也能从中受益”这句话的感召,我决定将其翻译成中文,托管到Github上,与大家一起分享。

原文标题为工程实践文档,表达更直接点,就是代码review规约。全文分两部分,一部分是针对代码审核人的指南,另一部分是针对代码提交人的指南,两部分文档交相呼应。 阅读全文 »

Scrum的事件–敏捷框架Scrum系列(4)

Scrum中用到了几个规定的事件,即Scrum中的常规会议。Scrum框架使会议的需求做到最小化,以保证团队有更多的时间开发需求。所有的事件在固定的时间发生,这意味着每个事件的持续时间不应超过预先设定的最大值。当Sprint开始之后,Sprint的长度就固定下来了,不允许延长或缩短。在进行某个事件时,如果会议目标已经达到了就可以结束,即使花费的时间没有原计划那么长,这样可以避免不必要的时间浪费。 阅读全文 »

百度,你的下限在哪里?

在写这篇文章之前,本来早拟定了标题“狗X的百毒”。写完之后,琢磨了半天,决定改成“百毒,你的下限在哪里?”。一方面,爆粗口实在有失风雅;另一方面,把它与9年前《计算机世界》那篇文章中的腾讯相提并论,有点名不副实。最后发出之前,又忍痛改成了“百度,你的下限在哪里?”。虽然标题改了又改,在与现实的贴近程度上,我自始至终认为这几个标题一代不如一代。 阅读全文 »

怎样从各大音乐网站下载音乐

平常喜欢用QQ音乐在线听歌。

今天登录,发现收藏的歌曲明显变少了。不知道是被我无意中删掉,还是QQ音乐出问题了。原因懒得追究,不如在QQ音乐上再搜一遍,把它们再加回到播放别表中去。可是,搜索之前的音乐时竟然提示“因为版权限制,无法播放”。

歌曲还是放在本地靠谱啊,那我先把QQ音乐中已有的歌曲下载到本地吧。 阅读全文 »