【Distributed】互联网安全架构 (3)

脚本文件,创建一个a.jsp,将此脚本上传文件到服务器,然后在运行此脚本文件,就会将服务器中的图片删除掉

<%@page import="java.io.File"%> <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <% String root ="Hao/Desktop/Img"; File file = new File(root); file.delete(); %> 修复方案代码演示

1)对文件格式限制,只允许某些格式上传

2)对文件格式进行校验,前端跟服务器都要进行校验(前端校验扩展名,服务器校验扩展名、Content_Type等)

3)将上传目录防止到项目工程目录之外,当做静态资源文件路径,并且对文件的权限进行设定,禁止文件下的执行权限。

// 判断文件流是否为图片格式 /** * 文件上传 */ protected void doPost(HttpServletRequest request, HttpServletResponse response) { String root = request.getServletContext().getRealPath("/upload"); DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); try { List<FileItem> list = upload.parseRequest(request); for (FileItem it : list) { // 如果是file文件类型 if (!it.isFormField()) { FileType fileType = getFileType(it.getInputStream()); if (fileType == null) { // 非图片格式 response.getWriter().write("fail"); return; } String imgValue = fileType.getValue(); System.out.println("imgValue:" + imgValue); // 是图片格式 it.write(new File(root + "http://www.likecs.com/" + it.getName())); response.getWriter().write("success"); } } } catch (Exception e) { try { response.getWriter().write("exception"); } catch (IOException e1) { e1.printStackTrace(); } e.printStackTrace(); } } // 判断文件是图片格式 public static FileType getFileType(InputStream is) throws IOException { byte[] src = new byte[28]; is.read(src, 0, 28); StringBuilder stringBuilder = new StringBuilder(""); if (src == null || src.length <= 0) { return null; } for (int i = 0; i < src.length; i++) { int v = src[i] & 0xFF; String hv = Integer.toHexString(v).toUpperCase(); if (hv.length() < 2) { stringBuilder.append(0); } stringBuilder.append(hv); } FileType[] fileTypes = FileType.values(); for (FileType fileType : fileTypes) { if (stringBuilder.toString().startsWith(fileType.getValue())) { return fileType; } } return null; } 1.7 其他攻击和漏洞

直接异常信息,会给攻击者以提示。 可以使用mvc中的工具,把错误码异常等进行封装HTML注释, 会暴露功能,方便攻击。 上线时去除注释文件上传, 如果本身功能就是上传文件去执行,那么就有可能执行非常危险的命令。 解决方式是,设置文件白名单,限制文件类型,另外还可以重新命名文件,改名为不可执行的路径遍历, 使用相对路径来遍历未开放的目录。 方式是将JS,CSS部署在独立的服务器,使用独立域名。 其他文件不使用静态URL访问,动态参数不包含文件路径信息。

网站安全漏洞扫描

二、互联网API接口幂等设计 2.1 API接口幂等性设计方案 MVCC方案

多版本并发控制,该策略主要使用 update with condition(更新带条件来防止)来保证多次外部请求调用对系统的影响是一致的。在系统设计的过程中,合理的使用乐观锁,通过 version 或者 updateTime(timestamp)等其他条件,来做乐观锁的判断条件,这样保证更新操作即使在并发的情况下,也不会有太大的问题。

例如 select * from tablename where condition=#condition# // 取出要跟新的对象,带有版本 versoin

update tableName set name=#name#,version=version+1 where version=#version#

在更新的过程中利用 version 来防止,其他操作对对象的并发更新,导致更新丢失。为了避免失败,通常需要一定的重试机制。

去重表

在插入数据的时候,插入去重表,利用数据库的唯一索引特性,保证唯一的逻辑。

悲观锁

select for update,整个执行过程中锁定该订单对应的记录。注意:这种在 DB 读大于写的情况下尽量少用。

Token机制,防止页面重复提交

业务要求:页面的数据只能被点击提交一次

发生原因:由于重复点击或者网络重发,或者 nginx 重发等情况会导致数据被重复提交

解决办法:

集群环境:采用 token 加 redis(redis 单线程的,处理需要排队)

单JVM 环境:采用 token 加 redis 或 token 加 jvm 内存

处理流程:

数据提交前要向服务的申请 token,token 放到 redis 或 jvm 内存,token 有效时间,提交后后台校验 token,同时删除 token,生成新的 token 返回

token 特点:要申请,一次有效性,可以限流

基于Token方式防止API接口幂等(项目演示)

客户端每次在调用接口的时候,需要在请求头中,传递令牌参数,每次令牌只能用一次。一旦使用之后,就会被删除,这样可以有效防止重复提交。

步骤:

1.生成令牌接口

2.接口中获取令牌验证

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zysgfs.html