Spring Boot接口如何有效设计以抵御篡改和重放攻击?
- 内容介绍
- 文章标签
- 相关推荐
本文共计542个文字,预计阅读时间需要3分钟。
示例:本例主要展示内容+请求参数防止篡改攻击+基于timestamp方案,防止重放攻击+使用swagger接口文档自动生成+API接口设计+API接口通过第三方服务调用,必须暴露到外网,并提供相关接口。
本示例主要内容
- 请求参数防止篡改攻击
- 基于timestamp方案,防止重放攻击
- 使用swagger接口文档自动生成
API接口设计
API接口由于需要供第三方服务调用,所以必须暴露到外网,并提供了具体请求地址和请求参数,为了防止被别有用心之人获取到真实请求参数后再次发起请求获取信息,需要采取很多安全机制。
- 需要采用localhost:8080/sign/testGet?username=abc&password=123",
"method": "GET",
"headers": {
"Sign": "46B1990701BCF090E3E6E517751DB02F",
"Timestamp": "1564126422",
"User-Agent": "PostmanRuntime/7.15.2",
"Accept": "*/*",
"Cache-Control": "no-cache",
"Postman-Token": "a9d10ef5-283b-4ed3-8856-72d4589fb61d,6e7fa816-000a-4b29-9882-56d6ae0f33fb",
"Host": "localhost:8080",
"Cookie": "SESSION=OWYyYzFmMDMtODkyOC00NDg5LTk4ZTYtODNhYzcwYjQ5Zjg2",
"Accept-Encoding": "gzip, deflate",
"Connection": "keep-alive",
"cache-control": "no-cache"
}
}
$.ajax(settings).done(function (response) {
console.log(response);
});
注意事项
- 该示例没有设置秘钥,只做了参数升排然后创建md5签名
- 示例请求的参数md5原文本为:Timestamp1564126422{"password":"123","username":"abc"}
- 注意headers请求头带上了Sign和Timestamp参数
- js读取的Timestamp必须要在服务端获取
- 该示例不包括分布试环境下,多台服务器时间同步问题
自动生成接口文档
配置代码
@Configuration @EnableSwagger2 public class Swagger2Config { @Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("com.easy.sign")) .paths(PathSelectors.any()) .build(); } //构建 api文档的详细信息函数,注意这里的注解引用的是哪个 private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("签名示例") .contact(new Contact("签名示例网站", "www.baidu.com", "test@qq.com")) .version("1.0.0") .description("签名示例接口描述") .build(); } }
自动生成文档地址:localhost:8080/swagger-ui.html
资料
- 示例代码-github
- md5在线加密
- 在线时间戳
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对自由互联的支持。
本文共计542个文字,预计阅读时间需要3分钟。
示例:本例主要展示内容+请求参数防止篡改攻击+基于timestamp方案,防止重放攻击+使用swagger接口文档自动生成+API接口设计+API接口通过第三方服务调用,必须暴露到外网,并提供相关接口。
本示例主要内容
- 请求参数防止篡改攻击
- 基于timestamp方案,防止重放攻击
- 使用swagger接口文档自动生成
API接口设计
API接口由于需要供第三方服务调用,所以必须暴露到外网,并提供了具体请求地址和请求参数,为了防止被别有用心之人获取到真实请求参数后再次发起请求获取信息,需要采取很多安全机制。
- 需要采用localhost:8080/sign/testGet?username=abc&password=123",
"method": "GET",
"headers": {
"Sign": "46B1990701BCF090E3E6E517751DB02F",
"Timestamp": "1564126422",
"User-Agent": "PostmanRuntime/7.15.2",
"Accept": "*/*",
"Cache-Control": "no-cache",
"Postman-Token": "a9d10ef5-283b-4ed3-8856-72d4589fb61d,6e7fa816-000a-4b29-9882-56d6ae0f33fb",
"Host": "localhost:8080",
"Cookie": "SESSION=OWYyYzFmMDMtODkyOC00NDg5LTk4ZTYtODNhYzcwYjQ5Zjg2",
"Accept-Encoding": "gzip, deflate",
"Connection": "keep-alive",
"cache-control": "no-cache"
}
}
$.ajax(settings).done(function (response) {
console.log(response);
});
注意事项
- 该示例没有设置秘钥,只做了参数升排然后创建md5签名
- 示例请求的参数md5原文本为:Timestamp1564126422{"password":"123","username":"abc"}
- 注意headers请求头带上了Sign和Timestamp参数
- js读取的Timestamp必须要在服务端获取
- 该示例不包括分布试环境下,多台服务器时间同步问题
自动生成接口文档
配置代码
@Configuration @EnableSwagger2 public class Swagger2Config { @Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("com.easy.sign")) .paths(PathSelectors.any()) .build(); } //构建 api文档的详细信息函数,注意这里的注解引用的是哪个 private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("签名示例") .contact(new Contact("签名示例网站", "www.baidu.com", "test@qq.com")) .version("1.0.0") .description("签名示例接口描述") .build(); } }
自动生成文档地址:localhost:8080/swagger-ui.html
资料
- 示例代码-github
- md5在线加密
- 在线时间戳
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对自由互联的支持。

