架构师的36项修炼-08系统的安全架构设计

本课时讲解系统的安全架构。
在这里插入图片描述
本节课主要讲 Web 的攻击与防护、信息的加解密与反垃圾。其中 Web 攻击方式包括 XSS 跨站点脚本攻击、SQL 注入攻击和 CSRF 跨站点请求伪造攻击;防护手段主要有消毒过滤、SQL 参数绑定、验证码和防火墙;加密手段,主要有单向散列加密、对称加密、非对称加密;信息过滤与反垃圾主要讨论分类算法和布隆过滤器。

Web 攻击与防护

XSS 攻击

先看 XSS 跨站点脚本攻击。XSS 攻击,顾名思义,就是通过构造一个非法的浏览器脚本,让用户跨站点去执行,从而达到攻击的目的。

& URL 钓鱼攻击

如下图示例:用户登录了被攻击的服务器,比如微博的服务器,然后他收到了攻击者发送给他的一个含有恶意脚本的 URL,这个 URL 是指向微博服务器的。用户点击恶意 URL 以后,就会把 URL 提交给微博的服务器,同时这段 URL 里面还包含了一段可执行的恶意脚本,这个脚本也会被客户端去执行。在这个恶意脚本里面,会强制用户关注某个特定的微博账号,并发送一条含有恶意脚本的微博,当其他用户浏览点击微博的时候,会再一次执行同样的动作,以此来达到攻击不断扩散的目的。
在这里插入图片描述
& 直接攻击

除了通过上述 URL 钓鱼的方式进行攻击,还有一种攻击方式是,恶意的攻击者直接攻击被攻击的服务器。

如下图所示,攻击者发送一个含有恶意脚本的请求给被攻击的服务器,比如通过发布微博的方式向微博的服务器发送恶意请求,被攻击的服务器将恶意脚本存储到本地的数据库中,其他正常用户通过被攻击的服务器浏览信息的时候,服务器会读取数据库中含有恶意脚本的数据,并将其展现给正常的用户,在正常用户的浏览器上执行,从而达到攻击的目的。
在这里插入图片描述
XSS 攻击防御

XSS 攻击防御的主要手段有以下几种。

& 消毒

检查用户提交的请求中是否含有可执行的脚本,因为大部分的脚本都需要用尖括号等脚本语法,因此大部分的攻击也都包含尖括号这样的脚本语法,所以可以通过 HTML 转义的方式,比如把“>”转义为“&gt”这样的转义 HTML 字符,HTML 显示的时候还是正常的”>“,但是这样的脚本无法在浏览器上执行,也就无法达到攻击的目的。

& HttpOnly

此外,XSS 攻击的目的是想利用客户端浏览器的权限去执行一些特定的动作,而这种权限通常是需要依赖 Cookie 的,所以可以通过限制脚本访问 Cookie,从而达到防止攻击的目的。也就是在 Cookie 上设置 HttpOnly 的属性,使恶意脚本无法获取 Cookie,避免被攻击脚本攻击。

SQL 注入攻击

SQL 注入是另外一种常见的攻击手段。恶意的攻击者在提交的请求参数里面,包含有恶意的 SQL 脚本。

如下图示例,在需要输入的参数 username 里面,注入了另外一条 SQL 语句“drop table users”,这是一条删除 users 表的命令。如果程序根据输入参数进行 SQL 构造,那么构造出来的就是这样两条 SQL:一条是 Select 根据用户名进行查询的 SQL 语句;另一条 SQL 就是删除 users 表。当这样的两条 SQL 被提交到数据库以后,数据库 user 表就会被删除,从而导致系统瘫痪。
在这里插入图片描述
SQL 攻击防御

& 消毒

解决 SQL 注入的手段,一种手段是消毒。通过拦截请求中的数据,对请求数据进行正则表达式匹配,如果请求数据里面包含有某些 SQL 语句,比如“drop table”,那么就对这些语句进行转义和消毒,插入一些特定的不可见字符或者进行编码转换,使其无法在数据库上执行,从而达到防御攻击的目的。

& 参数绑定

