You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Streamlit付费课程平台:单邮箱单设备登录及IP获取异常问题咨询

防止Streamlit课程网站邮箱共享的解决方案

我希望每个邮箱仅能在一台设备登录。目前我正在开发一个基于Streamlit(Python API)的课程视频展示网站,希望仅允许付费用户观看视频,但用户通过邮箱登录,存在用户将邮箱共享给他人的风险,请问该如何防范此问题?
我尝试通过以下代码获取客户端IP地址,但IP每两天就会变化,并非固定值(我认为未正确获取到真实IP地址)。
注:Streamlit应用部署在GitHub上,通过Streamlit Cloud运行GitHub中的脚本。

WEB = 'https://whatismyip.com/'
def get_client_ip():
    try:
        response = requests.get(WEB)
        if response.status_code == 200:
            # everythin is good
            data = response.json()
            return data.get('ip', 'Unknown')
        else:
            return 'Unknown'
    except requests.exceptions.RequestException:
        return 'Unknown'

一、修正客户端真实IP获取逻辑

你当前的代码请求第三方网站获取的是Streamlit Cloud服务器的公网IP,并非用户的真实客户端IP,所以会出现IP频繁变化的情况。正确的做法是从Streamlit的请求头中提取由平台转发的真实IP:

import streamlit as st

def get_client_ip():
    try:
        # Streamlit Cloud通过X-Forwarded-For头传递客户端真实IP
        ip = st.request.headers.get('X-Forwarded-For')
        if ip:
            # 若存在多个代理IP,取最原始的客户端IP(第一个)
            ip = ip.split(',')[0].strip()
            return ip
        # 备选头,兼容部分代理场景
        ip = st.request.headers.get('X-Real-IP')
        return ip or 'Unknown'
    except Exception:
        return 'Unknown'

二、多维度防范邮箱共享方案

仅靠IP绑定无法完全解决问题(家用宽带多为动态IP,同一用户的IP也会变化),建议结合以下多种方式构建防护体系:

  • 设备特征+会话令牌绑定:
    除了IP,提取客户端的User-Agent(浏览器/设备型号信息),将邮箱、IP、User-Agent三者关联到登录生成的会话令牌中。用户后续访问时,验证当前设备特征与令牌绑定的信息匹配度,若差异过大则触发二次验证(比如发送邮箱验证码)。

  • 限制单账号并发会话:
    记录每个邮箱的活跃会话数,只允许1个有效会话存在。当新登录请求触发时,强制注销旧会话,并向原登录设备发送通知邮件,提醒账号可能被共享。

  • 定期身份验证:
    每隔固定时长(比如2小时)或用户进入视频播放页面时,要求输入邮箱验证码,增加账号共享的操作成本。

  • 视频动态水印:
    在课程视频中添加包含用户邮箱ID、登录时间的动态水印,即使视频被录屏传播,也能追溯到共享源头,对用户形成威慑。

  • 异常行为监控:
    监控账号的异常操作,比如短时间内从多个不同IP/设备登录、快速切换大量视频、播放倍速异常等,触发预警后暂停账号权限并人工审核。

  • 明确用户协议约束:
    在付费环节明确告知用户禁止账号共享,一旦发现违规立即封禁账号且不予退款,从规则层面降低共享动机。

内容的提问来源于stack exchange,提问作者someone_398492

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 21:55:29