V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
00ing
V2EX  ›  问与答

如何防止 app 的短信被刷

  •  
  •   00ing · 2018-11-09 00:46:19 +08:00 · 2388 次点击
    这是一个创建于 1985 天前的主题,其中的信息可能已经有所发展或是发生改变。

    1 目前对方的接口一直在改变,我目前采取获取 ip 地址 if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) { $realip = $_SERVER["HTTP_X_FORWARDED_FOR"]; } elseif (isset($_SERVER["HTTP_CLIENT_IP"])) { $realip = $_SERVER["HTTP_CLIENT_IP"]; } else { $realip = $_SERVER["REMOTE_ADDR"]; }

    2 目前有做数据校验 目前对方的请求数据都正确 $string = http_build_query($data); $signature = md5($string); //签名

    我提议加图片验证码 ,但老板说很少 app 加图片验证码 请求各位如何解决

    111111111111
        1
    111111111111  
       2018-11-09 01:16:39 +08:00 via Android
    控制频率
    检查请求属 IP 真人概率

    图形验证码也可以加, 新 IP 第一次请求不验,从第二次开始要求验
    crab
        2
    crab  
       2018-11-09 01:19:08 +08:00
    只能限制 IP 了。另外签名都通过你这是没密钥还是 app 都被逆了?
    kslr
        3
    kslr  
       2018-11-09 01:25:22 +08:00 via Android
    你给的信息太少了,不要获取代理头,签名太简单了,从限制频率和防止重放开始
    CEBBCAT
        4
    CEBBCAT  
       2018-11-09 01:54:37 +08:00 via Android
    听得不是很懂,怎么他刷你的短信还走他的接口呢?你是什么身份:App 开发者?短信服务商?
    fengyie007
        5
    fengyie007  
       2018-11-09 01:56:40 +08:00 via Android
    还是加验证码吧,如果不想用输入的,可以用滑块的
    fengyie007
        6
    fengyie007  
       2018-11-09 01:59:30 +08:00 via Android
    检查 ip 和限频都没用,真要刷你的,代理大把大把的
    ysc3839
        7
    ysc3839  
       2018-11-09 08:16:08 +08:00 via Android
    HTTP 头是可以随意修改的,你这么检测 IP 人家就随便改,永远限制不了。
    00ing
        8
    00ing  
    OP
       2018-11-09 08:41:16 +08:00
    @00ing @111111111111 @crab @kslr @CEBBCAT @fengyie007 @ysc3839 我是后台开发人员,
    1 有 v 友说这样子检测 ip 没用请求没用,请求如何检测才是有效的,
    2 限制频率, 他发送的手机号是随机的 不是指定一个手机号
    3 关于签名,这边主要是做数据校验 代码如下


    $data = array_merge(\Yii::$app->request->get(), \Yii::$app->request->post());
    $data['mzlh_key'] = '608fafasdfdf54fadsfasf9b146557c'; //用来验证是否客户端请求
    $mzlh_signature = $data['signature'] ?? '';
    unset($data['signature']);
    ksort($data);//字段排序正序
    $string = http_build_query($data);
    $signature = md5($string); //签名
    kslr
        9
    kslr  
       2018-11-09 08:43:24 +08:00
    @00ing 你疯了吧,key 直接就打出来
    justfindu
        10
    justfindu  
       2018-11-09 08:52:25 +08:00
    @00ing 歇逼 大写的!
    kslr
        11
    kslr  
       2018-11-09 08:56:06 +08:00
    1. 搜索 trusted source IP
    3. 假设 APP 已经被反编译,通过固定参数直接请求,那么就防止重放。

    总之先分析对手特征和方法,再相应解决
    huclengyue
        12
    huclengyue  
       2018-11-09 08:57:52 +08:00 via Android
    可以把参数和时间戳用 jni 方式加密封装,超过指定时间的请求就不处理
    oott123
        13
    oott123  
       2018-11-09 08:58:25 +08:00 via Android
    你这么获取 ip 是很容易被伪造的,建议学习一下怎么拿 ip。
    另外对方如果闲着无聊要干你,上大量代理也是很正常的事情,ip 拦不住。图片验证码也拦不住,打码平台了解下。
    不过加了之后能显著增加对方成本。
    00ing
        14
    00ing  
    OP
       2018-11-09 08:58:38 +08:00
    @kslr key 我随便打的
    imdong
        15
    imdong  
       2018-11-09 09:09:09 +08:00
    楼主这个大概就是所谓的教科书级的错误了。
    获取客户端 IP 不要使用 HTTP_* 这些全都可以伪造,任意伪造。
    我知道你代码在哪来的,百度来的代码全是这个,可是,全是错的啊!!!

    只有最后一个是不会被伪造的,你却最后用...
    打印$_SERVER 数组,找到不是 http 开头头信息里面的客户端 IP 使用。
    如果使用了 CDN,CDN 会提供一个专有的协议头,没用 CDN 就直接 remote 吧。


    另外,楼主心大,居然把 Key 都发出来了,真是分分分钟射爆你。
    签名里面的 Key 不要上传了,另外不应该使用 rsa 之类的非对称的签名吧。

    请求头里面加上时间戳和有效时间,你这个攻击很可能是重放攻击。
    抓到一次包,不停的重复请求。

    你获取到真实的客户端 IP 后,限制客户端 IP 频率,然后请求只能一次有效(随机 token 记录到 Redis ? 10 分钟后失效),请求时间一段时间后失效( 10 秒?)
    cc85060
        16
    cc85060  
       2018-11-09 09:32:28 +08:00
    手机端随机生成 16 位的定义好格式的字符串,AES 加密。后端解密,然后这个字符串存起来,如果用过的话就不通过
    firefox12
        17
    firefox12  
       2018-11-09 10:07:21 +08:00 via iPhone
    我的话 会这么设计

    背后放个 redis 记录 ip 和电话号码 的历史请求次数和历史错误次数
    第一次都放行 第二次开始出验证码 验证码分几个级别 按照历史水平 考虑给不给验证码 防止错杀
    00ing
        18
    00ing  
    OP
       2018-11-09 22:14:09 +08:00
    @imdong 1 Key 我并没有外部发送出来 ,2 我采取的 ip 不是上面的这个是 yii 框架提供的
    我觉得是 app 被反编译出来了
    谢谢答复 ,都有做 ip 限制
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3264 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 106ms · UTC 12:48 · PVG 20:48 · LAX 05:48 · JFK 08:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.