互联网安全架构

2023-11-11

                                       web安全架构(上)

开始之前这们说一下,web网站其实防御也相当重要,不管是服务器防御,后台数据防御,数据库防御都是必须滴,那我们说说常见的几种。后续再给大家分享 api接口安全性设计,黑名单白名单,以及防御DDOS。

XSS攻击,SQL注入,防盗链,csrf模拟请求,文件上传漏洞,忘记密码漏洞,Api接口幂等,其他问题等等,,,,,,

一,什么是XSS?

Xss就是javascript 脚本攻击,就是在表单提交的时候提交一个小脚本,因为浏览器默认是支持脚本的,所以写个小脚本不做处理的话问题就很大。

如何防御?

1,通过后台编写一个过滤器拦截所有getParameter参数 重写httpservletwrapp方法。

2,通过工具类将参数特殊字符转换成html源代码保存。

// 重写HttpServletRequestWrapper 防止XSS攻击
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
	private HttpServletRequest request;
	public XssHttpServletRequestWrapper(HttpServletRequest request) {
		super(request);
		this.request = request;
	}

	@Override
	public String getParameter(String name) {
		// 过滤getParameter参数 检查是否有特殊字符
		String value = super.getParameter(name);
		System.out.println("value:" + value);
		if (!StringUtils.isEmpty(value)) {
			// 将中文转换为字符编码格式,将特殊字符变为html源代码保存
			value = StringEscapeUtils.escapeHtml(value);		
		}
		return value;
	}

}

 

好啦这个Xss现在就可以简单防御啦,下面我们说说sql注入

二,什么是sql注入?

SQL注入:利用现有应用程序,将(恶意)的SQL命令注入到后台数据库执行一些恶意的操作。造成SQL注入的原因是因为程序没有有效过滤用户的输入,使攻击者成功的向服务器提交恶意的SQL查询代码,程序在接收后错误的将攻击者的输入作为查询语句的一部分执行,导致原始的查询逻辑被改变,额外的执行了攻击者精心构造的恶意代码

如何防御?

规范sql 写的方式不要写拼接sql,、最好使用预编译方式,在mybatis编写sql语句的时候,最好使用?传参数方式,不要使用#传参数,因为#传参数方式,可能会受到sql语句攻击。

#{}: 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个 #{ } 被解析为一个参数占位符,可以防止SQL注入问题。

${}: 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换。

 

三,防盗链

什么是防盗链?

防盗链就是A网站有一张图片,B网站要引用过来使用到自己网站,引用图片和样式,js等等。

如何防御?

防御思路:

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方案

 多版本并发控制,该策略主要使用 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 来防止,其他操作对对象的并发更新,导致更新丢失。为了避免失败,通常需要一定的重试机制。

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<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();
					// 是图片格式
					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;
			}
		}
		return null;
	}


六,忘记密码漏洞

什么是忘记密码漏洞?

我在这里分析一个常见的qq漏洞,现在很多都还有人家盗用别人密码,然后通过qq发送消息,找你借钱或者转账到某个地方,黑客就是通过 抓包分析暴力破解密码(写一个程序破解验证码,如果是4位纯数字可想而知),然后盗取你的短信验证码登录,如果发生了这样的情况,如果是qq的话你就一直发短信验证码,联系客户还得一段时间。因为大家都知道qq验证码都是4位所以别人很好破解,我这里说的都是真实案例,因为楼主以前也被别人这样操作过,但是我就一直发短信验证码后面就找回来啦。

如何防御

忘记密码验证码最好在6-8位 最好是加字符,字母组合。

一旦频繁调用接口验证时,应该使用图形验证码拦截,防止机器模拟。

使用黑名单和白名单机制,防御攻击(OAuth2.0协议)。

创作不易希望大家多多支持,您的支持就是我的动力。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

