业务场景
IP黑白名单是网络安全管理中常见的策略工具,用于控制网络访问权限,根据业务场景的不同,其应用范围广泛,以下是一些典型业务场景:
- 服务器安全防护:
* 黑名单:可以用来阻止已知的恶意IP地址或曾经尝试攻击系统的IP地址,防止这些来源对服务器进行未经授权的访问、扫描、攻击等行为。
* 白名单:仅允许特定IP或IP段访问关键服务,比如数据库服务器、内部管理系统等,实现最小授权原则,降低被未知风险源入侵的可能性。
- 网站安全防护:
* 黑名单:对于频繁发起恶意请求、爬取数据、DDoS攻击等活动的IP,将其加入黑名单以限制其对网站的访问。
* 白名单:如果只希望特定合作伙伴、内部员工或特定区域用户访问网站内容,则可通过白名单来限定合法访问者的范围。
- API接口保护:
* 对于对外提供的API接口,通过设置IP黑白名单,确保只有经过认证或信任的系统和客户端才能调用接口。
比如比较容易被盗刷的短信接口、文件接口,都需要添加IP黑白名单加以限制。
核心实现
获取客户端IP地址
1 | java复制代码@UtilityClass |
获取到客户端IP后,我们只要比对客户端IP是否在配置的白名单/黑名单中即可。
为了简化使用,可以采用注解的方式进行拦截。
新增注解@IpCheck
1 | java复制代码/** |
新增IpCheckHandlerInterceptorImpl
我们实现HandlerInterceptor
,在接口上进行拦截,如果不满足配置的黑白名单,则抛出异常。
1 | java复制代码/** |
自动装配
核心逻辑写完了,该怎么使用呢?为了达到开箱即用的效果,我们可以接着新增自动装配的代码
新建IpCheckConfig
实现WebMvcConfigurer
接口,添加接口拦截器
1 | typescript复制代码/** |
新建@EnableIpCheck
参考@EnableScheduling
的实现,自己实现一个@EnableIpCheck
,该注解可以控制功能是否启用
1 | less复制代码/** |
业务测试
简单地用代码来试验下效果
新建SampleApplication
1 | less复制代码@SpringBootApplication |
新建测试接口
1 | kotlin复制代码@RestController |
由于本机请求IP地址是0:0:0:0:0:0:0:1
,所以这里使用0:0:0:0:0:0:0:1
而不是127.0.0.1
。
访问/sample/ip-checker/white
接口返回127.0.0.1
访问/sample/ip-checker/black
1 | bash复制代码java.lang.RuntimeException: Access denied, remote ip 0:0:0:0:0:0:0:1 is not allowed. |
访问/sample/ip-checker/all
接口返回127.0.0.1
- 既配置白名单,也配置黑名单,需要既不在白名单,同时在黑名单里,才会拦截。
修改配置
1 | yaml复制代码digit: |
访问/sample/ip-checker/black-config
1 | bash复制代码java.lang.RuntimeException: Access denied, remote ip 0:0:0:0:0:0:0:1 is not allowed. |
最后,可以结合配置中心,以便配置后立即生效。
本文转载自: 掘金