主页 > 趣闻百科

IP已被列入黑名单什么意思(短信验证码接口)

云基奔 2024-03-11 13:22:53

摘要:恶意攻击者通常会通过自动化工具进行攻击,尤其是会针对一些高频接口、核心接口进行恶意的访问,恶意的攻击,比如:注册登录接口、秒杀接口等等。接口被狂刷会带来很高的瞬时吞吐量

恶意攻击者通常会通过自动化工具进行攻击,尤其是会针对一些高频接口、核心接口进行恶意的访问,恶意的攻击,比如:注册登录接口、秒杀接口等等。

接口被狂刷会带来很高的瞬时吞吐量,很容易超过1Wqps,甚至10WQPS。这样的超高并发,会导致系统的瞬时雪崩,严重的可能会导致线上系统瘫痪。

接口狂刷的主要防范措施:

1.使用HTTPS

使用 HTTPS 可以保护数据传输的安全性,可以防止恶意攻击者窃取数据。HTTPS 使用 SSL/TLS 协议对数据进行加密,可以确保数据在传输过程中不被篡改或窃取。

2.交互式验证

主要措施就是验证码验证及人机验证。像登录这类接口我们可以添加一个验证码验证,要求用户输入验证码,但是对于短信验证码接口,我们可以通过人机验证方式,检查用户行为,例如:拖动滑块或识别图片中的文字等等

3.安全参数校验

当接口被恶意狂刷时,可以通过安全参数校验来防止这种攻击。安全参数校验是指在接口请求中添加一些校验参数,例如时间戳、随机字符串、签名等,来验证请求的合法性。这样可以防止攻击者通过恶意程序进行大量的请求攻击。

具体来说,可以通过以下步骤来实现安全参数校验:

  1. 在接口请求中添加时间戳参数,例如:timestamp=1622945123
  2. 在接口请求中添加随机字符串参数,例如:nonce=abc123
  3. 将所有请求参数按照参数名的字母顺序排序,例如:nonce=abc123×tamp=1622945123
  4. 将排序后的参数按照“参数名=参数值”的格式拼接成一个字符串,例如:nonce=abc123×tamp=1622945123
  5. 将拼接后的字符串加上一个密钥(可以是预先约定好的密钥),例如:nonce=abc123×tamp=1622945123&key=secret
  6. 对加密后的字符串进行哈希计算,例如使用 MD5 算法,得到一个签名值,例如:c0c3f9a2a4c4c4dcd6d5b7b2a2e4d7b1。将签名值添加到接口请求中,例如:nonce=abc123×tamp=1622945123&signature=c0c3f9a2a4c4c4dcd6d5b7b2a2e4d7b1
  7. 在接口服务端对接口请求进行校验时,按照相同的算法计算签名值,并与请求中的签名值进行比对,如果一致,则说明请求合法,否则说明请求不合法

通过以上步骤,可以有效地防止接口被恶意狂刷的攻击。

理论上,哈希计算很难破解,但是如果攻击者知道了hash算法和盐,攻击者就有可能伪造出带有正确校验位的签名值,从而绕过接口的限流和安全机制,因此,该方案主要适用于需要简单防范一些低强度攻击的场景,例如防范垃圾请求或非法爬虫等

下面给大家提供了一些生成和验证的PHP代码,有需要的可以直接拿去用。

生成签名数据:

<?php/** * 获得随机字符串 * @param integer $length 随机字符串的长度 * @param string $chars 随机字符串的内容 * @return string */function getRandStr($length, $chars = '0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'){ $randStr = ''; while ($length--) { $randStr .= $chars[rand(0, strlen($chars) - 1)]; } return $randStr;}/** * 参数签名 * @param array $params 所有的请求参数 * @param $sercet 密钥 * @return string */function getSign($params,$sercet){ if(isset($params['signature'])) unset($params['signature']); ksort($params); $string = join('',$params); $string .= $sercet; return md5($string);}$params = ['timestamp'=>time(),'nonce'=>getRandStr(10)];//前后端预定的密钥$sercet = 'sacfdfsa4e354343twg34';$params['signature'] = getSign($params,$sercet);echo json_encode($params,JSON_UNESCAPED_UNICODE);

验证签名代码:

<?php/** * 参数签名 * @param array $params 所有的请求参数 * @param $sercet 密钥 * @return string */function getSign($params,$sercet){ if(isset($params['signature'])) unset($params['signature']); ksort($params); $string = join('',$params); $string .= $sercet; return md5($string);}/** * 验证签名 */function validateSignature($params,$sercet){ //判断请求参数中是否有签名字段,并且字段不能为空 if(empty($params['signature']) || empty($params['nonce']) || empty($params['timestamp'])) { throw new Exception('无效请求',404); } //验证签名 if(getSign($params,$sercet)!=$params['signature']) { throw new Exception('无效签名',404); } return true;}$params = $_POST;//前后端预定的密钥$sercet = 'sacfdfsa4e354343twg34';try { //验证这一步可以但对放在框架的应用验证层面 validateSignature($params,$sercet); echo '验证成功'; //验证通过后再处理其他业务逻辑}catch (Exception $e){ echo $e->getMessage();}

4. 参数加密传输

对于参数这一块,我还可以进一步优化,将参数全部加密处理,再传给服务器。加密的方式有好几种,推荐大家使用非对称加密RSA,不了解的可以看看我之前的文章【PHP数据加密的几种方式

5.访问限流

访问限流是一种常见的保护机制,用于控制对某个资源的访问速率,以防止过多的请求导致系统负载过高或崩溃。

限流主要有两种,一是面向用户限流:我们可以通过nginx对用户IP登进行限流。

还有一种是面向接口限流,针对某个核心接口限制用户的请求次数。我们可以在应用层利用Redis添加当前用户的请求限制

6.IP封禁

IP封禁是常见的网络安全措施,用于保护服务器免受恶意攻击。IP封禁是指将某个IP地址列入黑名单,禁止其访问服务器。

在实际应用中,可以通过配置防火墙规则、使用反向代理服务器、使用专业的防火墙软件等方式来实现IP封禁和防刷,我们还可以结合nginx做一个IP封禁的脚本。

后期我们会分享一个基于nginx的IP封禁的脚本,有兴趣的可以关注公众号哦!

7.日志监控

访问日志监控是一种常见的监控方式,用于监控网站、应用程序等的访问情况,可以帮助我们了解用户的行为和需求,以便做出相应的优化和改进。

常见的访问日志监控工具有 Apache 的 AccessLog、Nginx 的 AccessLog、ELK Stack 、PHP 请求日志监控等。这些工具、框架帮助我们收集、分析和可视化访问日志数据,从而更好地了解用户的需求和行为。

监控访问日志可以帮助发现未经授权的访问请求。可以使用日志记录工具来记录每个请求的 IP 地址、时间戳和请求参数。如果发现异常请求,可以及时采取措施,以防止攻击。

有遗漏或者不对的可以在我的公众号留言哦

(0)

相关推荐

发表评论

登录后才能评论