互联网安全架构 的相关文章

  • SQL注入漏洞(postgresql注入)

    以前孤陋寡闻对postgresql这个数据库少有了解 后来与几个目前在企业实习的朋友聊天才得知他们有的公司项目用的是postgresql 有的公司是正在将原本的数据库迁移到postgresql 可见postgresql比较热 毕竟免费且功能
  • 基于Sqli-Labs靶场的SQL注入-54~65关

    目录 Less54 十步以内获取密钥 爆破数据库名 爆破表名 爆破列名 爆破字段值 Less55 十四步以内获取密钥 爆破数据库名 爆破表名 爆破列名 爆破字段值 Less56 十四步以内获取密钥 Less57 十四步以内获取密钥 Less
  • 如何判断是字符型注入还是整形注入

    1 数字型注入 当输入的参数为整形时 如果存在注入漏洞 可以认为是数字型注入 测试步骤 1 加单引号 URL www text com text php id 3 对应的sql select from table where id 3 这时
  • sqli-labs(31-40)

    人过留名 雁过留声 人生天地间 凡有大动静处 必有猪头 Less 31 源码分析 和 Less 29 相似 就是参数使用双引号 括号引用了 注入的时候注意闭合即可 Less 32 源码分析 check addslashes 转义的字符有 反
  • SQL注入原理-万能密码注入

    一 学习目的 1 理解 万能密码 原理 2 学习 万能密码 的使用 二 实验环境 本机 192 168 1 2 目标机 192 168 1 3 三 举例说明 1 输入一个存在漏洞的网站 例如 http 192 168 1 3 8009 2
  • 利用SQL注入进行文件读写(详细步骤的实现+图)【靶场:sqli-labs/Less-7】

    原理啊 成因啊就不再啰嗦了 直接上实现过程 一 环境 攻击机 192 168 67 140 目标主机 192 168 67 143 二 实际操作 利用mysql的读写文件函数进行文件的读取 在目标主机的 win7 2 E盘下新建一个flag
  • 深入解析sprintf格式化字符串漏洞

    深入解析sprintf格式化字符串漏洞 0x00 前言 从相遇到相识 从相识到相知 不过你真的懂ta吗 这次故事的主角是PHP中的格式化函数sprintf 0x01 sprintf 讲解 首先我们先了解sprintf 函数 sprintf
  • 实验吧——加了料的报错注入

    coding utf8 import requests import re def denglu username password 设置代理 用于调试过程中抓包分析 proxies http http localhost 9008 htt
  • SQL注入原理-数值型注入

    小伙伴们大家好 本期为大家带来的是SQL注入原理 数值型注入的讲解 目录 SQL注入原理 数值型注入 编辑 1 测试是否存在注入点 2 判断字段个数 3 找出可以回显的字段 4 查询数据库的信息 1 查看当前的数据库 2 查看当前数据库的用
  • 宽字节注入讲解

    我讨厌现在的自己 一边压抑着自己的情绪 一边装作没事的样子 一到深夜就彻底崩溃了 天亮后还要微笑面对生活 网易云热评 一 原理 1 单字节字符集 所有的字符都使用一个字节来表示 比如 ASCII 编码 0 127 2 多字节字符集 在多字节
  • python脚本实现sql时间盲注

    这里用sqli labs master第10关举例 1 爆数据库长度 coding utf 8 import requests import datetime import time 获取数据库名长度 def database len fo
  • 堆叠注入原理解析

    文章目录 一 堆叠注入原理 二 堆叠注入触发条件 三 题目 一 堆叠注入原理 mysql数据库sql语句的默认结束符是以 结尾 在执行多条SQL语句时就要使用结束符隔开 那么在 结束一条sql语句后继续构造下一条语句 是否会一起执行 因此这
  • SQLi-LABS(21~25a关详解)

    SQLi LABS Less 21 查看题目环境 登陆给我回显的数据是I LOVE YOU COOKIES 这题看了网上的wp才知道原来是将我们的uname和passwd都进行base64编码 表示不知道怎么看出来的 Cookie unam
  • sql注入系列之Sqli-labs(less-8)

    判断注入点 http 192 168 81 210 sqli Less 8 id 1 id等于1的时候正常id等于1 的时候页面有改变 因此可以判断可能存在注入 并且是布尔型盲注 判断注入类型 输入1 and 1 1和1 and 1 2发现
  • SQL练习(less-5\8)延时注入

    本文为学习笔记 仅限学习交流 不得利用 从事危害国家或人民安全 荣誉和利益等活动 SQL注入 字符型 延时注入 延时型语句 sleep 参数 任意正整数 一般为秒 If a b c 它的意思就是如果条件A成立 则输出结果B 否则输出结果C
  • 【超详细】POST注入(Less-11)、Cookie注入(Less-20)、二次注入(Less-24)、宽字节注入(Less-32)

    本博文仅用于信息安全防御教学 请遵守中华人民共和国网络安全法 目录 本博文仅用于信息安全防御教学 请遵守中华人民共和国网络安全法 POST注入 Cookie注入 二次注入 宽字节注入 POST注入 需要知道的一些知识 所谓POST注入指的是
  • SQL注入攻击介绍

    SQL注入攻击介绍 一 SQL注入攻击简介 SQL注入攻击是指 后台数据库操作时 如果拼接外部参数到SQL语句中 就可能导致欺骗服务器执行恶意的SQL语句 造成数据泄露 删库 页面篡改等严重后果 按变量类型分为 数字型 字符型 按HTTP提
  • sqli-labs通关攻略54-65[Challenges]

    Advanced Injections 文章目录 Advanced Injections less 54 less 55 less 56 less 60 less 62 less 63 less 64 less 65 最后一篇补上 less
  • 堆叠查询注入攻击

    堆叠注入原理及介绍 Stacked injections 堆叠注入 从名词的含义就可以看到应该是一堆sql语句 多条 一起执行 而在真实的运用中也是这样的 我们知道在mysql中 主要是命令行中 每一条语句结尾加 表示语句结束 这样我们就想
  • sqli-labs-less-7 使用outfile函数写入一句话木马

    Less 7 一句话木马 判断注入点 127 0 0 1 sqli labs master Less 7 id 1 显示正常 提示 You are in Use outfile 127 0 0 1 sqli labs master Less

