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 加图片验证码 请求各位如何解决
1
111111111111 2018-11-09 01:16:39 +08:00 via Android
控制频率
检查请求属 IP 真人概率 图形验证码也可以加, 新 IP 第一次请求不验,从第二次开始要求验 |
2
crab 2018-11-09 01:19:08 +08:00
只能限制 IP 了。另外签名都通过你这是没密钥还是 app 都被逆了?
|
3
kslr 2018-11-09 01:25:22 +08:00 via Android
你给的信息太少了,不要获取代理头,签名太简单了,从限制频率和防止重放开始
|
4
CEBBCAT 2018-11-09 01:54:37 +08:00 via Android
听得不是很懂,怎么他刷你的短信还走他的接口呢?你是什么身份:App 开发者?短信服务商?
|
5
fengyie007 2018-11-09 01:56:40 +08:00 via Android
还是加验证码吧,如果不想用输入的,可以用滑块的
|
6
fengyie007 2018-11-09 01:59:30 +08:00 via Android
检查 ip 和限频都没用,真要刷你的,代理大把大把的
|
7
ysc3839 2018-11-09 08:16:08 +08:00 via Android
HTTP 头是可以随意修改的,你这么检测 IP 人家就随便改,永远限制不了。
|
8
00ing OP @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); //签名 |
11
kslr 2018-11-09 08:56:06 +08:00
1. 搜索 trusted source IP
3. 假设 APP 已经被反编译,通过固定参数直接请求,那么就防止重放。 总之先分析对手特征和方法,再相应解决 |
12
huclengyue 2018-11-09 08:57:52 +08:00 via Android
可以把参数和时间戳用 jni 方式加密封装,超过指定时间的请求就不处理
|
13
oott123 2018-11-09 08:58:25 +08:00 via Android
你这么获取 ip 是很容易被伪造的,建议学习一下怎么拿 ip。
另外对方如果闲着无聊要干你,上大量代理也是很正常的事情,ip 拦不住。图片验证码也拦不住,打码平台了解下。 不过加了之后能显著增加对方成本。 |
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 秒?) |
16
cc85060 2018-11-09 09:32:28 +08:00
手机端随机生成 16 位的定义好格式的字符串,AES 加密。后端解密,然后这个字符串存起来,如果用过的话就不通过
|
17
firefox12 2018-11-09 10:07:21 +08:00 via iPhone
我的话 会这么设计
背后放个 redis 记录 ip 和电话号码 的历史请求次数和历史错误次数 第一次都放行 第二次开始出验证码 验证码分几个级别 按照历史水平 考虑给不给验证码 防止错杀 |