51阅读吧 - 为您打造专业优质的文章分享平台!
您的当前位置: 51阅读吧 >

动态信号测试分析系统|Dpreview公布富士GFX 50S传感器解析力及动态范围测试结果

一篇 : Dpreview公布富士GFX 50S传感器解析力及动态范围测试结果

(原标题:Dpreview公布富士GFX 50S传感器解析力及动态范围测试结果)

器材测评网站Dpreview今日公布了富士中画幅相机GFX 50S传感器的解析力及动态范围测试结果。在解析力方面,这款5100万像素的44 x 33mm中画幅传感器展现出了意料之中的强大实力,成像锐度令人印象深刻。不过搭配85mm F1.8镜头的佳能EOS 5DS R相机所拍摄出的照片也具备与其相似的锐度。具体来看,在高ISO设定下,GFX 50S与宾得645Z的画质差别不大,两者均优于佳能EOS 5DS R。然而,由于索尼A7RII的传感器使用的是背照式的设计,因而使得传感器变得更加高效。

作为富士一直以来的长项,GFX 50S照片的直出JPEG画质也继承了公司其他机型的高水准,色彩响应鲜艳而又简洁有力,肤色和天空的色彩都能够被很好地展现出来。当然,内置的富士胶片模拟模式意味着用户可以在各种好看的胶片效果中进行选择。机内默认锐化十分强力,但是并不过分,画面中的一些细节被恰当地强调了出来。除此之外,机身降噪在细节保留与抑制噪点之间取得了较好的平衡。尽管我们并不认为人们会用一部中画幅相机来拍摄JPEG照片,但是这种格式非常可用,即便是在ISO 12,800的情况下。

动态范围:

通过测试图我们可以看到,使用ISO100拍摄后拉出六档曝光所得到照片中的噪点要比以ISO6400拍摄的照片更多。不过,ISO200感光度下拉回5Ev所拍摄的照片则与ISO6400拍摄的照片效果相仿,这证明GFX 50S上的这款传感器素质不错。然而,当我们使用更低曝光度拍摄后再拉亮暗部的方式进行测试时,GFX 50S则只比尼康D810要稍好一些。此外,尽管富士能够捕捉到更多的光线,但D810则可以通过使用ISO64的方式将曝光提升2/3EV。

 

二篇 : 关于自动化web安全测试动态fuzz的思路与实践分析(图文)

什么叫自动化web安全测试?这其实是一个很大的概念,因为web安全包含很多方面,比如代码审计,比如黑盒测试,甚至还有灰盒测试。还有性能测试,压力测试等等。代码审计其实也不仅仅是审计安全问题,也有审计代码质量的。目前市场的代码审计软件,商业的好像都是有代码质量检查的。我们今天其实主要还是讲fuzz测试中web应用的安全问题,也就是我理解的黑盒测试web应用安全的问题。涵盖的主要是如何用工具发现类似SQL注入,xss,命令执行,文件包含,代码注入等等一系列的安全问题。
一直以来,我们检测一个WEB应用的安全漏洞,无非就是两种手段,一种是手动加参数比如 and 1=1或者对数字型的做一些运算,-1 -2看是否参数进行了传递并且在后端数据库里正确的执行了操作,根据页面的内容变化来判读。当然还有类似|| 1=1这种的。其实都是做的一个运算。只要符合SQL标准能够正确的执行就OK了。第二种是工具,这里指的工具,更多的含义还是指webinspect,appscan,awvs这类的基于爬虫类的扫描工具。先去抓取整个网站的目录结构,然后根据爬出来的链接,测试他的动态参数。无论是上述手段的哪一种,都会有一些缺陷。第一种不适合在大批量目标的攻击,因为显然手工测试的范围有限,第二种解决了第一个手段的缺陷,可以在一个比较大的应用中,快速发现应用程序的漏洞。但是目前来说,仍然存在很多的问题。比如,现在比较大型的应用,都是采用类似前端反向代理,后端动态解析的架构。这种架构的出现,大量的使用ajax的应用,交互式连接,json接口等等。这些东西用爬虫是识别不到的。因此用类似webinspect这样的工具,根本就扫不到什么问题。前阵子看到说awvs可以做web 2.0的扫描,可以识别到ajax请求,但是我用最新版的对比测试,发现还是不行。现在解决这类的问题,貌似有很多办法,国内的我看到aiscanner号称可以用web2.0的引擎或者js引擎解决这个问题,用javascript虚拟引擎加上沙盒技术。这个我查了一些资料,包括在developerworks上也是只看到寥寥的几个介绍。我猜是不是类似用node.js运行一些东西,模仿类似XHR的方式去获取一些交互式的,ajax的链接?希望有大牛能给我指点下。
0×02 基于代理拦截的WEB FUZZ工具
当然,随着技术的发展,很早的时候就出现过一些比较好的办法,比如用代理中转的方式来获取连接,工具类似有的fiddler和burpsuite之类的。fiddler目前官方有一个比较好的插件是Ammonite,运行后如下

