`
javashop
  • 浏览: 46830 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java电商系统HTTP协议安全相关应用

阅读更多

业务需求

http请求的配置,决定了该网站的安全性,跨域等问题,让我们一起来看看Javashop电商系统中是如何解决的

先一起了解一下Http请求的常见配置:

一、http请求常见配置及其说明

General :

Request URL:资源的请求url

Request Method:HTTP方法

Status Code:响应状态码   

200(状态码) OK(原因短语)
301 - 资源(网页等)被永久转移到其它URL
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误

Remote Address:远程地址/来源

Referrer-Policy: 

 

空字符串    若设为空串则默认按照浏览器的机制设置referrer的内容,默认情况下是和no-referrer-when-downgrade设置得一样。    no-referrer    不显示referrer的任何信息在请求头中。

no-referrer-when-downgrade    这是默认值。当从https网站跳转到http网站或者请求其资源时(安全降级HTTPS→HTTP),不显示referrer的信息,其他情况(安全同级HTTPS→HTTPS,或者HTTP→HTTP)则在referrer中显示完整的源网站的URL信息。

same-origin    表示浏览器只会显示referrer信息给同源网站,并且是完整的URL信息。所谓同源网站,是协议、域名、端口都相同的网站。

origin    表示浏览器在referrer字段中只显示源网站的源地址(即协议、域名、端口),而不包括完整的路径。

strict-origin     该策略更为安全些,和origin策略相似,只是不允许referrer信息显示在从https网站到http网站的请求中(安全降级)。

origin-when-cross-origin     当发请求给同源网站时,浏览器会在referrer中显示完整的URL信息,发个非同源网站时,则只显示源地址(协议、域名、端口)

strict-origin-when-cross-origin      和origin-when-cross-origin相似,只是不允许referrer信息显示在从https网站到http网站的请求中(安全降级)。

unsaft-url     浏览器总是会将完整的URL信息显示在referrer字段中,无论请求发给任何网站

 

 

Request Headers:

//指定允许其他域名访问Access-Control-Allow-Origin:http:/'//一般用法(*,指定域,动态设置),3是因为*不允许携带认证头和cookies//是否允许后续请求携带认证信息(cookies),该值只能是true,否则不返回'Access-Control-Allow-Credentials:true'

请求头origin字段为当前域

Cache-Control 来控制页面的缓存与否,这里介绍几个常用的参数:

no-cache,浏览器和缓存服务器都不应该缓存页面信息;public,浏览器和缓存服务器都可以缓存页面信息;no-store,请求和响应的信息都不应该被存储在对方的磁盘系统中;must-revalidate,对于客户机的每次请求,代理服务器必须想服务器验证缓存是否过时max-age 在此值内的时间里就不会重新访问服务器

Connection——决定当前的事务完成后,是否会关闭网络连接;

Content-Security-Policy: 内容安全策略

1 script-src 定义js文件的过滤策略
2 'self' 同源策略,即允许同域名同端口下,同协议下的请求
3 'unsafe-inline' 允许行内代码执行frame-ancestors 政策设置一个或多个来源

 Content-Type:text/html ——服务端发送的类型及采用的编码方式

Expires——包含日期/时间, 即在此时候之后,响应过期

Pragma:no-cache ——服务端禁止客户端缓存页面数据

Server:nginx/1.14.0 ——服务端的Web服务端名

Strict-Transport-Security——用来告诉浏览器在指定时间内,这个网站必须通过HTTPS协议来访问。也就是对于这个网站的HTTP地址,浏览器需要先在本地替换为HTTPS之后再发送请求。

Transfer-Encoding——指定报文主体的传输编码方式

Vary 是一个HTTP响应头部信息,它决定了对于未来的一个请求头, 应该用一个缓存的回复(response)还是向源服务器请求一个新的回复

X-Content-Type-Options HTTP 消息头相当于一个提示标志,被服务器用来提示客户端一定要遵循在 Content-Type 首部中对 MIME 类型 的设定

X-Frame-Options: 用来给浏览器 指示允许一个页面 可否在 <frame>, <iframe>, <embed> 或者 <object> 中展现的标记

 
1 deny 表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。
2 sameorigin 表示该页面可以在相同域名页面的 frame 中展示。
3 allow-from uri 表示该页面可以在指定来源的 frame 中展示。

 

X-XSS-Protection 启用XSS过滤。 如果检测到攻击,浏览器将不会清除页面,而是阻止页面加载。

Response Headers

Accept 请求头用来告知(服务器)客户端可以处理的内容类型,这种内容类型用MIME类型来表示

Accept-Encoding:gzip, deflate ——客户端能接收的压缩数据的类型

Accept-Language:en-US,en;q=0.8 ——客户端接收的语言类型

Authorization: 令牌

Host: api.javamall.com.cn 连接的目标主机和端口号

Referer——对请求中 URI 的原始获取方

Sec-Fetch-Dest: empty 取元数据报头指示该请求的目的地,即所获取的数据将如何使用。空的???

Sec-Fetch-Mode: cors 获取元数据标头表明了一个请求的模式。允许跨域

Sec-Fetch-Site 获取元数据标头表明了一个请求发起者的来源与目标资源来源之间的关系

 
1 cross-site 请求的发起源与资源源完全不相同
2 same-origin 请求的发起源与资源源完全相同
3 same-site 请求的发起源与资源源部分相同:同一顶级域名下的二级域名none

 

User-Agent: ——客户端版本号的名字

UUID 是 通用唯一识别码

二、源码

javshop电商系统中,我们如何解决跨域访问的问题呢?

以下就是解决方案:在SellerSecurityConfig 类中

 

/**
 * 定义跨域配置
 * @return
 */
@Bean
CorsConfigurationSource corsConfigurationSource() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(true);
    config.addAllowedOrigin(CorsConfiguration.ALL);
    config.addAllowedHeader(CorsConfiguration.ALL);
    config.addAllowedMethod(CorsConfiguration.ALL);
    source.registerCorsConfiguration("/**", config);
    return source;
}
 并且 在JavashopRequestInterceptor 类中 加入 javashop 跨域的支持

 

 

/**
 * 验证referer
 *
 * @param request
 * @param response
 * @return
 */
private boolean checkReferer(HttpServletRequest request,
                             HttpServletResponse response) {
    if (!checked) {
        return true;
    }
    String referer = request.getHeader("referer");
    String host = request.getServerName();
    String uri = request.getRequestURI();

    logger.debug("referer=" + referer);
    logger.debug("uri=" + request.getRequestURI());

    boolean flag = uri.startsWith("/client")
            || "/load-customwords".equals(uri)
            || "/swagger-ui.html".equals(uri)
            || uri.startsWith("/order/pay/weixin")
            || uri.startsWith("/payment/callback")
            || uri.startsWith("/payment/return")
            || uri.contains("/callback")
            || uri.startsWith("/passport/connect");
    if (referer == null && flag) {
        // 状态置为404
        return true;
    } else if (referer == null) {
        response.setStatus(HttpServletResponse.SC_NOT_FOUND);
        logger.debug("本次请求的referer为空");
        return false;
    }

    java.net.URL url = null;
    try {
        url = new java.net.URL(referer);
    } catch (MalformedURLException e) {
        // URL解析异常,也置为404
        response.setStatus(HttpServletResponse.SC_NOT_FOUND);
        return false;
    }
    // 首先判断请求域名和referer域名是否相同
    if (!host.equals(url.getHost())) {
        // 如果不等,判断是否在白名单中
        if (javashopConfig.getReferer() != null) {
            for (String s : javashopConfig.getReferer()) {
                if (matcher.match(s, url.getHost())) {
                    return true;
                }
            }
        }
        logger.debug("当前referer没有加入到配置中:" + url.getHost());
        return false;
    }
    return true;
}
 在javshop电商系统中,我们如何防止夸站点脚本攻击的问题呢?

 

 

/**
 *
 * 加载自定义的 拦截器
 * @author Chopper
 * @version v1.0
 */
@Configuration
public class WebInterceptorConfigurer implements WebMvcConfigurer {
/**
 * 自定义 ObjectMapper ,用于xss攻击过滤
    * @param builder
 * @return
 */
@Bean
@Primary
public ObjectMapper xssObjectMapper(Jackson2ObjectMapperBuilder builder) {
   //解析器
   ObjectMapper objectMapper = builder.createXmlMapper(false).build();
   //注册xss解析器
   SimpleModule xssModule = new SimpleModule("XssStringJsonSerializer");
   xssModule.addSerializer(new XssStringJsonSerializer());
   objectMapper.registerModule(xssModule);
   //返回
   return objectMapper;
}
}
 方法类

 

 

public  String clean(String value) {
    //此处定义的标签是Whitelist.basicWithImages()中可以放过的标签
    List<String> tags = Arrays.asList("a", "b", "blockquote", "br", ... "source");
    Whitelist whiteList = Whitelist.basicWithImages();

    for(String tag : tags){
        whiteList.addAttributes(tag,"style","class","width","align","src", "controls", "preload", "height", "data-setup", "type");
    }

    value = Jsoup.clean(value, whiteList);

    return value.replace("&","&");
}
 在javshop电商中,我们如何防止非同源frame的问题呢?

 

在nginx 中的server如下配置

add_header X-Frame-Options SAMEORIGIN;

在javshop电商中,我们如何设置 脚本执行策略的呢?

nginx 添加

add_header Content-Security-Policy "script-src 'self' api.javamall.com.cn 'unsafe-eval' 'unsafe-inline' ... *.aliyun.com  *.alibaba.com *.aliapp.org";

                                                                   易族智汇(javashop)原创文章

 

分享到:
评论

相关推荐

    java社群电商系统.rar

    系统安全方面,Java电商系统应实现用户身份验证(OAuth2.0)、授权机制(RBAC)、数据加密、防止SQL注入等,以保障用户信息和交易安全。性能优化则包括负载均衡、缓存策略(Redis或Memcached)、数据库优化、CDN加速...

    java电商讲师源代码

    通过这个Java电商讲师的源代码,学习者可以全方位地掌握电商系统的开发流程,从后端服务到前端展示,从数据库设计到安全策略。同时,通过实际操作和调试,能够提升问题解决能力和代码调试技巧。这个项目对于巩固Java...

    电商系统设计报告

    总结来说,电商系统设计涉及到系统架构、基础设施、平台支持、应用系统和网页设计等多个环节,每一个环节都需要细致规划,以确保电商系统的高效、安全和用户友好。同时,随着技术的不断发展,设计时还需考虑到未来...

    java电商源代码.

    Java电商源码是用于构建电子商务平台的软件代码,它涵盖了从用户界面、商品管理、订单处理、支付系统到库存控制等多个关键模块。在企业级开发中,Java因其强大的稳定性和可扩展性而成为首选语言。本篇文章将深入探讨...

    一款完善且经过线上验证的Java电商系统源代码.zip

    下面我们将深入探讨这个Java电商系统的相关知识点。 首先,Java作为后端开发的主要语言,以其跨平台、稳定性和丰富的库支持而备受青睐。在这个电商系统中,Java可能是通过Spring Boot框架来构建的,Spring Boot简化...

    电商系统文档资料

    在本压缩包“电商系统文档资料”中,包含的是针对软件工程课程设计实验的一系列文档,主要关注电子商务(电商)领域的应用。这个资料集旨在帮助学生或开发者理解如何设计、开发和实施一个功能完备的电商系统。以下是...

    java面试时常问的电商问题

    ### Java面试中电商领域的常见问题解析 #### 一、多线程的应用场景及安全性 ...以上总结了Java面试中关于电商领域的一些常见问题及其解答思路,旨在帮助求职者更好地准备面试,理解电商系统的关键技术和业务逻辑。

    Java电商系统 商城前端使用uni-app开发, 可打包部署到微信小程序, APP, H5,系统后台则

    本项目是一个基于Java技术...总结来说,这个Java电商系统充分利用了uni-app的跨平台优势和Java的稳定特性,实现了前端的多样化部署和后端的高效服务。通过合理的架构设计和运维策略,保证了系统的健壮性和用户体验。

    Java微服务电商系统源码.zip

    Java微服务电商系统是一种基于Java技术栈构建的分布式应用程序,旨在提供高效、可扩展和可靠的电子商务解决方案。在"Java微服务电商系统源码.zip"这个压缩包中,包含了一个名为"beastmail-master"的子项目,这可能是...

    电商前后台应用

    【电商前后台应用】是一个基于Java技术开发的电商平台示例项目,主要展示了电子商务系统的后台管理和前端展示功能。这个平台能够支持商品的发布、浏览以及购买流程,但并未集成真实的支付功能,用户需自行接入第三方...

    用Java vue实现的电商后台管理 .zip

    这是一个基于Java和Vue技术栈实现的电商后台管理系统项目。在这个项目中,开发者使用了现代Web开发的前后端分离模式,前端部分主要由Vue.js框架构建,而后端则使用了Java作为服务器端语言,可能结合了Spring Boot或...

    Java社区团购电商系统.zip

    总结来说,Java社区团购电商系统是一个综合运用了Java后端技术、uni-app前端框架、数据库管理、支付接口、物流集成以及安全策略的复杂项目。它的实现需要开发者具备全面的IT知识,同时也展示了Java在电子商务领域的...

    Java课设大作业电商

    【Java课设大作业电商】是一项面向大学生的Java编程实践项目,主要涵盖了电子商务平台的一些核心功能,如用户登录系统和图书管理系统。这个项目对于学习Java编程的学生来说,是一次宝贵的实践经验,有助于提升他们的...

    一套完整的社群电商系统,后端Api、后台管理系统、前台h5系统、小程序和App.rar

    总结起来,这个社群电商系统涵盖了从后端开发到前端展示的全过程,涉及的技术包括Java、Spring、MyBatis、Vue.js、React.js、微信小程序、Flutter、React Native等,同时还需要对电商运营流程有深入理解,如订单处理...

    java电商oracle

    在"java电商oracle"这个主题下,开发者需要深入了解Java编程、Oracle数据库管理以及它们之间的整合,以构建高效、稳定且安全的电商系统。持续学习和实践这两个技术,是提升电商平台竞争力的关键。

    分布式微服务电商系统搭建

    它内置了Tomcat服务器,集成了大量常用的Java EE库,如数据访问/集成、安全、消息等,使得开发者可以快速地创建独立的、生产级别的基于Spring的应用。在我们的电商系统中,SpringBoot用于构建各个微服务,通过它的...

    一个Java电商网站源码,主要是销售名牌酒.zip

    这个Java电商网站源码主要关注的是在线销售名牌酒的业务流程和系统实现,涉及了Java编程、软件开发、以及Web应用程序设计等多个领域的知识点。以下是基于这些信息详细展开的相关技术要点: 1. **Java编程**:Java是...

    Java 电子商务 购物 网站 源码

    总的来说,【Java 电子商务购物网站源码】是一个全面展示Java J2EE开发能力的实例,涵盖了电子商务系统的关键组成部分,对于学习和理解Java Web开发,尤其是电商系统设计具有很高的参考价值。无论是初学者还是经验...

    电商模拟系统

    电商模拟系统是一个基于Java Web技术的综合性应用,旨在模拟真实的电子商务环境,提供用户注册、商品浏览、购物车管理、订单处理、支付等功能。这一系统的开发涵盖了多种IT技术,包括前端界面设计、后端服务处理、...

    KgMall一款电商系统

    首先,我们要理解Java在电商系统中的应用价值。Java以其跨平台性、稳定性和强大的并发处理能力,成为了构建大型电商系统的基础。KgMall利用Java的这些特性,能够支持高并发访问,确保在大流量情况下系统的稳定运行。...

Global site tag (gtag.js) - Google Analytics