『软件测试6』bug一两是小事,但安全漏洞是大事!

安全测试

详解软件测试中的安全测试

  • 一、💿安全测试概念
    • 1、安全测试概述
    • 2、安全测试与软件生命周期的关系
    • 3、常规测试与安全测试的不同
      • (1)测试目标不同
      • (2)假设条件不同
      • (3)思考域不同
      • (4)问题发现模式不同
  • 二、🔍安全测试基本原则
    • 1、培养正确的思维方式
    • 2、尽早测试和经常测试
    • 3、选择正确的测试工具
    • 4、尽可能测试源代码
    • 5、测试结果文档化
  • 三、🔦常见安全漏洞
    • 1、SQL注入
      • (1)定义
      • (2)案例
      • (3)如何防范SQL注入
    • 2、XSS跨站脚本攻击
      • (1)XSS命名
      • (2)定义
      • (3)xss攻击过程
      • (4)如何防御
    • 3、CSRF跨站请求伪造攻击
      • (1)定义
      • (2)攻击过程
      • (3)如何攻击
      • (4)CSRF和XSS的不同之处
      • (5)如何防范CSRF
      • (6)Referer
  • 四、🩸渗透测试
    • 1、渗透测试的定义
    • 2、渗透测试的特点
    • 3、渗透测试流程主要步骤
    • 4、渗透测试流程
      • (1)明确目标
      • (2)收集信息
      • (3)扫描漏洞
      • (4)验证漏洞
      • (5)分析信息
      • (6)渗透攻击
      • (7)整理信息
      • (8)编写测试报告
  • 五、🛠️常见安全测试工具
    • 1、Web漏洞扫描工具-AppScan
      • (1)定义
      • (2)AppScan的扫描过程
    • 2、端口扫描工具-Nmap
      • (1)定义
      • (2)Nmap的具体功能
    • 3、抓包工具-Fiddler
      • (1)定义
      • (2)Fiddler的功能
    • 4、Web渗透测试工具-Metasploit
      • (1)定义
      • (2)Metasploit的具体功能
      • (3)Metasploit的作用
  • 六、🔚结束语

前面我们讲过黑白盒测试和性能测试,但是呢,对于一个软件来说,安全测试也是非常重要的。就像封面所示,内容很诱人,一旦用户点击进去,就很容易让其执行非本意的操作,试想下结果……不堪设想。因此,做好软件安全测试,共同营造一个良好的软件环境是至关重要的。

在下面的这篇文章中,将讲解关于软件测试中的安全测试。一起来学习吧~

一、💿安全测试概念

1、安全测试概述

安全测试是在IT软件产品的生命周期中,特别是产品开发基本完成到发布阶段,对产品进行检验以验证产品符合安全需求定义和产品质量标准的过程。

2、安全测试与软件生命周期的关系

安全测试贯穿于软件的整个生命周期。如下图所示:

安全测试与软件生命周期的关系

3、常规测试与安全测试的不同

(1)测试目标不同

普通测试以发现 Bug 为目标;

安全测试以发现安全隐患为目标。

测试目标不同

(2)假设条件不同

普通测试假设导致问题的数据是用户不小心造成的,接口一般只考虑用户界面

安全测试假设导致问题的数据是攻击者处心积虑构造的,需要考虑所有可能的攻击途径

假设条件不同

(3)思考域不同

普通测试以系统所具有的功能为思考域;

安全测试的思考域不但包括系统的功能,还有系统的机制、外部环境、应用与数据自身安全风险与安全属性等。

思考域不同

(4)问题发现模式不同

普通测试以违反功能定义为判断依据;

安全测试以违反权限与能力的约束为判断依据。

问题发现模式不同

二、🔍安全测试基本原则

1、培养正确的思维方式

安全测试人员要有创造性思维,创造性思维能够帮助我们站在攻击者角度思考各种无法预期的情况,同时能够帮助我们猜测开发人员是如何开发的,如何绕过程序防护逻辑,以某种不安全的行为模式导致程序失效。

培养正确的思维方式

2、尽早测试和经常测试

安全性缺陷和普通 Bug 没什么区别,越早发现修复成本越低,要做到这一点,最开始的就是在软件开发前期对开发和测试团队进行常见安全问题的培训,教会他们学会如何检测并修复安全缺陷。

