淘东电商项目(68) -互联网安全架构设计(黑名单拦截及MD5加签)
引言
本文代码已提交至Github(版本号:
d439ec96b39dc0adf0d697cbc6bfc87c1c3b7dc8
),有兴趣的同学可以下载来看看:https://github.com/ylw-github/taodong-shop
在上一篇博客《淘东电商项目(67) -互联网安全架构设计(方法论)》,主要讲解了互联网安全架构设计的方法,主要介绍了如下几种:
- 基于网关实现IP黑名单与名单拦截
- API接口实现Token授权认证
- 使用MD5实现API接口验证签名,防止抓包篡改数据
- 实现API接口安全加密传输(公钥和私钥互换机制)
- 基于Oauth2.0 实现API接口开放平台
- 接口参数使用网关实现防止XSS、SQL注入
- 定期工具实现代码健康扫描
本文开始讲解具体的代码实现。
本文目录结构:
l____引言
l____ 1.实现思路
l____ 2.代码实现
l________ 2.1 数据库代码
l________ 2.2 建造者模式
l________ 2.3 建造者模式使用
l____ 3.测试
1.实现思路
在上图,可以看到,外网访问时会经过我们的网关,如果我们需要对访问者做出安全措施,必须在网关上做处理,如:“ip黑名单处理”、“MD5加签处理”等。
在SpringCloud中,这些处理均在zuul网关过滤器中处理,伪代码如下:
public class GatewayFilter extends ZuulFilter {@Overridepublic Object run() throws ZuulException {RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();HttpServletResponse response = ctx.getResponse();response.setContentType("UTF-8");// TODO 1.验证ip地址是否在黑名单里,如果是则拒绝访问// TODO 2.通过MD5验签,判断参数是否被篡改// TODO 3.其它......return null;}
可以看到上面的代码是一步一步去处理的,其实是可以优化这种写法的,本文用到“建造者模式”。
2.代码实现
2.1 数据库代码
先贴上黑名单表的sql:
CREATE TABLE `blacklist` (`ID` int(11) NOT NULL COMMENT '主键id',`IP_ADDRES` varchar(255) DEFAULT NULL COMMENT 'ip地址',`RESTRICTION_TYPE` varchar(255) DEFAULT NULL COMMENT '限制类型',`AVAILABILITY` varchar(255) DEFAULT NULL COMMENT '是否可用',`REVISION` int(11) DEFAULT NULL COMMENT '乐观锁',`CREATED_BY` varchar(32) DEFAULT NULL COMMENT '创建人',`CREATED_TIME` datetime DEFAULT NULL COMMENT '创建时间',`UPDATED_BY` varchar(32) DEFAULT NULL COMMENT '更新人',`UPDATED_TIME` datetime DEFAULT NULL COMMENT '更新时间',PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.2 建造者模式
建造者模式之前我的博客有讲解过,有兴趣的童鞋可以参阅:
- 《设计模式10 - 建造者模式【Builder Pattern】》
- 《设计模式系列教程(07) - 建造者模式》
2.3 建造者模式使用
①定义接口:
/*** description: 网关行为建造者* create by: YangLinWei* create time: 2020/5/20 9:09 上午*/
public interface GatewayBuild {/*** 黑名单拦截*/Boolean blackBlock(RequestContext ctx, String ipAddres, HttpServletResponse response);/*** 参数验证*/Boolean toVerifyMap(RequestContext ctx, String ipAddres, HttpServletRequest request);}
②接口实现:
/*** description: 参数验证* create by: YangLinWei* create time: 2020/5/20 9:09 上午*/
@Slf4j
@Component
public class VerificationBuild implements GatewayBuild {@Autowiredprivate BlacklistMapper blacklistMapper;@Overridepublic Boolean blackBlock(RequestContext ctx, String ipAddres, HttpServletResponse response) {// 2.查询数据库黑名单Blacklist meiteBlacklist = blacklistMapper.findBlacklist(ipAddres);if (meiteBlacklist != null) {resultError(ctx, "ip:" + ipAddres + ",Insufficient access rights");return false;}log.info(">>>>>>ip:{},验证通过>>>>>>>", ipAddres);// 3.将ip地址传递到转发服务中response.addHeader("ipAddres", ipAddres);log.info(">>>>>>ip:{},验证通过>>>>>>>", ipAddres);return true;}@Overridepublic Boolean toVerifyMap(RequestContext ctx, String ipAddres, HttpServletRequest request) {// 4.外网传递参数验证Map<String, String> verifyMap = SignUtil.toVerifyMap(request.getParameterMap(), false);if (!SignUtil.verify(verifyMap)) {resultError(ctx, "ip:" + ipAddres + ",Sign fail");return false;}return true;}private void resultError(RequestContext ctx, String errorMsg) {ctx.setResponseStatusCode(401);ctx.setSendZuulResponse(false);ctx.setResponseBody(errorMsg);}
}
③定义组装类:
@Component
public class GatewayDirector {@Resource(name = "verificationBuild")private GatewayBuild gatewayBuild;public void direcot(RequestContext ctx, String ipAddres, HttpServletResponse response, HttpServletRequest request) {/*** 黑名单拦截*/Boolean blackBlock = gatewayBuild.blackBlock(ctx, ipAddres, response);if (!blackBlock) {return;}/*** 参数验证*/Boolean verifyMap = gatewayBuild.toVerifyMap(ctx, ipAddres, request);if (!verifyMap) {return;}}}
④过滤器里使用:
/*** description: 网关拦截* create by: YangLinWei* create time: 2020/5/20 9:10 上午*/
@Component
@Slf4j
public class GatewayFilter extends ZuulFilter {@Autowiredprivate GatewayDirector gatewayDirector;@Overridepublic Object run() throws ZuulException {RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();HttpServletResponse response = ctx.getResponse();response.setContentType("UTF-8");// 1.获取ip地址String ipAddres = getIpAddr(request);if (StringUtils.isEmpty(ipAddres)) {resultError(ctx, "未能够获取到ip地址");}gatewayDirector.direcot(ctx, ipAddres, response, request);return null;}private void resultError(RequestContext ctx, String errorMsg) {ctx.setResponseStatusCode(401);ctx.setSendZuulResponse(false);ctx.setResponseBody(errorMsg);}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic int filterOrder() {return 0;}/*** 在方法之前拦截* * @return*/@Overridepublic String filterType() {return "pre";}/*** 获取Ip地址* * @param request* @return*/public String getIpAddr(HttpServletRequest request) {String ip = request.getHeader("X-Forwarded-For");if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("Proxy-Client-IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("WL-Proxy-Client-IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("HTTP_CLIENT_IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("HTTP_X_FORWARDED_FOR");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getRemoteAddr();}return ip;}}
④application.yml配置过滤的地址:
###服务启动端口号
server:port: 80
###服务注册到eureka地址
eureka:client:service-url:defaultZone: http://localhost:8100/eureka
###服务名称(服务注册到eureka名称)
spring:application:name: taodong-shop-basics-zuul###数据库相关连接datasource:username: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/taodong-gateway?useUnicode=true&characterEncoding=utf8&useSSL=false
### 配置网关反向代理
zuul:routes:api-a:### 以 /api-weixin/访问转发到会员服务path: /api-weixin/**serviceId: taodong-shop-service-weixinapi-b:### 以 /api-member/访问转发到订单服务path: /api-member/**serviceId: taodong-shop-service-memberapi-c:### 以 /api-member/访问转发到订单服务path: /api-pay/**serviceId: taodong-shop-service-paytaodong-shop:zuul:swagger:document: '[ { "name": "taodong-shop-service-member", "location": "/taodong-shop-service-member/v2/api-docs","version": "2.0" }, { "name": "taodong-shop-service-weixin", "location":"/taodong-shop-service-weixin/v2/api-docs", "version": "2.0" } ]'
### mybatis 日志打印
mybatis:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
logging:level:com.ylw.basics.zuul.mapper: debug
3.测试
浏览器访问:
http://127.0.0.1/api-pay/cratePayToken?payAmount=8882&orderId=20200513141452&userId=27&productName=玉米香肠,可以看到被拦截了。
数据库黑名单,改为允许访问:
可以看到能正常访问:
本文完!
淘东电商项目(68) -互联网安全架构设计(黑名单拦截及MD5加签)相关推荐
- 淘东电商项目(79) -项目Github开源
1. 项目介绍 Github地址:https://github.com/ylw-github/taodong-shop 众所周知,目前主流的电商企业就是 "淘宝" 和 " ...
- 淘东电商项目(20) -会员唯一登录
引言 在上一节<淘东电商项目(19) -日志打印>,主要讲解「淘东项目」slf4j日志框架的基本使用方法. 本文代码已提交至Github(版本号:e2b2700c36fdaef263681 ...
- 淘东电商项目(27) -门户登出功能
引言 本文代码已提交至Github(版本号:42c2ed4af58dac7388e399a1f3606baf4c57744e),有兴趣的同学可以下载来看看:https://github.com/ylw ...
- 淘东电商项目(47) -商品搜索服务功能的实现(集成拼音分词器)
引言 本文代码已提交至Github,有兴趣的同学可以下载来看看:https://github.com/ylw-github/taodong-shop 在上一篇博客<淘东电商项目(46) -商品搜 ...
- 淘东电商项目(14) -公众号获取注册码功能
引言 在上一节<淘东电商项目(13) -项目整合WxJava>,主要讲解如何把WxJava框架整合到我们的电商项目,并完成了"鹦鹉学舌"的功能. 代码已提交至Githu ...
- 淘东电商项目(35) -SSO单点登录(登录功能完善)
引言 本文代码已提交至Github(版本号:725238a1d0c829ee28cdef0ffe49e5f1c0020a2b),有兴趣的同学可以下载来看看:https://github.com/ylw ...
- 淘东电商项目(26) -门户登录功能
引言 本文代码已提交至Github(版本号:8f3a993f0f9b92071437d16ed290e27ac1c64cde),有兴趣的同学可以下载来看看:https://github.com/ylw ...
- 2 大数据电商数仓项目——项目需求及架构设计
2 大数据电商数仓项目--项目需求及架构设计 2.1 项目需求分析 用户行为数据采集平台搭建. 业务数据采集平台搭建. 数据仓库维度建模(核心):主要设计ODS.DWD.DWS.AWT.ADS等各个层 ...
- 大数据项目之电商数仓、数据仓库概念、项目需求及架构设计
文章目录 1.数据仓库概念 2. 项目需求及架构设计 2.1 项目需求分析 2.1.1 采集平台 2.1.2 离线需求 2.1.3 实时需求 2.1.4 思考题 2.2 项目框架 2.2.1 技术选型 ...
最新文章
- python使用imbalanced-learn的NeighbourhoodCleaningRule方法进行下采样处理数据不平衡问题
- 一文概览深度学习中的五大正则化方法和七大优化策略
- 新瓶旧酒ASP.NET AJAX(6) - 客户端脚本编程
- .NET 5 程序高级调试-WinDbg
- html流式布局插件,Jquery瀑布流网格布局插件
- 面试时会谈薪的人一开口就赢了:让你薪资翻倍的谈薪技巧
- idea总结几个不错的插件
- 5G套餐月资费感受下:最低325元 仅提供8GB数据流量
- pb中建立人员信息表_根据部门名称,从Excel人员花名册表格中快速调取所有员工信息...
- oracle “**with as**”短语,也叫做子查询部分。
- ArcEngine 固定比例放大缩小
- python爬虫爬取网页图片_Python之多线程爬虫抓取网页图片
- 大屏可视化之适配和布局
- 基于STM32的物联网健康监测系统设计(附源码)
- markdown 目录一键生成和转为 word 格式
- 学习笔记25马氏链模型
- 北京清华长庚医院核酸检测流程
- iOS 关于ASIHTTPRequest
- 网站自动链接SEO优化技巧
- srs流媒体服务器推流的流程