在results里,可以看到发包和收包后的过程

首先说说这个插件,我目前测试的情况来说,准确率是比较差的。其实他准确率差和误报率高的一个原因,是因为检测漏洞类型和检测方法都比较的简单。打一个比方,这种类似中间代理的软件,大多数都是延续这种思路的,他们在检测SQL注入的时候,一般都是要不就是取网页内容里的SQL错误关键字,要不就是根据HTTP状态码来判断。这其实在现在来说,是比较老的检测方法,更多的,在做了相关的运算后,则需要取页面长度啊,是否跳转啊这些来判断的。这里先留一个坑,等会我说基于浏览器的自动化fuzz工具的时候,会说到。
除此之外,fiddler上其实还有很多类似的插件,比如这个日本人写的

 
这个插件比较类似burpsuite+fuzzdb的效果

先是拦截请求.

 
讲请求发送到攻击模块

在burpsuite里加载fuzzdb的数据进行进行测试
 


 
可以选择fuzz的模式

 
也可以自己加payloads,fuzz对比里也有
 

设置相关的测试参数
 

 
点击start attack开始攻击
 
 
 
开始攻击,攻击后的结果.
 
 
 
看来比fiddler复杂许多是吗?呵呵。其实这里有许多选项是可调的。这个自己研究下就可以了。设置好相关的参数后,测试起来也是相对要方便很多的。
  关于主动扫描和被动扫描这个,我还想在这里多说一句,无论是burpsuite还是fiddler,这种基于代理拦截的工具其中一个缺点就是主动扫描的功能太弱。当然,现在burpsuite有一些改进,可以做一些主动扫描的事,但还是太弱。
Burpsuite和fiddler其实都是一个原理,通过代理中转拦截所有http或者https的请求,然后重放请求来测试.fiddler稍微要强大一些是可以直接监听网卡等等,可以拦截所有的网络请求,burpsuite有些场景还是不行。详细的使用功能,还是有待大家自己去测试,挖掘,我就不详细说了

三篇 : 利用动态符号执行进行代码覆盖测试

一、前言

代码覆盖测试主要用于漏洞研究领域。主要目的是使用不同输入覆盖程序代码的不同部分。如果某个输入导致程序崩溃,我们将检测崩溃是否能被利用。有很多代码覆盖测试的方法,比如随机测试等。但是本文重点关注使用动态符号执行进行代码覆盖测试。覆盖代码不意味着能找到所有的可能的缺陷。一些缺陷不会引起程序崩溃。然而2017年刚到,勒索软件以惊人的速度爆发。这周我们发现了大量的新变种,尤其是以很有名的名次命名的FSociety。我们也发现了一些解密工具,圣诞节有关的勒索软件,CryptoMix/CryptFile2的分析,大量的小的勒索软件。

二、代码覆盖和动态符号执行(DSE)

不像SSE(静态符号执行),DSE应用于跟踪,并且只有在执行期间达到这些分支时才能发现新的分支。要想到达另一个路径,我们必须搞清楚从上个跟踪发现的分支约束条件。然后我们重复操作,直到到达所有分支。

举个例子,我们假设程序P 有称为I的输入。I可以是模型M或者随机种子R。执行P(I)能返回一组PC约束。所有的φi表示基础块,πi表示分支约束。模型Mi是约束πi的一种可靠的解决方案,M1 = Solution(¬π1 ∧ π2)。为了发现所有的路径,我们维护一个叫W的工作列表,它是一组M。

在第一轮迭代,执行I = R, W = ∅ 和P(I) → PC。然后是∀π ∈ PC, W = W ∪ {Solution(π)} ,再次执行∀M ∈ W, P(M)。当模型M作为程序的输入后,将它从列表W中删除。重复操作知道W为空。