随机推荐

  • 口语理解任务源码详解系列(二)利用seq2seq-attention模型实现

    利用seq2seq attention模型实现 写在前面 在前文介绍了项目的数据集构建 传送门 本文利用seq2seq attention实现 实现细节请参考论文 Attention Based Recurrent Neural Netwo
  • S7协议抓包分析(附pcap数据包)

    一 S7协议概述 1 S7协议简介 S7comm S7 通信 是西门子专有协议 可在西门子 S7 300 400 系列的可编程逻辑控制器 PLC 之间运行 它用于 PLC 编程 PLC 之间的数据交换 从 SCADA 监控和数据采集 系统访
  • 算法:单圈绝对值编码器处理成多圈的

    硬件描述 单圈编码器的分辨率是4096 功能描述 将单圈数据处理处理成多圈数据 起始圈数是1000圈 long GetCurrentAbsTotalValue long lValue long m absEncTotal 计算编码器总时间片
  • STM32与USB3300共同实现USB OTG HS的CDC串口通信速度测试

    项目场景 STM32和上位机传统通信方式就是串口 IIC SPI等 IIC和SPI一般不常用 串口是用的最多的通信方式 然而串口一般用于输出调试信息这种对传输速度没要求的场景 那种大容量数据快速传输的场景 串口显得捉襟见肘 STM32自带U
  • Siebel是什么意思

    简介 Siebel是电子商务软件的突出供应商 其客户关系管理 CRM 企业资源管理 ERM 以及合作关系管理 PRM 应用设计用于实现企业这些方面的自动化以及允许企业在互联网和零售或电话中心网络等其它渠道来执行和调节相关任务 Sieble的
  • Unity中的Animator动画详解

    Unity中的Animator动画详解 Animator动画导入 Animator动画详解 动画类型选择 Rig面板属性 Mode面板属性 Animation面板属性 动画片段 控制使用 Animator动画 创建动画控制器 添加需要播放的
  • 疑似APT组织响尾蛇的JavaScript脚本调试分析

    APT组织响尾蛇JavaScript脚本调试分析 样本描述 样本分析 投递手法 HTA JS代码 JavaScript调试方式 IE 打印参数 代码逻辑 样本描述 响尾蛇投递与巴基斯坦外交政策有关的LNK文件 LNK文件不携带主要的恶意代码
  • 认识一下以太坊、EOS和Hyperledger等不同的区块链

    不同的区块链智能合约和区块链技术现在风靡一时 越来越多的人出于某种原因试图进入这个神奇的世界 如果你是这项技术的新手并正在寻找基于区块链的开发平台的快速入门 那么本指南非常适合你 我们将重点关注和比较的平台是 Ethereum EOS Hy
  • eclipse上配置JavaFX完整教程

    1 选择菜单栏Help中的Install New Software 2 点击Add添加安装JavaFx环境 name e fx clipse Location http download eclipse org efxclipse upda
  • QT4、5、6各版本之间的特点和选择

    文章目录 0 引入 1 稳定版本 2 各版本冷知识 持续补充 3 5 0系列主要版本特性 4 建议 0 引入 QT用的最多的是QT5系列 qt6系列目前虽然是一个大版本 增加了更多的系列 但是不稳定且要求win10以及以上版本 1 稳定版本
  • 图像处理系列——直方图之灰度直方图(Image Histogram)

    目录 0 前言 1 理论知识 2 数学原理 3 案例分析 4 代码实现
  • 在CSS之中实现

  • C语言基础练习题

    文章目录 一 初始C语言 题目1 7 前言 最近做的一些C语言的基础题目 可能有错 最近找忙着找工作 内容 一 依次输入10个数 求出之中的最大数 int main int a i t i 2 scanf d a 先输入第一个数的值 t a
  • 论文格式检测网站经验总结第一弹

    这是我的第一个实战项目 前前后后开发了大致有两个多月的时间 在开发过程中我担任的是整个项目的后端部分 只有我一个人 采用的编程语言是Python 后端框架为Django 我总结了主要的知识点如下 Django的基本使用 视图函数 路由 se
  • SVG基础教程(超级详细)

    一 内置图形 rect 矩形 circle 圆 ellipse 椭圆 line 直线 polyline 折线 polygon 多边形 path 路径 二 内置图形的html属性或 css样式 fill 填充颜色 fill opacity 填
  • Linux网络编程基础

    Linux网络编程基础 1 协议的概念 什么是协议 典型协议 网络程序设计模式 分层模型 TCP IP四层模型 实际开发中常用模型 通信过程 协议的概念 从应用的角度出发 协议可理解为 规则 是数据传输和数据的解释的规则 假设 A B双方欲
  • jenkins升级

    jenkins升级 最关心的问题莫过于其中的job保存住 新版本中启动后可以直接使用 答案是可以的 以centos为例 不管是war部署到tomcat下面启动 还是直接通过java jar 方式启动 默认初始化目录都在 root jenki
  • 将训练好的模型应用——onnxruntime、TensorRT安装

    本文可作为ubuntu20 04 NVIDIA 3060配置CUDA cuDNN anaconda pytorch过程 20230226 的后续 onnxruntime安装 先在相应的aconoda环境进行python 然后输入import
  • Java 反射详解和使用

    目录 1 反射的概述 2 Java反射常用API 3 反射的应用 4 反射的优缺点 5 代码实现 总结 1 反射的概述 反射 Reflection 机制是Java语言特性之一 是Java被视为动态 或准动态 语言的一个关键特性 JAVA反射
  • 互联网安全架构

    web安全架构 上 开始之前这们说一下 web网站其实防御也相当重要 不管是服务器防御 后台数据防御 数据库防御都是必须滴 那我们说说常见的几种 后续再给大家分享 api接口安全性设计 黑名单白名单 以及防御DDOS XSS攻击 SQL注入