但是在实践中最常用、最有效、最高效的是第二种,通过 SQL 预编译手段,即将 SQL 命令和输入参数绑定,防止将输入参数中的数据当作 SQL 执行。也就是说访问数据库的 SQL,通过预编译的方式已经提交到了数据库,数据库收到请求参数以后,只会按照特定的 SQL 参数,按照已经编译好的执行命令去执行,所有提交的数据都会被当作参数,而不会当作 SQL 语句去执行。目前很多常用的 Web 数据库访问框架,比如 MyBatis、Hibernate 等 ORM 框架,都支持 SQL 预编译和参数绑定,能够避免 SQL 注入攻击。

CSRF 攻击

还有一种常见的攻击是跨站点请求伪造 CSRF,跨站请求伪造的攻击方式如下图所示。
在这里插入图片描述
用户先登录受信任的服务器,然后又访问了被攻击的服务器。被攻击了的服务器返回的响应里面包含着用户访问受信任的服务器的请求,用户在不知情的情况下执行了请求,从而达到了攻击者的目的。

CSRF 攻击防御

& 表单 Token

跨站请求伪造的防御手段,一种是使用表单 Token。要达到 CSRF 跨站请求伪造,用户必须要构造出来受信任站点的完整的请求参数才能够进行请求,那么如果请求参数是必须要在当前浏览器或者是应用中生成的,比如请求中包含必须要在特定场景下生成的 Token 才能够发送的请求,这样攻击者就无法构造这个 Token,也就无法进行攻击。通常这样的 Token 利用时间戳、用户设备指纹、页面内容等多方数据进行计算,服务器在收到请求后,对请求包含的 Token 进行校验,确定是否是合法的 Token,只有包含合法Token 的请求才会被执行。

& 验证码

另一种手段就是用验证码。CSRF 攻击是在用户不知情的情况下,去请求受信任的服务器,达到自己的攻击目的。对于一些比较敏感的操作,比如关于资金方面的操作,那么可以要求用户输入图片验证码或者手机验证码,才能够完成。这个时候用户就会发现自己被攻击了,避免执行被攻击的请求,从而防御 CSRF 攻击。

Web 应用防火墙

大部分的攻击都可以在请求和响应阶段进行拦截处理,所以不用每个程序自己去独立处理。在应用网关或者在请求接入的时候,可以设置一个统一的 Web 应用防火墙,对所有的请求响应进行拦截处理。

ModSecurity 就是这样一个开源的 Web 应用防火墙,如下图所示。它能够探测攻击并保护应用系统,既可以嵌入到 Web 应用服务器之内,也可以作为一个独立的应用程序启动。ModSecurity 最早是 Apache 服务器的一个模块,现在已经有了 Java、.net 多个版本,并且支持 Nginx。
在这里插入图片描述
ModSecurity 本身的架构设计也非常值得借鉴。ModSecurity 采用处理逻辑与规则集合分离的架构模式。处理逻辑负责请求和响应的拦截过滤、规则加载执行等功能。而规则集合则负责对具体的攻击的规则定义、模式识别、防御策略等功能。处理逻辑比较稳定,规则集合需要不断针对漏洞进行升级,这是一种可扩展的架构设计。

信息加解密

再看信息加解密技术。信息加解密技术主要分为三类,单向散列加密、对称加密和非对称加密。

单向散列加密

所谓的单向散列加密是指对一串明文信息进行单向散列加密以后,得到的密文信息是不可以解密的,也就是说给定一个密文,即使是加密者也无法知道它的明文是什么,加密是单向的,不支持解密。

单向散列加密的主要应用场景就是应用到用户密码加密上。我们知道将用户密码的明文直接存储到数据库中是比较危险的,如果数据库被内部员工泄露,或者是被黑客拖库以后,那么用户的密码就会被暴露出去。所以对用户密码进行解密是没有意义的,反而会造成密码不安全,事实上现在一般的应用系统都是对数据库的密码采用单向散列加密的方式进行保护的。