符号执行的代码覆盖测试既有优点又有缺点。它对于在混淆的二进制文件中很有帮助。确实利用符号覆盖能检测到隐藏的、不可达到的代码但会是个平面的图表。最糟糕的是当你的表达式太复杂,可能会超时或巨大的内存消耗(在过去,我们符号表达式在超时前消耗了差不多450 G的 RAM)。这种场景主要发生在分析超大二进制文件或者包含复杂功能的混淆的二进制文件。

三、使用Triton进行代码覆盖测试

从版本v0.1 build 633开始,Triton整合了我们代码覆盖测试需要的一切。它可以让我们更好的处理及计算SMT2-lib表达的AST。下面我们将关注代码覆盖的设计和使用的算法。

1. 算法

以下面的代码为例。

01. char *serial = "x31x3ex3dx26x31"; 02. int check(char *ptr) 03. { 04.   int i = 0; 05.   while (i < 5){ 06.     if (((ptr[i] - 1) ^ 0x55) != serial[i]) 07.       return 1; 08.     i++; 09.   } 10.   return 0; 11. } 

函数控制流图如下显示。它是一个好例子,因为我们需要找到好的输入才能覆盖所有的基础块。

可以看到可以看到只有一个变量可控,位于地址rbp+var_18,指向argv[1]的指针。目标是通过计算约束条件和使用快照引擎到达check函数的所有基础块。例如到达位于地址0x4005C3基础块的约束条件是[rbp+var_4] > 4,但是我们不能直接控制这个变量。另一方面,在地址0x4005B0处的跳转依赖于用户的输入并且这个约束条件可以通过符号执行解决。

归纳以前的想法的算法是使用基于微软的Fuzzer算法(SAGE),下图表示包含约束条件的check函数。这个start和end节点表示了我们的函数开端(0x40056D)和函数的结尾(0x4005C8)

在首次执行前,我们不知道任何的分支约束。因此我们按照上文所述,我们注入一些随机种子来收集第一个PC并且构建我们的W集合。首次执行P(I)的跟踪结果由下图蓝色表示。

执行结果给了我们第一条路径约束P(I) → (π0 ∧ ¬π1)。

基于第一次跟踪,我们知道发现了两条分支(π0 ∧ ¬π1),并且还有两条没有发现。为了到达基础块φ3,我们计算第一个分支约束的否定条件。当且仅当Solution(¬π0) 是SAT,我们将它添加到模型工作列表W中。

同样到达 φ4 可以得到W = W ∪ {Solution(π0 ∧ ¬(¬π1))}。所有解决方案都生成了并且模型被添加到工作列表中,我们执行工作列表中每个模型。

2. 实现

执行代码覆盖的一个条件是在一个跳转指令处能预测下一条指令的地址。这是构建路径约束的必要条件。

我们不能在一个分支指令后放置一个回调,因为RIP寄存器已经改变了。因为Triton为所有的寄存器创建语义表达式,所以在分支指令时可以判定RIP。

第一次,我们开发了一个SMT判定器用来计算RIP,但是我们发现Pin提供的用于获得下一个RIP值的IARG_BRANCH_TARGET_ADDR和IARG_BRANCH_TAKEN有点滞后。使用Pin计算下一个地址非常简单,但是SMT判定器用来检查指令的语义是很有用的。

为了更好的演示判定,我们实现了visitor pattern来将SMT的抽象语法树(AST)转化为Z3的抽象语法树。这个设计能够用于将SMT AST转化为任意其他的表达。

Z3的AST使用Z3 API处理更加简单。转化代码是src/smt2lib/z3AST.h 和 src/smt2lib/z3AST.cpp

现在我们解释代码覆盖的工具如何工作。让我们假定输入来自命令行。

首先,我们有:

160. def run(inputSeed, entryPoint, exitPoint, whitelist = []): 161. ... 175. if __name__=='__main__': 176.   TritonExecution.run("bad !", 0x400480, 0x40061B, ["main", "check"]) # crackme_xor 

在176行,我们定义了输入种子bad!,代表程序的第一个参数。然后我们给出代码覆盖的起始地址,在这个地址我们将做一个快照。第三个参数将匹配最后一个块,这个地址我们将恢复快照。最后,我们设置一个避免库函数、加密函数等的白名单。

