通知
本站点除 Legacy 产品与方案外,已迁移至 声网新文档中心 ,当前页面不再维护
文档中心
全部产品
Console 官网 社区 技术支持

如何处理音视频互动直播中的炸房捣乱现象或行为?

分类: 集成类    平台: Android / iOS / macOS / Web / Windows / Unity / Cocos Creator / React Native / Flutter / Electron / Wechat / Flutter2   最后更新时间: 2022/08/08 23:17:42
本文将在近期下线,请参考炸房捣乱现象的预防和应对
炸房捣乱指业务漏洞导致的房间麦位信息混乱或非法用户利用业务漏洞故意扰乱房间聊天秩序。

炸房捣乱现象或行为常出现在以下场景:

  • 在线语音聊天室
  • 多人连麦直播

常见的炸房捣乱现象或行为包括:

  • 由于业务漏洞,客户端上显示的麦位信息与频道中实际说话的人数不相符,出现不明的说话者。
  • 捣乱者通过劫持信令消息,阻碍应用服务器向客户端下发状态消息,扰乱麦位更新或房间管理。
  • 捣乱者非法登录频道后,制造噪音,不断发送违规的音视频内容,破环聊天或互动的秩序。
  • 捣乱者利用 Token 设置的有效期过长,反复登录。

解决方案

定位非法用户

处理炸房捣乱行为的关键是排查并找出非法用户,你可以通过以下几种方法查找非法用户:

  • 方法一(推荐)

    在客户端调用 enableAudioVolumeIndication 开启说话者音量提示。开启该方法后,SDK 会定期向 app 返回 onAudioVolumeIndication 回调,其中包含了正在说话的远端用户列表。你可以将其和你的服务器维护的用户列表做对比,找出非法用户。

  • 方法二

    业务服务器定期调用 Agora RESTful API https://api.agora.io/dev/v1/channel/user/{appid}/{channelName} 查询在线频道的用户列表,并与自己的业务服务器上维护的用户列表做对比,找到非法用户。

  • 方法三

    开通 Agora 消息通知服务并订阅实时通信事件。当收到主播加入频道或用户角色切换为主播事件时,查询业务服务器上维护的上麦用户列表,判断新加入的主播是否合法。

    Agora 消息通知服务目前处于 Beta 阶段,不建议你的核心业务依赖该服务。
  • 方法四:

    如果频道内有捣乱者不断发送色情、暴恐和涉政等语音内容,你可以使用云录制的单流录制模式,接入第三方语音审核,并在审核结果中找到发送违规音频内容的用户。

处理非法用户

找到非法用户后,需要及时制止其行为,以尽快恢复秩序。你可以采用以下任意一种方法阻止捣乱行为:

  • 禁止非法用户发流。

    方法一:
    你的业务服务器给非法用户的客户端下发下麦消息,让非法用户的客户端调用 setClientRole 将用户角色设置为观众,以取消其发流权限。

    方法二:

    业务服务器调用 Agora RESTful API https://api.agora.io/dev/v1/kicking-rule, 并在请求包体中将 privileges 参数设置为 publish_audiopublish_video,以禁止非法用户发送音视频流。

  • 停止接收非法用户的音频流。

    如果非法用户劫持了向其下发的消息,你的业务服务器可以向所有合法的客户端下发禁言消息,让合法客户端调用 muteRemoteAudioStream 停止接收非法用户的音频流。

  • 将非法用户踢出频道或封禁其 IP 地址。

    业务服务器调用 https://api.agora.io/dev/v1/kicking-rule,并将请求包体中的 privileges 参数设置为join_channel 将非法用户踢出频道或封禁其 IP 地址。

    要实现上述功能,你需要将 privileges 参数设置为 join_channel,并按照如下方式填写 cnameuidip 三个字段:

    • 填写 cnameuid,不填写 ip,以禁止该 uid 登录 app 中该 cname 对应的频道。
    • 填写 uid,不填写 cnameip,以禁止该 uid 登录 app 中的任何频道。
    • 填写 ip,不填写 cnameuid,以禁止该 ip 登录 app 中的任何频道。

预防措施

你可以采取以下措施,加强安全防范,避免业务漏洞,不给非法用户可乘之机:

  • 优化 Token 管理。

    • 根据频道内用户平均在线时间设置 Token 的有效时间戳 privilegeExpiredTs 参数。Token 过期后,所有用户都会被移出频道,非法用户就无法使用该 Token 反复登录频道了。
    • 注册 onTokenPrivilegeWillExpire 回调,监听 Token 即将过期事件。当收到该回调时,在服务端生成新的 Token,然后调用 renewToken 将新生成的 Token 传给 SDK。
  • 防止 App ID 和 App 证书泄露。
    建议将 App ID 和 App 证书存放在服务端,不要对外公开。如果疑似泄密,你可以更新 App 证书。

    建议在频道内在线人数处于低峰时更新 App 证书,以避免大规模的用户登录失败。
  • 为避免服务端下发的信令消息被劫持,可以建立超时机制,在确认客户端收到消息后,再进行下一步操作。
    例如,服务端给客户端下发下麦通知后,开启超时计时。如果在规定时间内收到客户端的确认消息,才认定客户端真正下麦,再更新 UI。

  • 为避免业务端的频道用户列表与 Agora 服务器上的频道用户列表不一致,你需要在网络中断重连时注意监听 onRejoinChannelSuccess 回调,以及时获取重新加入频道的用户 ID。