主要过程如下面架构时序图所示。用户在注册的时候需要输入密码,应用服务器得到用户输入的密码以后,调用单向散列加密算法,对密码进行加密,然后将加密后的密文存储到数据库中去。用户下一次登录的时候,用户在客户端依然需要输入密码,用户输入的密码发送到 Web 服务器以后,Web 服务器对输入的密码再进行一次单向散列加密,得到密文,然后和从数据库中取出来的密文进行对比,如果两个密文是相同的,那么用户的登录验证就是成功的。通过这种手段,既可以保证用户密码的安全性,也实现了对用户的身份认证。
在这里插入图片描述
因为常用单向散列算法,就这么几种,而用户常用的密码组合,也有一定的重复性,比如根据生日设置密码,根据姓名拼音设置密码等等,所以如果有足够多的密码明文和密文,建立一个明文和密文之间的映射表,虽然通过密文无法解密计算出来明文,但是知道密文以后,可以通过查表的方式去查找出来明文是什么。

所以现在常用的单向散列加密,不但使用算法进行加密,还在算法上加一些盐,其实也是类似于密钥一样性质的东西,如下图。这样不同的加盐参数加出来的密文,即使是有了明文和密文的映射表,也无法通过密文和映射表去查找得到明文了。
在这里插入图片描述
对称加密

对称加密,顾名思义,使用一个加密算法和一个密钥,对一段明文进行加密以后得到密文,然后使用相同的密钥和对应的解密算法,对密文进行解密,就可以计算得到明文,如下图所示。对称加密主要用于加密一些敏感信息,对密文进行信息传输和存储,但是在使用的时候,必须要解密得到明文信息的一些场景。
在这里插入图片描述
比如说用户的信用卡卡号,很多互联网电商网站支持用户使用信用卡进行支付,把用户的信用卡信息存储在自己的服务器,当用户支付的时候,直接用信用卡信息和银行通信,完成信用卡扣款支付。用户的信用卡卡号等信息需要在交易的时候,跟银行进行支付认证。但是如果直接把信用卡号、有效期、安全码存储在数据库中,是比较危险的,所以必须要对它进行加密。在数据库中存储密文,在使用的时候又必须要对密码进行解密,还原得到明文,才能够正常使用。所以这个时候就要使用对称加密算法,在存储的时候使用加密算法进行加密,在使用的时候使用解密算法进行解密。

非对称加密

所谓的非对称加密是指在加密的时候使用一个加密算法和一个加密密钥进行加密,得到一个密文,在解密的时候,必须要使用解密算法和解密密钥进行解密才能够还原得到明文,加密密钥和解密密钥完全不同,如下图所示。非对称加密的典型应用场景,就是我们常见的 HTTPS。HTTPS 加密就是一种非对称加密,用户在客户端进行网络通讯的时候,对数据使用加密密钥和加密算法进行加密,得到密文。到了数据中心的服务器以后,使用解密密钥和解密算法进行解密,得到明文。
在这里插入图片描述
在 HTTPS 这个场景中,由于所有的用户都要获得加密密钥,才能够对自己的明文进行加密,所以加密密钥通常也被叫作公钥,意思就是公开的密钥,谁都可以获得得到。但是解密密钥只有互联网系统后端服务器才能够拥有,只能由数据中心的服务器使用,所以也叫作私钥,也就是说谁都可以加密,但是只有自己才能解密,通过这种方式实现网络的安全传输,因为公钥本身就是公开的,所以也不需要担心密钥泄漏。同时由于公钥是对所有用户公开的,为了保证公钥本身的安全性和权威性,通常 HTTPS 的公钥和私钥使用权威的 CA 认证中心颁发的密钥证书。

使用非对称加密,还可以实现数字签名。用数字签名的时候是反过来的,自己用私钥进行加密,得到一个密文,但是其他人可以用公钥将密文解开,因为私钥只有自己才拥有,所以等同于签名。一段经过自己私钥加密后的文本,文本内容就等于是自己签名认证过的。

信息过滤与反垃圾

接下来看信息过滤与反垃圾,包括分类算法和布隆过滤器黑名单。

分类算法