134. def mainAnalysis(threadId): 135. 136.    print "[+] In main" 137.    rdi = getRegValue(IDREF.REG.RDI) # argc 138.    rsi = getRegValue(IDREF.REG.RSI) # argv 139. 140.    argv0_addr = getMemValue(rsi, IDREF.CPUSIZE.QWORD)      # argv[0] pointer 141.    argv1_addr = getMemValue(rsi + 8, IDREF.CPUSIZE.QWORD)  # argv[1] pointer 142. 143.    print "[+] In main() we set :" 144.    od = OrderedDict(sorted(TritonExecution.input.dataAddr.items())) 145. 146.    for k,v in od.iteritems(): 147.        print "t[0x%x] = %x %c" % (k, v, v) 148.        setMemValue(k, IDREF.CPUSIZE.BYTE, v) 149.        convertMemToSymVar(k, IDREF.CPUSIZE.BYTE, "addr_%d" % k) 150. 151.    for idx, byte in enumerate(TritonExecution.input.data): 152.        if argv1_addr + idx not in TritonExecution.input.dataAddr: # Not overwrite the previous setting 153.            print "t[0x%x] = %x %c" % (argv1_addr + idx, ord(byte), ord(byte)) 154.            setMemValue(argv1_addr + idx, IDREF.CPUSIZE.BYTE, ord(byte)) 155.            convertMemToSymVar(argv1_addr + idx, IDREF.CPUSIZE.BYTE, "addr_%d" % idx) 

下一个执行的代码是mainAnalysis回调函数,我们注入一些值到输入中(行148,154),我们能通过符号变量覆盖这些输入(行149,155)。

所有被选择的输入存储在全局变量TritonExecution.input中。然后我们开始代码检测。

58. if instruction.getAddress() == TritonExecution.entryPoint and not isSnapshotEnabled(): 59.        print "[+] Take Snapshot" 60.        takeSnapshot() 61.        return 

当我们在入口点时,我们做一个快照,为了用新的输入重新执行代码检测。

52. if instruction.getAddress() == TritonExecution.entryPoint + 2: 53.   TritonExecution.myPC = []                                  # Reset the path constraint 54.   TritonExecutionTritonExecution.input = TritonExecution.worklist.pop()     # Take the first input 55.   TritonExecution.inputTested.append(TritonExecution.input)  # Add this input to the tested input 56.   return 

我们重置路径约束(行53),从工作列表中取出一个新的输入。

63. if instruction.isBranch() and instruction.getRoutineName() in TritonExecution.whitelist: 64. 65.   addr1 = instruction.getAddress() + 2                # Address next to this one 66.   addr2 = instruction.getOperands()[0].getValue()     # Address in the instruction condition 67. 68.   # [PC id, address taken, address not taken] 69.   if instruction.isBranchTaken(): 70.     TritonExecution.myPC.append([ripId, addr2, addr1]) 71.   else: 72.     TritonExecution.myPC.append([ripId, addr1, addr2]) 73. 74.   return 

上述代码检测是否位于分支指令(如jnz,jle等)或者位于白名单中的函数中。如果是,我们得到两种可能的地址(addr1和addr2),通过isBranchTaken()(行69)计算有效的地址。

然后,我们将条件约束存储在RIP表达式中。

81. if instruction.getAddress() == TritonExecution.exitPoint: 82.  print "[+] Exit point" 83. 84.  # SAGE algorithm 85.  # http://research.microsoft.com/en-us/um/people/pg/public_psfiles/ndss2008.pdf 86.  for j in range(TritonExecution.input.bound, len(TritonExecution.myPC)): 87.      expr = [] 88.      for i in range(0,j): 89.          ripId = TritonExecution.myPC[i][0] 90.          symExp = getFullExpression(getSymExpr(ripId).getAst()) 91.          addr = TritonExecution.myPC[i][1] 92.          expr.append(smt2lib.smtAssert(smt2lib.equal(symExp, smt2lib.bv(addr,  64)))) 93. 94.      ripId = TritonExecution.myPC[j][0] 95.      symExp = getFullExpression(getSymExpr(ripId).getAst()) 96.      addr = TritonExecution.myPC[j][2] 97.      expr.append(smt2lib.smtAssert(smt2lib.equal(symExp, smt2lib.bv(addr,  64)))) 98. 99. 100.      expr = smt2lib.compound(expr) 101.      model = getModel(expr) 102. 103.      if len(model) > 0: 104.          newInput = TritonExecution.input 105.          newInput.setBound(j + 1) 106. 107.          for k,v in model.items(): 108.              symVar = getSymVar(k) 109.              newInput.addDataAddress(symVar.getKindValue(), v) 110.          print newInput.dataAddr 111. 112.          isPresent = False 113. 114.          for inp in TritonExecution.worklist: 115.              if inp.dataAddr == newInput.dataAddr: 116.                  isPresent = True 117.                  break 118.          if not isPresent: 119.              TritonExecution.worklist.append(newInput) 120. 121.  # If there is input to test in the worklist, we restore the snapshot 122.  if len(TritonExecution.worklist) > 0 and isSnapshotEnabled(): 123.      print "[+] Restore snapshot" 124.      restoreSnapshot() 125. 126.  return 