虽然新兴的第三方库工具以及编程语言能够帮助开发人员设计出更安全的程序,但是新的威胁不断出现,开发人员最好能够意识到新产生的安全漏洞对正在开发的软件的影响,测试人员要转变思维方式,从攻击者角度的各个细节测试应用程序,使软件更加安全。

尽早测试和经常测试

3、选择正确的测试工具

很多情况下安全测试需要模拟黑客的行为对软件系统发起攻击,以确保软件系统具备稳固的防御能力。模拟黑客行为就要求安全测试人员擅长使用各种工具,如漏洞扫描工具模拟数据流行为的前后台相关工具数据包抓取工具等。

现在市面上提供了很多安全扫描器或者应用防火墙工具可以自动完成许多日常安全任务,但是这些工具并不是万能的。作为测试人员,我们要准确了解这些工具能做什么,不能做什么是非常重要的,切不可过分夸大或者不当使用测试工具。

选择正确的测试工具

4、尽可能测试源代码

使用源代码扫描工具对软件进行代码扫描,一方面可以找出潜在的风险,从内对软件进行检测,提高代码的安全性;另一方面也可以进一步提高代码的质量。黑盒的渗透测试白盒的源代码扫描内外结合,可以使软件的安全性得到极大程度的提高。

尽可能测试源代码

5、测试结果文档化

测试总结的时候,明智且有效的做法是将测试行动和结果清晰准确地记录在文档中,产生一份测试报告,该报告最好包括漏洞类型问题引起的安全威胁严重程度用于发现问题的测试技术漏洞的修复漏洞风险等。

一份好的测试报告应该帮助开发人员准确定位软件安全漏洞,从而有效进行漏洞修补,使软件更安全可靠。

测试结果文档化

三、🔦常见安全漏洞

1、SQL注入

(1)定义

所谓 SQL 注入就是把 SQL 命令人为的输入 URL 、表格域、或者其他动态生成的 SQL 查询语句的输入参数中,最终达到欺骗服务器执行恶意的 SQL 命令。

(2)案例

案例1:

str SQL=select * from users where (name=‘“+username+”’) and (pw=‘“+password+”’);
str SQL=select * from users where (name=1or1=1) and
(pw=1or1=1);

案例2:

str SQL=select * from users where (name=‘张三’;DROP TABLE users;--)”
Select *from users where name=‘张三’;
DROP TABLE users

(3)如何防范SQL注入

SQL 注入是风险非常高的安全漏洞,我们可以在应用程序中对用户输入的数据进行合法性检测,包括用户输入数据的类型和长度,同时,对 SQL 语句中的特殊字符(如单引号、双引号、分号等)进行过滤处理。

由于 SQL 注入攻击的 Web 应用程序处于应用层,因此大多防火墙不会进行拦截。除了完善应用代码外,还可以在数据库服务器端进行防御,对数据库服务器进行权限设置,降低 Web 程序连接数据库的权限,撤销不必要的公共许可,使用强大的加密技术保护敏感数据并对被读取走的敏感数据进行审查跟踪等。

2、XSS跨站脚本攻击

(1)XSS命名

XSS 全拼为 Cross Site Scripting ,意为跨站脚本,其缩写原本为 CSS ,但这与 HTML 中的层叠样式表(Cascading Style Sheets)缩写重名了,为了区分就将跨站脚本改为了 XSS

(2)定义

XSS (Cross Site Scripting)是 Web 应用系统最常见的安全漏洞之一,它主要源于 Web 应用程序对用户输入检查和过滤不足。攻击者可以利用 XSS 漏洞把恶意代码注入到网站中,当有用户浏览该网站时,这些恶意代码就会被执行,从而达到攻击的目的。

(3)xss攻击过程

先用一张图来演示XSS的攻击过程:

 XSS攻击过程

XSS攻击过程有以下4个步骤:

  • 攻击者通过邮件或其他方式诱使用户点击包含恶意代码的链接,例如攻击者通过E-mail向用户发送一个包含恶意代码的网站 home.com
  • 用户点击链接后,浏览器会在用户毫不知情的情况下执行链接中包含的恶意代码。
  • 将用户与 home.com 交互的 cookiesession 等信息发送给攻击者。
  • 攻击者拿到这些数据之后,就会伪装成用户与真正的网站进行会话,从事非法活动。