分类算法,来看常用的贝叶斯分类算法,贝叶斯分类算法可以解决概率论中的一个典型问题。

如果有两个箱子,一号箱子里面放着红色球和白色球各 20 个,二号箱放有白色球 10 个,红色球 30 个。现在随机挑选一个箱子,取出来 1 个球的颜色是红色的,那么请问这只球来自于一号箱子的概率是多少?解决这类问题的方法就是使用条件概率,条件概率公式如下所示。
在这里插入图片描述

方程式左边 P(B|A) 表示的是在 A 条件发生的情况下,B 发生的概率是多少?在上图这个例子中,A 就是红色球,B 就是一号箱,P(B|A) 也就是问题中,在取出红色球的情况下,该球来自一号箱的概率是多少?计算公式是 P(A|B) 乘以 P(B) 除以 P(A),P(A|B) 是在一号箱中有红色球的概率,P(B) 是一号箱的概率,P(A) 是红色球的概率。也就是一号箱中有红色球的概率乘以一号箱的概率,再除以红色球的概率,来得到取出红色球的情况下是一号箱的概率。

实践中我们会使用贝叶斯分类算法进行垃圾邮件的识别。比如说我们统计现有的邮件,将邮件分为垃圾邮件和非垃圾邮件两类,然后再统计垃圾邮件中包含的文本特征的概率,以及非垃圾邮件中文本特征的概率。那么当我们收到一份邮件的时候,我们就可以根据这份邮件中的文本特征概率去计算它是垃圾邮件的概率。在这个例子里面,P(A) 是邮件中的文本特征,P(B) 就是垃圾邮件的概率,使用分类算法,根据文本特征计算垃圾邮件的概率。垃圾邮件过滤的整个的流程,如下图所示。
在这里插入图片描述
我们先对当前的邮件进行人工分类,分为垃圾邮件和非垃圾邮件两类,然后将这两类邮件输入分类算法进行训练,训练得到 P(A)、P(B) 以及 P(A|B) 这些概率值,然后当一份新邮件到达的时候,也就是待处理邮件到达的时候,我们将待处理邮件带入分类算法进行计算,也就是计算 P(B|A) 的值,然后根据计算出来的值,判断它是垃圾邮件还是正常邮件。

通过分类算法我们可以识别出来一份邮件是垃圾邮件还是非垃圾邮件。如果是垃圾邮件,那么发送垃圾邮件的邮箱地址通常也会被标记为黑名单地址,需要记录下来。对于一个邮箱系统而言,需要管理的黑名单是非常庞大的,如何管理这样庞大的一组黑名单邮箱的地址,最直观的解决手段就是使用哈希表。但是如果数量特别庞大,那么哈希表也会非常庞大,需要占用大量的内存空间。事实上,我们对黑名单里面这些邮件地址并不关心,我们只需要关心,一个邮件到达以后,它的发件人地址是不是在黑名单里就可以了。

布隆过滤器

更简单的办法就是使用布隆过滤器这样一种手段去记录邮箱地址黑名单。

如下图所示,布隆过滤器的算法实现是这样的。首先它开辟一块巨大的连续存储空间,比如说开辟一个 16G 比特的连续存储空间,也就是 2G 大的一个内存空间,并将这个空间所有比特位都设置为 0。然后对每个邮箱地址使用多种哈希算法,比如使用 8 种哈希算法,分别计算 8 个哈希值,并保证每个哈希值是落在这个 16G 的空间里的,也就是,每个 Hash 值对应 16G 空间里的一个地址下标。然后根据计算出来的哈希值将对应的地址空间里的比特值设为 1,这样一个邮箱地址就可以将 8 个比特位设置为 1。当检查一个邮箱地址是否在黑名单里的时候,只需要将邮箱地址重复使用这 8 个哈希算法,计算出 8 个地址下标,然后检查这 8 个地址下标里面的二进制数是否全是 1,如果全是 1,那么表示它就是在黑名单里头。使用布隆过滤器,记录同样大小的邮箱黑名单,可以比使用哈希表节约更多的内存空间。
在这里插入图片描述
使用布隆过滤器需要注意的是,该过滤器存在误杀的情况。也就是说,一个非黑名单邮箱地址对应的 8 个比特位的值,正好被其它的黑名单邮箱地址都设为 1 了。那么在检查比特位时,该邮箱地址就会被误认为黑名单邮箱,被错误拦截。