当我们在出口点是是最后一步。行84-120是SAGE的实现。简言之,我们浏览路径约束列表,对于每个PC,我们尝试获得满足否定的模型。如果有不可靠的模型到达了新的目标块中,我们将这个模型添加到工作列表中。一旦所有的模型被插入工作列表中,我们恢复快照并且重新执行每个模型。

全部代码能在这里找到,我们例子的执行过程如下:

四、总结

尽管代码覆盖使用符号执行是一个好的方法,但它是个复杂的任务。路径遍历意味着内存消耗,并且一些情况下要计算的表达式太过复杂。目前,判定器非常慢,判定表达式非常慢。

 

四篇 : 系统测试的基本分类分类

系统测试

1、负载测试:关注性能可看作是性能测试的一种技术;模拟所承受的负载条件,改变负载大小,负载方式

过程

1)确定模拟角色及对应的关键业务操作路径。

2)确定输入输出参数,制定负载测试方案。

3)准备测试环境,完成相应的测试脚本的开发。

4)设计具体的测试场景(如负载水平,加载方式等)

5)执行测试,监控输出参数(如数据吞吐量,响应时间,资源占有率等)

6)对测试结果进行分析

7)如不满意调整测试场景,进入下一循环。

模拟用户行为,输入数据

1.并发用户数,并发连接数等

2.思考时间,用户发出请求的间隔时间

3.家在循环次数或持续时间

4.每次请求发送的数据量

5.加载的方式或模式(如均匀加载、峰值交替加载等)

加载模式

A. 动态模式

B. 全天模式

C.队列模式

D.验证模式

E. 递增模式

F.恒值模式

场景设置:在性能测试之前,以什么养的方式启动负载方式、如何持续进行伏在测试直至伏在测试结束,这个过程的负载大小和方式、负载启动和结束,各个检查点、验证点等设计。

可分为:静态(设置模拟用户生成器,用户数量,用户组等)动态(添加性能计数器,检查点,阀值等从而获得伏在测试过程中返回来的数据)【根据业务模式变化,随时间段变化】

也可分为:手动场景,面向目标的场景

负载测试执行:大量虚拟用户运行在多个客户端,并有控制器管理,代理驱动;需针对不同纬度的变化进行包括时间维(系统在一段较长时间上的行为变化),负载维(在系统上改变负载来进行对比分析),系统维(针对系统的不同组件,不同配置等);监控,详细记录,适当分析十分重要

测试结果:要善于捕捉被监控的数据发生突变的地方---拐点

2、性能测试:关注性能;获取或验证系统性能指标

响应时间:用户关注点;容量和数据吞吐量:(产品市场团队)业务处理方面的关注点;系统资源占有率:开发团队的技术关注点

性能测试的类型

1.性能验证测试:验证事先已定义的系统性能指标,系统能否满足系统的性能需求。

2.性能基准测试:在系统标准配置下获得有关的性能指标数据,作为将来性能改进的基准线

3.性能规划测试:在多种特定的环境下,获得不同配置的性能指标,从而决定在系统部署时采用什么样的软硬件配置。

4.容量测试:系统容量可以看作系统性能指标之一

性能测试的步骤

常见的性能问题

² 资源泄漏:包括内存泄漏

²资源瓶颈:内部资源(线程,放入池的对象)变得稀缺

²CPU使用率达到100%,系统被锁定等

² 线程死锁,线程阻塞等

² 数据库连接成为性能瓶颈

² 查询速度慢或列表效率低

² 受外部系统影响越来越大