(4)如何防御

对于 XSS 漏洞,最核心的防御措施就是对用户的输入进行检查和过滤,包括 URL 、查询关键字、 HTTP 头、 POST 数据等,仅接受指定长度范围、格式适当、符合预期的内容,对其他不符合预期的内容一律进行过滤。

除此之外,当向 HTML 标签或属性中插入不可信数据时,要对这些数据进行相应的编码处理。将重要的 cookie 标记为 http only ,这样 javascript 脚本就不能访问这个 cookie ,避免了攻击者利用 javascript 脚本获取 cookie

3、CSRF跨站请求伪造攻击

(1)定义

CSRF (Cross-Site Request Forgery)为跨站请求伪造,它是一种针对 Web 应用程序的攻击方式,攻击者利用 CSRF 漏洞伪装成受信任用户的请求,来访问受攻击的网站。

(2)攻击过程

下面用一张图来演示 CSRF 的攻击过程:

 CSRF攻击过程

(3)如何攻击

CSRF 攻击中,当用户访问一个信任网站时,在没有退出会话的情况下,攻击者诱使用户点击恶意网站,恶意网站会返回攻击代码,同时要求访问信任网站,这样用户就在不知情的情况下将恶意网站的代码发送到了信任网站。

(4)CSRF和XSS的不同之处

XSS 是盗取用户信息伪装成用户执行恶意活动,而 CSRF 则是通过用户向网站发起攻击。

如果将 XSS 攻击过程比喻为小偷偷取了用户的身份证去办理非法业务,则 CSRF 攻击则是骗子“劫持”了用户,让用户自己去办理非法业务,以达到自己的目的。

(5)如何防范CSRF

CSRF 漏洞产生的原因主要是对用户请求缺少更安全的验证机制,防范 CSRF 漏洞的主要思路就是加强后台对用户及用户请求的验证,而不能仅限于 cookie 的识别。

例如,使用 http 请求头中的 Referer 对网站来源进行身份校验,添加基于当前用户身份的 token 验证,在请求数据提交前,使用验证码填写方式验证用户来源,防止未授权的恶意操作。

(6)Referer

HTTP Referer 是请求头的一部分,代表网页的来源(上一页的地址),当浏览器向 Web 服务器发送请求的时候,一般会带上 Referer ,告诉服务器此次访问是从哪个页面链接过来的,服务器由此可以获得一些信息用于处理。

四、🩸渗透测试

1、渗透测试的定义

渗透测试是利用模拟黑客攻击的方式,评估计算机网络系统安全性能的一种方法。这个过程是站在攻击者角度对系统的任何弱点、技术缺陷或漏洞的主动分析,并且有条件地主动利用安全漏洞。

2、渗透测试的特点

渗透测试是一个渐进的并且逐步深入的过程。

渗透测试是选择不影响业务系统正常运行的攻击方法进行的测试。

3、渗透测试流程主要步骤

渗透测试的主要步骤如下图所示:

渗透测试的主要步骤

4、渗透测试流程

(1)明确目标

  • 确定测试需求
  • 确定客户要求渗透测试的范围
  • 确定渗透测试规则

(2)收集信息

在信息收集阶段要尽量收集关于项目软件的各种信息,例如,对于一个 Web 应用程序,要收集脚本类型服务器类型数据库类型以及项目所用到的框架开源软件等。信息收集对于渗透测试来说非常重要,只有掌握目标程序足够多的信息,才能更好地进行漏洞检测。

信息收集的方式可分为两种:

主动收集: 通过直接访问、扫描网站等方式收集想要的信息,这种方式可以收集的信息比较多,但是访问者的操作行为会被目标主机记录。

被动收集: 利用第三方服务对目标进行了解,如上网搜索相关信息。这种方式获取的信息相对较少且不够直接,但目标主机不会发现测试人员的行为。

(3)扫描漏洞

在这一阶段,综合分析收集到的信息,借助扫描工具对目标程序进行扫描,查找存在的安全漏洞

(4)验证漏洞

扫描漏洞阶段,测试人员会得到很多关于目标程序的安全漏洞,但这些漏洞有误报,需要测试人员结合实际情况,搭建模拟测试环境对这些安全漏洞进行验证。被确认的安全漏洞才能被利用执行攻击。

(5)分析信息

