公共题也想写写,主要是由我最差的智力题。呵呵,其实智力题很多是需要细心的,诸如逻辑推理之类的题目就不去深究了,毕竟这个是积累啊!看来,智力题中的数组序列、三个水桶问题最容易考了,好多的类似的题目,诸如DOS攻击系统漏洞就是纯网络的了:Synflood、Smurf、.Land-based、Ping of Death、Teardrop、PingSweep、Pingflood。缓冲区溢出攻击向缓冲区发送大量数据,使部分数据溢出到相邻的内存缓冲区,从而破坏缓冲区或者重写逻辑。这样就能够造成拒绝服务、破坏数据或者在远程服务器上执行恶意代码。防止缓冲区溢出攻击的惟一方法是检查所有用户输入的长度。至于输入法漏洞的3389端更是每天听说过快了,什么玩意!前两条没有写完呢,继续吧!公共题中有考到软件测试方面的知识,涉及测试用例个数,这个需要巩固软件工程的知识了,个人觉得软考软件设计师的书重要的!其实无论是语句覆盖还是条件覆盖。此外,还考到了oracle中admin下的几个目录:udump,用户转储文件存放位置[存放用户信息];bdump,后台进程的一些调试、日志信息[后台进程和ALRET.LOG文件];cdump,主要是oracle的内核转储记录存放位置[存放系统文件]。有一个很好的软件,TureCrypt,源磁盘加密软件,免费软件,加密方法不像普通的加密大师什么的,一下子就能破解。WinwebMail、SendMail都是典型的邮件服务器,呵呵,这个不知道哦,可以自己假设这样一个邮件服务器的!至于使普通用户可执行超级用户文件的就是s权限了,unix-center是个学习unix的好网站哦!chmod +s,创建s与t权限,是为了让一般用户在执行某些程序的时候,能够暂时具有该程序拥有者的权限。当s权限在user的x时,也就是类似 -r-s--x--x,称为Set UID,简称为SUID,这个UID表示User的ID,而User表示这个程序(/usr/bin/passwd)的拥有者(root)。那么,我们就可以知道,当dmtsai用户执行 /usr/bin/passwd时,它就会“暂时”得到文件拥有者root的权限。 软件测试并不等于程序测试,软件测试应该贯穿整个软件定义与开发整个期间。因此需求分析、概要设计、详细设计以及程序编码等各阶段所得到的文档,包括需求规格说明、概要设计规格说明、详细设计规格说明以及源程序,都应该是软件测试的对象。 OPenAPI我觉得单元测试、安全测试和性能测试至少是要的吧,而
验收测试是部署软件之前的最后一个测试操作,其目的是确保软件准备就绪,并且可以让最终用户将其用于执行软件的既定功能和任务。它主要是针对项目型的测试系统,α测试和β测试主要是针对产品型的测试系统,而不能说验收测试包括α测试和β测试,验收测试也是UAT-User Acceptance Testing即用户可接收性测试,它是以用户为主的测试。项目最重要的特性应该是可管理性和可预测性吧。 Web应用安全漏洞最突出的有:Cross Site Scripting、SQL injection等。Cross Site Scripting是一种存在于Web应用中,允许黑客向Web应用注入恶意脚本,以获取其他用户重要数据和隐私信息为母的一种工具形式。最后一题也得说一说了,有两个有序的整数集合啊,b。请写一个函数,实现找出a,b集合中的交集,并打印出来。这个题倒是不难,我想多了,硬是把第一个数组的值与第二个数组的值循环比较,算法时间复杂确实不敢恭维啊!实际上只需要从左到右比较就ok了。
int n = M > N ? M: N;
int *p = new int[n];
memset(p, 0, n);
int i = 0;
int j = 0;
int k = 0;
while (i < M && j < N) {
if (a[i] < b[j])
i++;
else if (a[i] > b[j])
j++;
else {
p[k] = a[i];
while (a[++i] == p[k]);
while (a[++j] == p[k]);
k++;
}
}
for (i = 0; i < k; i++)
printf("%4d", p[i]);
delete [] p;
}
void main() {
int a[M] = {1, 2, 2, 5, 7};
int b[N] = {2, 2, 2, 2, 2, 2};
intersect(a, b);
}
附录:
一、IPSec协议
IPSec 协议不是一个单独的协议,它给出了应用于IP层上网络数据安全的一整套体系结构,包括网络认证协议 Authentication Header(AH)、封装安全载荷协议Encapsulating Security Payload(ESP)、密钥管理协议Internet Key Exchange (IKE)和用于网络认证及加密的一些算法等。IPSec 规定了如何在对等层之间选择安全协议、确定安全算法和密钥交换,向上提供了访问控制、数据源认证、数据加密等网络安全服务。
二、隧道技术(Tunneling)
隧道技术的基本过程是在源局域网与公网的接口处将数据(可以是ISO 七层模型中的数据链路层或网络层数据)作为负载封装在一种可以在公网上传输的数据格式中,在目的局域网与公网的接口处将数据解封装,取出负载。被封装的数据包在互联网上传递时所经过的逻辑路径被称为“隧道”。
要使数据顺利地被封装、传送及解封装,通信 协议是保证的核心。目前VPN隧道 协议主要有4种:点到点隧道 协议PPTP、第二层隧道 协议L2TP、网络层隧道 协议IPSec以及SOCKS v5 协议。其中,PPTP和L2TP工作在数据链路层,IPSec工作在网络层,SOCK v5工作在会话层。各 协议工作在不同层次,我们应该注意,不同的网络环境适合不同的 协议,在选择VPN产品时,应该注意选择。
隧道技术的基本过程是在源局域网与公网的接口处将数据(可以是ISO 七层模型中的数据链路层或网络层数据)作为负载封装在一种可以在公网上传输的数据格式中,在目的局域网与公网的接口处将数据解封装,取出负载。被封装的数据包在互联网上传递时所经过的逻辑路径被称为“隧道”。
要使数据顺利地被封装、传送及解封装,通信 协议是保证的核心。目前VPN隧道 协议主要有4种:点到点隧道 协议PPTP、第二层隧道 协议L2TP、网络层隧道 协议IPSec以及SOCKS v5 协议。其中,PPTP和L2TP工作在数据链路层,IPSec工作在网络层,SOCK v5工作在会话层。各 协议工作在不同层次,我们应该注意,不同的网络环境适合不同的 协议,在选择VPN产品时,应该注意选择。
三、SSL和HTTPS
SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层:SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持;SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。SSL协议提供的服务主要有:认证用户和服务器,确保数据发送到正确的客户机和服务器;加密数据以防止数据中途被窃取;维护数据的完整性,确保数据在传输过程中不被改变。
https是由Netscape开发并内置于其浏览器中,用于对数据进行压缩和解压操作,并返回网络上传送回的结果。HTTPS实际上应用了Netscape的完全套接字层(SSL)作为HTTP应用层的子层。(HTTPS使用端口443,而不是象HTTP那样使用端口80来和TCP/IP进行通信。)SSL使用40 位关键字作为RC4流加密算法,这对于商业信息的加密是合适的。HTTPS和SSL支持使用X.509数字认证,如果需要的话用户可以确认发送者是谁。。https是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,https的安全基础是SSL。
四、
GnuPG
电子邮件和数据加密领域,PGP(Pretty Good Privacy)是最为有名的加密工具之一。从9.0版开始,PGP已经发展成为个人计算机数据保护的一个全面的解决方案。你也不一定非要花上大价钱才能保护邮件内容。GnuPG以实际行动证实了它是开源软件中最好的解决方式之一。它能与绝大多数电子邮件客户程序结合,为其提供强大的加密技术。
GnuPG进行加密要通过叫作公共密钥基础设施(PKI)的简单原理。每个GnuPG用户都拥有由一个公共密钥和一个私有密钥组成的密钥对。使用公共密钥进行加密的电子邮件只能用对应的私有密钥解码。公共密钥及其对应的电子邮件地址集中储存在GnuPG密钥服务器上的数据库中;私有密钥只有它的主人才知道,且在每次使用时都必须输入密码。要想对一条信息进行加密必须从密钥服务器上获得接收人的公共密钥。
五、
linux中怎么查找权限位为S的文件
两种特殊的文件访问权限分别是SUID(八进制为4000)和SGID(八进制为2000)。设置这两种权限的文件,将使其它用户在执行它们时拥有所有者的权限。也就是说,如果一个设置为SUID的程序,即使是普通用户使用也是作为root来运行的。因此,SUID/SGID文件是安全的隐患。
find / -type f -perm +6000 -ls | less
find / -type f -perm +6000 > Suid-Sgid.txt
find / -type f -perm +6000 -ls | less
find / -type f -perm +6000 > Suid-Sgid.txt
六、软件缺陷生命周期
软件缺陷是指系统或系统部件中那些导致系统或部件不能实现其功能的缺陷。软件缺陷的起源:需求、构架、设计、编码、测试、用户。对于每一个软件缺陷都规定了6个生命状态:Open、Working、Verify、Cancel、Close、Defer,它们的基本定义是:
Open态---缺陷初试状态,软件测试员报告一个缺陷,缺陷生命周期开始;
Working态---缺陷修改状态,程序员接收缺陷,正在修改中;
Verify态---缺陷验证状态,程序员修改完毕,等待软件测试员验证;
Close态---缺陷关闭状态,软件测试员确认缺陷被改正,将缺陷关闭;
Cancel态---缺陷删除状态,软件测试员确认不是缺陷,将缺陷置为删除状态 (不做物理删除);
Defer态---缺陷延期状态,管理者确认缺陷需要延期修改或追踪,将缺陷置为延期状态;
上述Open态、Working态、Verify态,称为缺陷的活动态;
Close态、Cancel态、Defer态,称为缺陷的终结态。
软件缺陷是指系统或系统部件中那些导致系统或部件不能实现其功能的缺陷。软件缺陷的起源:需求、构架、设计、编码、测试、用户。对于每一个软件缺陷都规定了6个生命状态:Open、Working、Verify、Cancel、Close、Defer,它们的基本定义是:
Open态---缺陷初试状态,软件测试员报告一个缺陷,缺陷生命周期开始;
Working态---缺陷修改状态,程序员接收缺陷,正在修改中;
Verify态---缺陷验证状态,程序员修改完毕,等待软件测试员验证;
Close态---缺陷关闭状态,软件测试员确认缺陷被改正,将缺陷关闭;
Cancel态---缺陷删除状态,软件测试员确认不是缺陷,将缺陷置为删除状态 (不做物理删除);
Defer态---缺陷延期状态,管理者确认缺陷需要延期修改或追踪,将缺陷置为延期状态;
上述Open态、Working态、Verify态,称为缺陷的活动态;
Close态、Cancel态、Defer态,称为缺陷的终结态。
七、项目最重要的特性
我提一点,根据客户的水平采用不同的过程模型。
例如:
1、客户如果有一定的项目经验,对计算机比较了解,能给出比较明确的需求,可以采用瀑布模型。
2、客户如果对计算机不是太了解,但有过类似项目的经验,并且能积极的给出需求。需求基本正确,可以采用演化式原型开发方法。
3、如果客户对计算机能为他做什么没有概念的话。这时就比较适合用废弃式原形开发方法。
4、如果客户的主要需求基本稳定,但需求的增长速度和变动频率都比较高,这时就应该用螺旋模型做开发过程模型。
例如:
1、客户如果有一定的项目经验,对计算机比较了解,能给出比较明确的需求,可以采用瀑布模型。
2、客户如果对计算机不是太了解,但有过类似项目的经验,并且能积极的给出需求。需求基本正确,可以采用演化式原型开发方法。
3、如果客户对计算机能为他做什么没有概念的话。这时就比较适合用废弃式原形开发方法。
4、如果客户的主要需求基本稳定,但需求的增长速度和变动频率都比较高,这时就应该用螺旋模型做开发过程模型。
八、
HMM
隐马尔科夫模型(hidden Markov model,缩写为HMM)的提出最初是在语音处理领域。HMM是在Markov链的基础上发展起来的一种统计模型。由于实际问题比Markov链模型所描述的更为复杂,因此在HMM中观察到的事件与状态并不是一一对应,而是与每个状态的一组概率分布相联系。它是一个双重随机过程,其中之一是Markov链,描述状态的转移;另一个描述每个状态和观察值之间的统计对应关系。这样,HMM以概率模型描述观察值序列,具有很好的数学结构,能够比较完整地表达观察值序列的特征。
评估问题:对于给定模型,求某个观察值序列的概率p(σ|λ) ;
解码问题:对于给定模型和观察值序列,求可能性最大的状态序列;
学习问题:对于给定的一个观察值序列,调整参数λ,使得观察值出现的概率p(σ|λ)最大。
解码问题:对于给定模型和观察值序列,求可能性最大的状态序列;
学习问题:对于给定的一个观察值序列,调整参数λ,使得观察值出现的概率p(σ|λ)最大。
HMM的状态是不确定或不可见的,只有通过观测序列的随机过程才能表现出来;观察到的事件与状态并不是一一对应,而是通过一组概率分布相联系;HMM是一个双重随机过程。
九、两个有序数组求交集的C++实现
#include <stdio.h>
#include <memory.h>
const int M = 5;
const int N = 6;
void intersect(int a[], int b[]) {
if ((a[M - 1] < b[0]) || (a[0] > b[N - 1]))
return;
#include <memory.h>
const int M = 5;
const int N = 6;
void intersect(int a[], int b[]) {
if ((a[M - 1] < b[0]) || (a[0] > b[N - 1]))
return;
int n = M > N ? M: N;
int *p = new int[n];
memset(p, 0, n);
int i = 0;
int j = 0;
int k = 0;
while (i < M && j < N) {
if (a[i] < b[j])
i++;
else if (a[i] > b[j])
j++;
else {
p[k] = a[i];
while (a[++i] == p[k]);
while (a[++j] == p[k]);
k++;
}
}
for (i = 0; i < k; i++)
printf("%4d", p[i]);
delete [] p;
}
void main() {
int a[M] = {1, 2, 2, 5, 7};
int b[N] = {2, 2, 2, 2, 2, 2};
intersect(a, b);
}