本文介绍了有效的防炸房措施,以预防和应对炸房捣乱现象,帮助维护房间秩序并提高业务安全性。
炸房捣乱指非法用户扰乱房间聊天秩序的现象,通常出现在语音聊天室、多人连麦直播等互动场景中。常见的炸房捣乱行为包括:
为避免出现炸房捣乱现象,你可以采取一系列预防措施加强 app 客户端和 app 服务端的安全防御,不给非法用户可乘之机。
各项预防措施的作用节点如下图所示:
为提高 SDK 的安全性,声网推荐将 SDK 升级到最新版本。
为保证通信安全,声网强烈建议在 app 客户端使用 Token 鉴权。使用 Token 鉴权不仅能保证只有得到授权的用户才能加入频道,还能控制用户的发流权限。
根据你的项目情况选择使用 Token 鉴权的方法:
使用 Token 鉴权后,要注意防止 App ID 和 App 证书泄露。声网建议将 App ID 和 App 证书存放在 app 服务端,不要对外公开。如果疑似泄密,请及时更新 App 证书。
建议在频道内在线人数处于低峰时更新 App 证书,避免出现大规模的用户登录失败。
为防止非法用户利用 Token 有效期过长等漏洞,你可以通过以下方法加强 Token 鉴权的安全性:
privilegeExpiredTs
参数。Token 失效后,所有用户都会被移出频道,非法用户将无法使用该 Token 反复登录频道。onTokenPrivilegeWillExpire
回调,提醒需要更新 Token。收到该回调时,你需要在 app 服务端生成新的 Token,然后调用 renewToken
将新生成的 Token 传给 SDK。通常情况下,使用 Token 鉴权并加强 Token 鉴权的安全性就能满足大部分实时互动场景的需求。
在此基础之上,声网还支持对用户在频道内的发流进行鉴权,即连麦鉴权。连麦鉴权尤其适用于观众需要频繁上下麦与主播互动的场景,可以防止上麦用户制造噪音、发送违规内容、破坏聊天秩序等。
声网提供以下两种连麦鉴权方案:
role
参数设置用户角色,并通过 privilegeExpiredTs
参数设置用户角色的有效时间。此时,用户必须先申请角色为主播的 Token,然后调用 setClientRole
将角色切换为主播,才能在频道内发流。实现方法详见使用连麦鉴权功能。pubAudioPrivilegeExpiredTs
、pubVideoPrivilegeExpiredTs
、pubDataStreamPrivilegeExpiredTs
参数分别设置用户发布音频流、视频流和数据流的有效时间。此时,用户必须先申请具有对应权限的 Token,才能在频道内发布音频流、视频流或数据流。实现方法详见连麦鉴权相关文档。 连麦鉴权需要开通才能使用。详见开启连麦鉴权。
当频道内有用户加入、离开、切换角色时,你的 app 服务端和声网服务端需要及时同步信息,避免非法用户趁虚而入。
为确保频道重要事件的及时同步,你可以使用声网频道管理的以下功能:
此外,你可以在网络中断重连时注意监听 onRejoinChannelSuccess
回调,及时获取重新加入频道的用户 ID,保证 app 服务端的频道用户列表与声网服务端的频道用户列表一致。
如果炸房捣乱现象已经发生,通常可以通过查找非法用户和处理非法用户来解决炸房问题。
你可以通过以下几种方法查找非法用户:
方法一(推荐):
开通声网消息通知服务并接收频道事件回调。当收到主播加入频道或用户角色切换为主播事件时,查询 app 服务端上维护的上麦用户列表,判断新加入的主播是否合法。
方法二:
在 app 服务端定期调用声网 RESTful API https://api.agora.io/dev/v1/channel/user/{appid}/{channelName}
查询声网服务端的在线频道用户列表,与 app 服务端上维护的用户列表进行对比,找到非法用户。
该 API 调用频率上限为每秒 20 次。如果调用频率超出限制,请参考如何处理服务端 RESTful API 调用超出频率限制?
方法三:
在 app 客户端调用 enableAudioVolumeIndication
开启说话者音量提示。开启该方法后,SDK 会定期向 app 返回 onAudioVolumeIndication
回调,其中包含了正在说话的远端用户列表。你可以将返回列表与 app 服务端维护的用户列表做对比,找出非法用户。
找到非法用户后,需要及时制止其炸房捣乱行为,尽快恢复房间秩序。你可以采用以下一种或多种方法阻止捣乱行为:
方法一:禁止非法用户发流
具体有以下做法:
setClientRole
将用户角色设置为观众,取消其发流权限。https://api.agora.io/dev/v1/kicking-rule
,在请求包体中将 privileges
参数设置为 publish_audio
和 publish_video
,禁止非法用户发送音视频流。方法二:停止接收非法用户的音频流
如果非法用户劫持了向其下发的消息,app 服务端可以向所有合法的客户端下发禁言消息,让合法客户端调用 muteRemoteAudioStream
停止接收非法用户的音频流。
方法三:将非法用户踢出频道或封禁其 IP 地址
App 服务端调用 https://api.agora.io/dev/v1/kicking-rule
,在请求包体中的 privileges
参数设置为 join_channel,并设置 cname、uid 和 ip 三个字段,
将非法用户踢出频道或封禁其 IP 地址。
声网服务端根据 cname
、uid
和 ip
三个字段的填写方式进行踢人操作,具体规则如下:
cname
,不填写 uid
和 ip
,则任何人都无法登录 app 中该 cname
对应的频道。uid
,不填写 cname
和 ip
,则该 uid
无法登录 app 中的任何频道。ip
,不填写 cname
和 uid
,则该 ip
无法登录 app 中的任何频道。cname
和 uid
,不填写 ip
,则该 uid
无法登录 app 中该 cname
对应的频道。