经过验证的安全漏洞就可以被利用起来向目标程序发起攻击,但是不同的安全漏洞,攻击机制并不相同,针对不同的安全漏洞需要进一步分析,包括安全漏洞原理可利用的工具目标程序检测机制攻击是否可以绕过防火墙等,制定一个详细精密的攻击计划,这样才能保证测试顺利执行。

(6)渗透攻击

渗透攻击就是对目标程序发起真正的攻击,达到测试目的,如获取用户帐号密码、截取目标程序传输的数据、控制目标主机等。一般渗透测试是一次性测试,攻击完成之后要执行清理工作删除系统日志程序日志等,擦除进入系统的痕迹。

(7)整理信息

渗透攻击完成之后,整理攻击所获得的信息,为后面编写测试报告提供依据。

(8)编写测试报告

测试完成之后要编写测试报告,阐述项目安全测试目标、信息收集方式、漏洞扫描工具以及漏洞情况、攻击计划、实际攻击结果、测试过程中遇到的问题等,此外,还要对目标程序存在的漏洞进行分析,提供安全有效的解决办法。

五、🛠️常见安全测试工具

1、Web漏洞扫描工具-AppScan

(1)定义

AppScanIBM 公司出的一款 Web 应用安全测试工具,它采用黑盒测试方式,可以扫描常见的 web 应用安全漏洞。

(2)AppScan的扫描过程

AppScan 的扫描过程为:探测、测试、扫描

在探测阶段, AppScan 通过发送请求对站内的链接、表单等进行访问,根据响应信息检测目标程序可能存在的安全隐患,从而确定安全漏洞范围。

在测试阶段, AppScan 对潜在的安全漏洞发起攻击。 AppScan 有一个内置的测试策略库,测试策略库可以针对相应的安全隐患检测规则生成对应的测试输入, AppScan 就使用生成的测试输入对安全漏洞发起攻击。

在扫描阶段, AppScan 会检测目标程序对攻击的响应结果,并根据结果来确定探测到的安全漏洞是否是一个真正的安全漏洞,如果是一个真正的安全漏洞则根据其危险程度确定危险级别,为开发人员修复缺陷提供依据。

2、端口扫描工具-Nmap

(1)定义

Nmap 是一个网络连接端口扫描工具,用来扫描网上计算机开放的网络连接端口。确定服务运行的端口,并且推断计算机运行的操作系统。它是网络管理员用以评估网络系统安全必备工具之一。

(2)Nmap的具体功能

Nmap具体功能如下:

  • 主机扫描
  • 端口状态扫描
  • 应用程序版本探测
  • 操作系统探测
  • 防火墙/IDS逃避和欺骗
  • 支持测试对象交互脚本

3、抓包工具-Fiddler

(1)定义

Fiddler 是一个 http 协议调试代理工具,它以代理 Web 服务器形式工作,帮助用户记录计算机和 Internet 之间传递的所有 HTTP(HTTPS) 流量。

如图所示:

抓包工具

(2)Fiddler的功能

Fiddler 可以捕获来自本地运行程序的所有流量,从而记录服务器到服务器、设备到服务器之间的流量。此外, Fiddler 还支持各种过滤器,过滤出用户想要的流量数据,节省大量时间和精力。
相比于其他抓包工具, Fiddler 小巧易用,且功能完善,它支持将捕获的流量数据存档,以供后续分析使用。

4、Web渗透测试工具-Metasploit

(1)定义

Metasploit 是一个渗透测试平台,能够查找、验证漏洞,并利用漏洞进行渗透攻击。它是一个开源项目,提供基础架构、内容和工具来执行渗透测试和广泛的安全审计。

(2)Metasploit的具体功能

对于渗透攻击, Metasploit 主要提供了以下功能模块:

渗透模块(exploit): 运行时会利用目标的安全漏洞进行攻击。

攻击载荷模块(payload): 在成功对目标完成一次渗透之后,测试程序开始在目标计算机上运行。它能帮助用户在目标系统上获得需要的访问和行动权限。

辅助模块(auxiliary): 包含了一系列的辅助支持模块,包括扫描模块漏洞发掘模块网络协议欺骗模块

编码器模块(encoder): 编码器模块通常用来对我们的攻击模块进行代码混淆,逃过目标安全保护机制的检测,如杀毒软件和防火墙等。

Meterpreter: 使用内存技术的攻击载荷,可以注入到进程之中。它提供了各种可以在目标上执行的功能。

(3)Metasploit的作用

Metasploit 是一个多用户协作工具,团队成员可以共享主机数据,查看收集的证据以及创建主机备注以共享有关特定目标的知识。最终, Metasploit 可帮助用户确定利用目标的最薄弱点,并证明存在漏洞或安全问题。

六、🔚结束语

对于软件测试来说,除了黑白盒测试、性能测试以外,安全测试也尤为重要。一旦网页有漏洞,攻击者很容易就让受攻击者执行非本意的操作,这种场面并不是谁都想看到的。因此,对于软件来说,要做好安全测试🙋

关于安全测试的内容就讲到这里啦!如有不理解或文章有误,欢迎评论区留言或私信我交流!

同时,有需要了解软件测试相关的其他内容,可到『软件测试』栏目进行查看学习~

  • 关注公众号 星期一研究室 ,第一时间关注学习干货,更多有趣的专栏待你解锁~
  • 如果这篇文章对你有用,记得 一键三连 再走哦~
  • 我们下期见!🥂🥂🥂

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

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

相关文章

我们真的需要JWT吗?

JWT(JSON Web Token)是目前最流行的认证方案之一。博客园、各种技术公众号隔三差五就会推一篇JWT相关的文章,真的多如牛毛。但我对JWT有点困惑,今天写出来跟大家探讨探讨,不要喷哈。JWT原理本文默认读者已经对JWT有所了…

leetcode面试题 02.07. 链表相交

一:题目 二:思路 1.这道题我们是需要找到一个结点,并且从这个结点往后的结点都相等 2.我们需要将两个链表 右对齐 3.然后将长链表的指针移动到和短链表头结点相同的位置 4.接下来就是比较指针,当一个指针相同也就意味着往后的结点的数值也相等 三:上码…

详解队列在前端的应用,深剖JS中的事件循环Eventloop,再了解微任务和宏任务

队列在前端中的应用一、队列是什么二、应用场景三、前端与队列:事件循环与任务队列1、event loop2、JS如何执行3、event loop过程4、 DOM 事件和 event loop5、event loop 总结四、宏任务和微任务1、引例2、宏任务和微任务(1)常用的宏任务和微…

终于弄明白了 Singleton,Transient,Scoped 的作用域是如何实现的

一:背景1. 讲故事前几天有位朋友让我有时间分析一下 aspnetcore 中为什么向 ServiceCollection 中注入的 Class 可以做到 Singleton,Transient,Scoped,挺有意思,这篇就来聊一聊这一话题,自从 core 中有了 S…

leetcode142. 环形链表 II(暴力+双链表)

一:题目 二:思路 1.双指针 快慢指针(快指针一次一个结点,慢指针一次两个结点) 2.如果有环的话,那么快慢指针肯定会相遇 3.那么相遇的地点一定在环中 因为如果没有环的话慢指针是永远追不到快指针的 4.接下来就是判断出口在那里,我们定义一个…

动态 Restful API 生成

介绍通常在DDD开发架构中,我们写完服务层需要在控制器中写API,今天介绍一个组件 Plus.AutoApi 可以用它来动态生成 Restful 风格的 WebApi,不用写 Controller。快速使用在你的应用服务层中添加组件Install-Package Plus.AutoApi在 Startup 中…

卷死了!再不学vue3就没有人要你了!速来围观vue3新特性

一文全面了解vue3新特性一、😶vue3比vue2有什么优势?二、🧐Vue3升级了哪些重要的功能1、createApp2、emits(父子组件间的通信)(1)通信方式(2)举个例子🌰3、多事件处理4、Fragment5、…

idea报错Class not found (在target中没有生成对应的class文件)

一:问题描述 二:解决 既然他不自动生成,那么我们就手动导入; 点击后应用 然后再次运行我们的测试用例;如果不行 再取消勾选 然后再运行我们的测试用例

敲黑板!vue3重点!一文了解Composition API新特性:ref、toRef、toRefs

一文了解Composition API新特性:ref、toRef、toRefs一、🙎如何理解ref、toRef和toRefs1、ref、toRef和toRefs是什么(1)ref1)ref是什么2)举个例子🌰(2)toRef是什么1&#…