总结回顾

回顾本节课内容如下。

主要的几种攻击方式,XSS 攻击、SQL 注入攻击和 CSRF 攻击。这三种攻击方式占了 Web 攻击 90% 以上的攻击。解决方案有消毒、SQL 预编译参数绑定、验证码等常用手段,而所有这些攻击都可以通过使用统一的 Web 应用防火墙去解决。

加密的几种常用算法:单向散列加密,主要应用场景是用户密码加密、存储;还有对称加密,加密密钥和解密密钥相同,主要是对敏感信息进行加密,比如信用卡;非对称加密的主要应用场景就是 HTTPS,它的加密密钥和解密密钥是不同的。

此外在信息过滤和反垃圾中,我们学习了两个算法,一个是贝叶斯分类算法,一个是布隆过滤器算法,前者通过邮件内容去检查邮件是否为垃圾邮件,后者利用较小的内存空间记录垃圾邮件地址黑名单。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/651328.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java关键字概述——final及常量概述

前言: 打好基础,daydayup! final final概述 final关键字是最终的意思,可以修饰(类,方法,变量) final作用 修饰类:该类被称为最终类,特点为不能被继承 修饰方法&#xff…

智能GPT图书管理系统(SpringBoot2+Vue2)、接入GPT接口,支持AI智能图书馆

