如何防止 app 的短信被刷

2018-11-09 00:46:19 +08:00
 00ing

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 加图片验证码 请求各位如何解决

2546 次点击
所在节点    问与答
18 条回复
111111111111
2018-11-09 01:16:39 +08:00
控制频率
检查请求属 IP 真人概率

图形验证码也可以加, 新 IP 第一次请求不验,从第二次开始要求验
crab
2018-11-09 01:19:08 +08:00
只能限制 IP 了。另外签名都通过你这是没密钥还是 app 都被逆了?
kslr
2018-11-09 01:25:22 +08:00
你给的信息太少了,不要获取代理头,签名太简单了,从限制频率和防止重放开始
CEBBCAT
2018-11-09 01:54:37 +08:00
听得不是很懂,怎么他刷你的短信还走他的接口呢?你是什么身份:App 开发者?短信服务商?
fengyie007
2018-11-09 01:56:40 +08:00
还是加验证码吧,如果不想用输入的,可以用滑块的
fengyie007
2018-11-09 01:59:30 +08:00
检查 ip 和限频都没用,真要刷你的,代理大把大把的
ysc3839
2018-11-09 08:16:08 +08:00
HTTP 头是可以随意修改的,你这么检测 IP 人家就随便改,永远限制不了。
00ing
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
2018-11-09 08:43:24 +08:00
@00ing 你疯了吧,key 直接就打出来
justfindu
2018-11-09 08:52:25 +08:00
@00ing 歇逼 大写的!
kslr
2018-11-09 08:56:06 +08:00
1. 搜索 trusted source IP
3. 假设 APP 已经被反编译,通过固定参数直接请求,那么就防止重放。

总之先分析对手特征和方法,再相应解决
huclengyue
2018-11-09 08:57:52 +08:00
可以把参数和时间戳用 jni 方式加密封装,超过指定时间的请求就不处理
oott123
2018-11-09 08:58:25 +08:00
你这么获取 ip 是很容易被伪造的,建议学习一下怎么拿 ip。
另外对方如果闲着无聊要干你,上大量代理也是很正常的事情,ip 拦不住。图片验证码也拦不住,打码平台了解下。
不过加了之后能显著增加对方成本。
00ing
2018-11-09 08:58:38 +08:00
@kslr key 我随便打的
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
2018-11-09 09:32:28 +08:00
手机端随机生成 16 位的定义好格式的字符串,AES 加密。后端解密,然后这个字符串存起来,如果用过的话就不通过
firefox12
2018-11-09 10:07:21 +08:00
我的话 会这么设计

背后放个 redis 记录 ip 和电话号码 的历史请求次数和历史错误次数
第一次都放行 第二次开始出验证码 验证码分几个级别 按照历史水平 考虑给不给验证码 防止错杀
00ing
2018-11-09 22:14:09 +08:00
@imdong 1 Key 我并没有外部发送出来 ,2 我采取的 ip 不是上面的这个是 yii 框架提供的
我觉得是 app 被反编译出来了
谢谢答复 ,都有做 ip 限制

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/505947

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX