互联网安全架构,java教程视

如何防御?

防御思路:

1,写一个过滤器判断http请求头Referer域中的记录来源的值,如果和当前访问的域名不一致的情况下,说明该图片可能被其他服务器盗用。

2,通过动静分离或者前后端分离。通过nginx配置。

@WebFilter(filterName = “imgFilter”, urlPatterns = “/imgs/*”)

public class ImgFilter implements Filter {

@Value("${domain.name}")

private String domainName;

public void init(FilterConfig filterConfig) throws ServletException {

}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

throws IOException, ServletException {

HttpServletRequest req = (HttpServletRequest) request;

String referer = req.getHeader(“Referer”);

if (StringUtils.isEmpty(referer)) {

request.getRequestDispatcher("/imgs/error.png").forward(request, response);

return;

}

String domain = getDomain(referer);

if (!domain.equals(domainName)) {

request.getRequestDispatcher("/imgs/error.png").forward(request, response);

return;

}

chain.doFilter(request, response);

}

/**

  • 获取url对应的域名

  • @param url

  • @return

*/

public String getDomain(String url) {

String result = “”;

int j = 0, startIndex = 0, endIndex = 0;

for (int i = 0; i < url.length(); i++) {

if (url.charAt(i) == ‘/’) {

j++;

if (j == 2)

startIndex = i;

else if (j == 3)

endIndex = i;

}

}

result = url.substring(startIndex + 1, endIndex);

return result;

}

public void destroy() {

}

}

这里贴的只是示列代码具体优化还得你自己去优化。

四,什么是csrf模拟请求?


(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用也就是人们所知道的钓鱼网站。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

也就是通俗一点来说就是,大量请求你的接口,通过抓包工具请求分析,伪造token访问你的接口,攻击服务器降低服务器数据库性能。

如何解决防御?

1,MVCC方案

多版本并发控制,该策略主要使用 upda

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

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

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

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

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

2.去重表

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

3,悲观锁

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

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

把token放在redis 里面通过限流方式,每个token只能使用一次,网络延迟或者重试机制解决这个问题。

public class TokenUtils {

private static Map<String, Object> tokenMap = new HashMap<String, Object>();

// 获取token

public static String getToken() {

// 1.生成令牌

String token = “token-” + System.currentTimeMillis();

// 2.存入tokenMap

tokenMap.put(token, token);

return token;

}

// 验证token,并且删除对应的token

public static Boolean exisToken(String token) {

// 1.从集合中获取token

Object result = tokenMap.get(token);

if (result == null) {

return false;

}

// 2.删除对应的token

tokenMap.remove(token);

return true;

}

}

五,文件上传漏洞


什么是文件上传漏洞?

上传漏洞这个顾名思义,就是攻击者通过上传木马文件,直接得到WEBSHELL,危害等级超级高,现在的入侵中上传漏洞也是常见的漏洞。 导致该漏洞的原因在于代码作者没有对访客提交的数据进行检验或者过滤不严,可以直接提交修改过的数据绕过扩展名的检验。

如何解决防御?

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

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

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

4)通过文件流解析判断文件类型。

这里给一个图片的判断方式,其他的自行百度。

protected void doPost(HttpServletRequest request, HttpServletResponse response) {

String root = request.getServletContext().getRealPath("/upload");

DiskFileItemFactory factory = new DiskFileItemFactory();

ServletFileUpload upload = new ServletFileUpload(factory);

try {

List 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();

// 是图片格式

it.write(new File(root + “/” + 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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值