3、容量测试:也采用负载测试技术实现;通过负载测试或其他测试方法,预先分析反应软件系统应用特征的某项指标的极限值(如大量并发用户数,数据库记录数等),在极限值下还能保持正常运行;一般采用逐步加载的负载测试方法,也可先采用逐步加载方式,获得一个基本的容量或容量范围,然后再考虑用一次性加载的方式,来决定实际可支持的容量值

4、压力测试:看做负载测试的一种;在强负载(大数据量,大量并发用户连接)稳定性进行测试,查看在峰值(瞬间高峰)使用的行为表现,系统是否有良好的容错能力和可恢能力。是系统(如CPU,内存和网络宽带等)处于饱和状态下,测试系统是否还具有正常的会话能力、数据处理能力或是否会出现的错误,以检查系统对异常情况的抵抗能力,找出性能瓶颈、功能不稳定性等问题。

JMeter是Apache组织开发的基于Java的压力测试工具。 JMeter可以用于对服务器、网络或对象模拟巨大的负载,来在不同压力类别下测试它们的强度和分析整体性能 。

压力测试的类型

1.稳定性压力测试:高负载下持续运行24小时以上

2.破坏性压力测试:通过不断加载的手段,快速造成系统的崩溃,让问题尽快的暴露出来

3.渗入测试:长时间运行,使问题逐渐渗透出来,从而发现内存泄露,垃圾收集(GC),系统其它问题,以检验系统的健壮性

4.峰谷测试:采用高低突变加载方式,先加载到高水平的负载,然后急剧降低负载,稍微平息一段时间,在加载到高水平的负载,重复这样过程,容易发现问题

5、安全测试:检验系统权限设置有效性、防范非法入侵的能力、数据备份和恢复能力等,设法找出上述各种安全漏洞

如:

v 跨站点脚本(cross-sitescripting,XSS)攻击;

v SQL注入式漏洞;

v 缓冲区溢出;

v 不安全的数据存储或传递;

v 不安全的配置管理;

v有问题的访问控制,权限分配有问题;

v口令设置不严,包括长度、构成和更新频率;

v 暴露的端口或入口;

安全性能测试的范围

Ø 系统级别的安全性

Ø 应用程序级别的安全性(重点):

ü用户权限

ü 数据输入验证

ü 敏感数据加密

ü 数据存储安全性

ü 用户口令

ü 验证系统的日志文件是否得到保护

Web安全性能测试

Ø 跨站脚本攻击:发送恶意代码

Ø Sql注入式攻击

Ø url和api的身份验证

Ø 其他

6、兼容性测试:是在特定的或不同的硬件,网络环境和操作系统平台上、不同的应用软件之间,验证系统是否正常的运行,以及能否正确存取原先版本的用户数据所惊醒的测试

内容

² 硬件兼容测试

² 数据兼容测试:1.是否遵守统一的国际标准、国家标准或业界认可的事实标准等;2.提供相应的导入导出功能;3.剪贴板会ODBC等类似方法

² 系统版本之间的兼容性

7、可靠性测试:软件系统在规定时间内及规定环境条件下,完成规定功能的能力,常用的度量是平均无故障时间,软件可靠性包括:

² 规规定的时间

² 规定的运行环境条件

² 规定的功能

8、容错性测试:在各种异常条件下对系统的功能进行测试,以检验系统是否具有防护性的措施或某种灾难性恢复的手段和能力

分为两层

1.功能层次的容错性测试(负面测试,例外测试):从逆向思维出发,检查系统在异常条件下或用户的非法操作下系统是如何响应的,是否有异常行为或执行不了不应该执行的动作(1.无效等价类的测试用例就是一种负面的测试;2.在一些异常的或恶劣的条件下进行操作; 3.探索性测试;)

2.系统层次的容错性测试:主要是灾难恢复性测试,故障转移测试(就是验证故障转移机制能否正常实现,满足事先的设计要求;在软件系统发生故障的情况下,检验系统的恢复能力,验证系统已保存的用户数据是否丢失、系统和数据是否能尽快恢复或在指定时间内恢复,包括验证重新初始化、检查点、数据恢复和重新启动等机制的正确性)。

上一篇:全国计算机等级考试成绩查询|[广东省]2005全国一级结构工程师考试成绩查询 上一篇:个性化推荐的十大挑战|个性化推荐时代的阅读之殇:你置身于“回声室效应”却浑然不觉
与该文相关的文章

温馨提示:如果您对51阅读吧有任何建议,请通过网站联系邮箱向我们反馈,感谢各位的建议与支持!