☀️技术栈介绍 ☃️前端主要技术栈 技术作用版本Vue提供前端交互2.6.14Vue-Router路由式编程导航3.5.1Element-UI模块组件库,绘制界面2.4.5Axios发送ajax请求给后端请求数据1.2.1core-js兼容性更强,浏览器适配3.8.3swiper轮播图插件(快速实…

【笔试常见编程题01】删除公共字符串、组队竞赛、倒置字符串、排序子序列

1. 删除公共字符串 输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。 例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.” 输入描述 每个测试输入包含2个字符串 输出描述 输出删除后的…

外包干了8个月,技术退步明显...

先说一下自己的情况,大专生,18年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

v43-47.problems

1.for循环 一般地,三步走: for(初始化;表达式判断;递增/递减) { ....... } 但是,如果说声明了全局变量,那么第一步初始化阶段可以省略但是要写分号‘ ; ’…

Java后端开发:学籍系统核心逻辑

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

uniapp组件库fullScreen 压窗屏的适用方法

目录 #平台差异说明 #基本使用 #触发压窗屏 #定义压窗屏内容 #注意事项 所谓压窗屏,是指遮罩能盖住原生导航栏和底部tabbar栏的弹窗,一般用于在APP端弹出升级应用弹框,或者其他需要增强型弹窗的场景。 警告 由于uni-app的Bug&#xff0…

DEM高程地形瓦片数据Cesium使用教程

一、简介 从开始写文章到现在,陆续发布了全球90m、30m(包括哥白尼及ALOS)、12.5m全球级瓦片数据,以及中国12.5、日本10m、新西兰8m、等国家级瓦片数据,同时也发布了台湾20m、中国34省区12.5m等地区级瓦片数据。在数据发布的文章中对数据如何…

C#,最小生成树(MST)普里姆(Prim)算法的源代码

Vojtěch Jarnk 一、Prim算法简史 Prim算法(普里姆算法),是1930年捷克数学家算法沃伊捷赫亚尔尼克(Vojtěch Jarnk)最早设计; 1957年,由美国计算机科学家罗伯特普里姆独立实现; 19…

车载激光雷达标定白板

随着科技的不断发展,自动驾驶技术逐渐成为汽车行业的重要发展方向。激光雷达作为自动驾驶中的重要传感器,其标定和校准是保证自动驾驶系统准确感知和决策的关键环节。本文将介绍自动驾驶激光雷达标定板的相关内容,包括标定板的作用、材料选择…

stable-diffusion-webui 汉化(中文界面)

大家好,我是水滴~~ 本文主要介绍 Stable Diffusion WebUI 是如何汉化的,文章详细的介绍汉化过程,并加上配图能够清晰的展示该过程。 Stable Diffusion WebUI 官方并没有出中文界面,需要通过安装插件来汉化,下面是详细…

使用css将文字在水平线中显示

方法一&#xff1a; 1.效果图 2.html <!-- <div class"line">第三方登录</div> --> 3.css /* 让文字在水平线中显示 */.line {display: flex;flex-direction: row;color: #ccc;font-size: 18px;font-weight: bolder; }.line:before, .line:aft…

【C++】C++ 入门 — 命名空间,输入输出,函数新特性

C 1 前言2 命名空间2.1 概念引入2.2 开始使用2.3 投入应用 3 输入与输出3.1 基础知识3.2 开始使用3.3 注意局限 4 函数新特性4.1 缺省参数4.1.1 开始使用4.1.2 注意事项 4.2 函数重载4.2.1 开始使用4.2.2 如何实现 Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读下…

编程那么难,为什么不弄一个大众一学就会的计算机语言呢?

大家好&#xff01;今天要和大家聊聊一个有趣的想法&#xff1a; 想象一下&#xff0c;如果编程变得像拼乐高积木一样简单&#xff0c;那将是多么美妙的事情啊&#xff01;不需要费尽心思去学习繁杂的语法规则和复杂的逻辑&#xff0c;只需要将代码块像积木一样拼接起来&#x…

深入浅出 diffusion(3):pytorch 实现 diffusion 中的 U-Net

导入python包 import mathimport torch import torch.nn as nn import torch.nn.functional as F silu激活函数 class SiLU(nn.Module): # SiLU激活函数staticmethoddef forward(x):return x * torch.sigmoid(x) 归一化设置 def get_norm(norm, num_channels, num_groups)…

TensorRT英伟达官方示例解析(一)

系列文章目录 TensorRT英伟达官方示例解析&#xff08;一&#xff09; TensorRT英伟达官方示例解析&#xff08;二&#xff09; TensorRT英伟达官方示例解析&#xff08;三&#xff09; 文章目录 系列文章目录前言一、参考资料二、配置系统环境三、00-MNISTData四、01-SimpleD…

银行数据仓库体系实践(4)--数据抽取和加载

1、ETL和ELT ETL是Extract、Transfrom、Load即抽取、转换、加载三个英文单词首字母的集合&#xff1a; E&#xff1a;抽取&#xff0c;从源系统(Souce)获取数据&#xff1b; T&#xff1a;转换&#xff0c;将源系统获取的数据进行处理加工&#xff0c;比如数据格式转化、数据精…

【labVIEW】学习记录

【labVIEW】学习记录 一、简介二、安装及激活三、使用 回到目录 一、简介 labVIEW&#xff08;Laboratory Virtual Instrument Engineering Workbench&#xff09;是一款由美国国家仪器公司&#xff08;National Instruments&#xff09;开发的可视化编程环境和开发平台。LabV…

3.3 实验三:以太网链路聚合实验

HCIA-Datacom实验指导手册&#xff1a;3.3 实验三&#xff1a;以太网链路聚合实验 一、实验介绍&#xff1a;二、实验拓扑&#xff1a;三、实验目的&#xff1a;四、配置步骤&#xff1a;步骤 1 掌握使用手动模式配置链路聚合的方法步骤 2 掌握使用静态 LACP 模式配置链路聚合的…

【JavaEE进阶】 数据库连接池与MySQL企业开发规范

文章目录 🌴数据库连接池🎋数据库连接池的使用🎄MySQL企业开发规范⭕总结🌴数据库连接池 数据库连接池负责分配、管理和释放数据库连接,它允许应⽤程序重复使⽤⼀个现有的数据库连接,⽽不是再重新建⽴⼀个. 没有使⽤数据库连接池的情况:每次执⾏SQL语句,要先创建⼀…