C# 枚举转列表

C# 枚举转列表独立观察员 2020 年 9 月 1 日今天有朋友问我,ComboBox 怎么绑定一个 Enum,其实他的意思是枚举如何转换为列表。想想这确实是一个挺正常的需求,但我一时也只想到遍历,他觉得麻烦,于是我在网上帮忙查了一下…

leetcode242. 有效的字母异位词(两种方法map或数组)

一:题目 二:上码 1:方法一&#xff08;map解法&#xff09; class Solution { public:bool isAnagram(string s, string t) {/**思路:1.分析题意&#xff0c;这个是要判断t中的字符出现次数和s中字符出现的次数相同2.可以用map<char,int>来做*/map<char,int>m1,m…

活久见!月薪30k的小程序全栈开发到底有多难?

10年前&#xff0c;公司的标配是门户网站&#xff0c;造就了一批网站工作室。随着移动互联网大潮兴起&#xff0c;App又成了企业标配&#xff0c;IOS和Android开发赚的盆满钵满。然而App导致的手机内存告急&#xff0c;无止尽的信息推送&#xff0c;让微信小程序应运而生。然而…

卷不动也得继续学!紧跟vue3的步伐,再来get一波进阶新特性!

vue3进阶新特性一、&#x1f4d7;watch和watchEffect1、watch和watchEffect的区别2、举个例子&#xff08;1&#xff09;wtach监听&#xff08;2&#xff09;watchEffect监听二、&#x1f4d8;setup如何获取组件实例&#xff08;1&#xff09;为什么需要获取组件实例&#xff0…

leetcode349. 两个数组的交集(思路+详解)

一:题目 二:上码 class Solution { public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {/**思路:本题我们采用的哈希表数据结构是unordered_set,没有用数组因为我们不确定给出的数组中数值的范围如果 强上会出现空间的大量…

高效掌握新技能的「树型思维」

大家好&#xff0c;我是Z哥。不知道你有没有过这样的困惑&#xff0c;想学习某项新技能&#xff0c;但是很容失败。比如&#xff0c;出于职业发展的考虑&#xff0c;想学习一门新的编程语言&#xff0c;或者想了解一个新的技术框架&#xff1b;又或者看了某些综艺节目后想玩一玩…

vue2的响应式原理学“废”了吗?继续观摩vue3响应式原理Proxy

一文了解Vue3的响应式原理一、&#x1f7e9;回顾Object.defineProperty二、&#x1f7e8;Proxy基本使用三、&#x1f7e6;学习Proxy语法&#xff1a;Reflect四、&#x1f7e7;Vue3如何用Proxy实现响应式1、实现响应式2、Proxy总结&#xff08;1&#xff09;深度监听&#xff0c…

一名“企业定制化人才”的自诉:“我不愿意,但却无可奈何”

这是头哥侃码的第214篇原创几个月前&#xff0c;我曾在大智慧时期的一位同事跟我聊微信&#xff0c;说自己所在的公司这两年业务一直不温不火&#xff0c;而且从19年底就逐渐缩减技术人员。今年上半年又因为疫情的关系&#xff0c;公司干脆直接砍掉了剩余的三个技术部门&#x…

一文了解分而治之和动态规则算法在前端中的应用

一文了解分而治之和动态规则算法一、分而治之1、分而治之是什么&#xff1f;2、应用场景3、场景剖析&#xff1a;归并排序和快速排序二、动态规则1、动态规则是什么&#xff1f;2、应用场景3、场景剖析&#xff1a;斐波那契数列4、动态规则VS分而治之三、分而治之算法常见应用1…

leetcode1. 两数之和(两种方法)

一:题目 二:上码 1:方法一 class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {vector<int> v;for(int i 0; i < nums.size() - 1; i) {for(int j i1; j < nums.size(); j) {if(nums[i] nums[j] target) {v.push_…

排坑 | Exceptionless 5.x 无法正常发送邮件

【问题解决】| 作者 / Edison Zhou这是恰童鞋骚年的第282篇原创内容你有碰到过通过docker部署Exceptionless无法发送邮件的问题吗&#xff1f;此解决办法适用于Exceptionless 5.x版本&#xff08;如果你不想升级6.x的话&#xff09;。1问题起因去年这个时候&#xff0c;得知Exc…