这场2020年秋招里,安全方向的同学讨论度最高的笔试,奇安信IT工程师绝对算一个。身边不少投了网安、运维、系统集成方向的朋友都在用同一套卷子练手,大家的评价高度一致:这不是一场靠背题能过的考试,更像是一次网络基础、安全意识和工程实操的综合摸底。试卷2整体难度比第一套更贴近真实工作场景,环节之间没有冗余,每一道题都在提醒你——安全工程师不是只会写代码,更要能扛事。
这篇文章把试卷2的考察逻辑、高频考点和踩坑经验完整复盘一遍。无论你是准备投奇安信,还是想走同类安全厂商的技术岗,这份梳理都能帮你少走很多弯路。
1. 试卷定位与考察逻辑:安全厂商的IT工程师在考什么
1.1 岗位画像:代码能力只是入场券
奇安信作为国内头部的网络安全企业,它的IT工程师岗位并不是传统意义上的“程序员”,更多承担着安全产品交付、系统运维、安全服务、售前售后技术支持等复合职责。笔试要筛选的,是那种既懂TCP/IP、又懂Linux、还能快速定位业务故障的“多边形工程师”。
所以试卷2的出题风格非常务实。选择题占了大头,但里面几乎每道题都能在真实工作里找到对应场景。比如网络题不会简单问你“TCP和UDP哪个可靠”,而是给你一个“内网访问慢、丢包率高”的现象,让你判断该用哪条命令排查;安全题不会只让你背OWASP Top 10,而是直接给一段带漏洞的代码或一份Nginx访问日志,让你找问题。
这个定位决定了备考方向:不要死磕偏难怪算法,要把精力花在通信原理、系统原理、安全原理的横向串联上。
1.2 题型分布与分值权重
从个人复盘和身边同学的反馈来看,试卷2的题型结构大致如下:
| 题型 | 题量 | 分值占比 | 考察重点 |
|---|---|---|---|
| 单选题 | 20-25题 | 25% | 计算机网络、操作系统、数据库、安全基础 |
| 多选题 | 10-15题 | 20% | 安全漏洞原理、系统加固、协议细节 |
| 判断题 | 8-10题 | 5% | 易混淆概念、位运算、权限管理 |
| 简答题 | 4-6题 | 20% | 故障排查思路、安全事件处置流程 |
| 编程题 | 2-3题 | 30% | 字符串处理、基础算法、脚本编写 |
请注意,这套卷子有个特别容易栽跟头的设计:多选题的评分规则是“多选、错选、漏选均不得分”。这意味着你不能凭感觉蒙答案,必须对知识点有精确的把握。我见过太多人在多选题上翻车,一错就是好几道,直接和面试机会说再见。
1.3 第二套试卷的特殊之处
和第一套相比,试卷2最明显的差异有三个:
第一,工程实践题占比更高。第一套偏重算法题,试卷2则多了不少“给定场景让你给出排查步骤”的简答题,比如“网站响应缓慢你怎么一步步定位”这类。第二,Web安全的知识点被加重了,SQL注入、XSS、路径遍历这类题目高频出现,这明显是因为奇安信的产品线里WAF、Web扫描器占据重要位置。第三,Linux命令相关的选择题变得非常细节,不是让你选功能,而是让你判断不同命令的参数组合会产生什么效果。
可以说,试卷2的难度不在于单个题有多深,而在于覆盖面极广,任何一个技术短板都可能成为你丢分的口子。
2. 高频考点与核心原理拆解
2.1 网络基础:协议细节决定你能不能做安全
网络安全工程师的立身之本就是网络协议。试卷2对网络的考察集中在TCP/IP协议栈,但不是死记硬背,而是反复从“异常角度”考你。
举个例子,TCP三次握手几乎是必考题,但卷子不会让你默写SYN、SYN+ACK、ACK这么简单。它会把问题包装成“SYN Flood攻击为什么会让服务器资源耗尽”,这时候你就要理解三次握手过程中服务器端的半连接队列(SYN Queue)和全连接队列(Accept Queue)机制。攻击者发送大量SYN但不回复ACK,导致半连接队列被塞满,后续正常连接无法建立,这就是典型的DDoS场景。
再比如HTTPS握手的过程,卷子会结合证书链验证来考。你需要清楚TLS握手里客户端和服务端是怎么协商加密套件的、证书的签发和验证流程是什么、对称加密和非对称加密分别在哪个环节发挥作用。这块知识对理解中间人攻击尤其重要,我在后面的安全考点里还会展开。
网络排障类的题目也很折磨人。给你一个“内网某台机器无法访问外网,但内网互通正常”的场景,让你选择排查顺序。正确的思路是:先确认本机IP、掩码、网关配置对不对,再ping网关确认链路,然后检查DNS解析,最后看防火墙规则。这套逻辑和实际运维一脉相承,答题时一定要按“从底层到上层、从自身到外部”的步骤来。
2.2 操作系统与Linux实战:权限和日志是重灾区
Linux在试卷2里的存在感极强,几乎可以说没有Linux知识,这套卷子一半的题都做不了。考察方向集中在三块:文件权限、进程管理、日志分析。
文件权限题年年有,而且年年有人错。chmod 755和chmod 4755的区别要刻在脑子里:4755多出来的4是setuid位,它意味着执行该程序时,进程的有效用户ID会切换为文件属主,比如/usr/bin/passwd就带setuid权限,普通用户才能改自己的密码。笔试可能给你一个“想让某个脚本以root身份运行,但又不希望赋予所有用户执行权限,应该怎么设置”的题,答案就是数字模式下的4750这类组合。
进程管理方面,top和ps是基础,但卷子更爱考的是strace和lsof。比如“某个进程CPU占用高,你如何确认它在做什么”,有经验的人会先top找到PID,再strace -p PID跟踪系统调用,或者用lsof -p PID查看进程打开的文件。这些命令不是让你写出来,而是混在选择题的选项里,让你挑出最合适的一个。
日志分析更是安全工程师的核心技能。试卷里可能会给一段/var/log/secure或Nginx的access.log片段,让你判断发生了什么。比如一条日志里出现连续多次“Failed password for root from 192.168.X.X”,答案肯定是暴力破解。再比如“GET /../../etc/passwd HTTP/1.1”这种请求,本质就是路径遍历攻击尝试,这也是很多安全公司的产品重点防护的攻击类型。
2.3 Web安全原理:漏洞怎么打,就怎么防
奇安信笔试里Web安全的数量占比很高,这很好理解——Web是攻防的主战场。试卷2里反复出现的是OWASP Top 10里的老面孔:SQL注入、XSS、CSRF、SSRF、文件上传、路径遍历。
SQL注入的核心原理是“将用户输入拼接到SQL语句中导致语义改变”。笔试不会让你手工注入,但会给你一段这样的代码:
String sql = "SELECT * FROM users WHERE name = '" + userName + "'";然后问你如何修复。标准答案是用参数化查询(PreparedStatement),把用户输入当作参数而不是SQL语句的一部分。同时还要说清楚为什么不能只依赖过滤单引号,因为绕过的姿势太多了,编码、宽字节、堆叠注入都能把过滤打穿。
XSS分存储型、反射型和DOM型。试卷2喜欢考的是区别和防御差异。存储型是把恶意脚本存在服务器数据库里,每个访问页面的人都会中招;反射型是通过URL参数注入,只有点击恶意链接的人才会受害;DOM型则完全在浏览器端发生,服务器根本看不到恶意载荷。对应防御手段也不同:输出编码、输入校验、CSP(内容安全策略)要组合使用,少一个都不行。
CSRF的题也很典型。核心是“攻击者诱导受害者浏览器发起一个受害者不知情的请求”。防御手段里最硬的是CSRF Token,服务端生成随机Token并嵌入表单,提交时校验;其次是SameSite Cookie属性,它能让跨站请求不携带Cookie。试卷里可能拿这两种方案做选择题,你不仅要认识它们,还得知道各自的适用场景。
路径遍历在搜索热词里被专门提到了,这说明哪年的卷子里路径遍历相关题目确实出现得不轻。它的原理是用../序列跳出应用目录,读取服务器上任意文件。一个典型的Nginx错误配置是:
location /static { alias /home/user/static/; }如果用户请求/static../etc/passwd,且Nginx没有做规范化处理,就可能读到系统文件。修复方式一是使用try_files和root指令并确保路径规范化,二是做严格的输入白名单校验,三是部署WAF。这道题完美体现了安全工程师的工作方式:既能看懂攻击payload,也能从配置层面给出土办法。
2.4 密码学基础:不要求你会实现,但必须懂流程
密码学在试卷2里一般不会考得太深,但基础概念必须扎实。高频考点是这四件事:对称加密、非对称加密、哈希算法、数字签名。
对称加密要用AES,密钥和加密解密用同一个,优点是效率高,缺点是密钥分发难。非对称加密用RSA或ECC,公钥加密、私钥解密(反之亦可用于签名),优点是密钥管理相对简单,缺点是性能差。所以实际场景都是混着用:用非对称加密协商出会话密钥,再用对称加密加密业务数据。
哈希算法是另一个重点。MD5和SHA-1现在都不建议用于安全场景,因为碰撞攻击已经足够成熟,存储密码应该用bcrypt、scrypt或PBKDF2这样的慢哈希算法。卷子里可能给你一条“某网站数据库泄露,密码全是MD5存储”的新闻,问你风险点在哪,其实就是考你对彩虹表和哈希碰撞的理解。
数字签名里要弄明白“私钥签名、公钥验签”和“加密、解密”这两组操作的镜像关系:签名是私钥持有者证明自己身份,加密是公钥持有者向私钥持有者传输秘密。这个理解了,HTTPS证书链验证的题目基本就通了。
2.5 数据库与系统设计:事务、索引与缓存
数据库题在试卷2里以基础为主,但对细节要求很高。事务的ACID特性是必考的,尤其要理解隔离级别的含义:读未提交、读已提交、可重复读、串行化。有一个经典问法是“InnoDB默认的隔离级别是什么?”,答案是可重复读,但你以为这就完了吗?不,卷子还可能继续问“间隙锁在这个级别下怎么解决幻读”,这就要看你对MySQL锁机制的理解了。
索引题也经常出现。最核心的是“最左前缀原则”:联合索引(a,b,c)能用到a、a+b、a+b+c,但直接用b或者c做查询条件就用不上索引。另外,like '%xx%'这种前模糊查询也无法使用B+树索引,这在实际生产环境里是个很容易踩的坑。
Redis在某些偏运维的IT工程师卷子里也会出现,重点是缓存穿透、缓存击穿、缓存雪崩的区分和应对。简单说:穿透是查询一个不存在的key,每次都打到数据库;击穿是某个热点key过期瞬间大量请求打到数据库;雪崩是大批key集中在同一时间过期导致数据库被压垮。应对方案分别可以做空值缓存、互斥锁重建缓存、过期时间加随机值分散。
3. 编程题与逻辑题:这里更看重你用代码解决问题的能力
3.1 常见编程题类型与解题思路
试卷2的编程题一般控制在2-3题,难度在LeetCode简单到中等之间,但有一个显著特点:偏爱字符串处理和逻辑模拟题,而不是复杂的图论和动态规划。因为对安全IT工程师来说,处理日志、解析协议报文才是日常,考算法更多是验证你的代码基本功和逻辑严谨性。
最常出现的一类是“给定一个字符串,按某种规则处理”。比如:去除字符串中的重复字符并保持相对顺序不变。这个题看着简单,但考察点在于你是否能想到用HashSet + StringBuilder在线性时间内解决。
def remove_duplicates(s): seen = set() result = [] for ch in s: if ch not in seen: seen.add(ch) result.append(ch) return ''.join(result)另一类常见题是“日志解析”。比如给一段Nginx访问日志,让你统计每个IP的访问次数并降序排列。这题在测试工程师和运维工程师的卷子里都出现过,本质就是考察split、字典、排序的组合使用,但如果在考场上一紧张,容易在正则解析上卡太久。我的建议是,遇到这类题直接用最稳妥的split加简单逻辑,不要一上来就写复杂正则,省时间才是王道。
还有一类“URL参数解析”题,让你从一串Query String里提取指定参数的值。这种题跟Web安全高度相关,解的时候要注意URL编码问题,比如%20代表空格、%2F代表斜杠。有些同学代码逻辑都对了,但忘了做decode,白丢分。
3.2 工程能力题:日志分析与故障定位
除了纯算法题,试卷2还会出现一种介于简答题和编程题之间的工程场景题,比如给出下面这段Nginx访问日志:
192.168.1.10 - - [18/Sep/2020:14:23:05 +0800] "GET /admin/login.php HTTP/1.1" 200 2563 192.168.1.10 - - [18/Sep/2020:14:23:06 +0800] "GET /admin/login.php HTTP/1.1" 200 2563 192.168.1.10 - - [18/Sep/2020:14:23:08 +0800] "POST /admin/login.php HTTP/1.1" 302 0 10.0.0.4 - - [18/Sep/2020:14:23:10 +0800] "GET /index.php HTTP/1.1" 200 1024问你从中能看出什么问题。正确答案里至少要包含这两点:第一,192.168.1.10在极短时间内反复请求/admin/login.php,这是典型的暴力破解或撞库行为;第二,POST返回302说明登录接口被重定向,可能是登录成功也可能是跳转到验证页,需要进一步跟踪。
这种题的答法非常讲究,不是让你随便写两行字就算完,而是要有“信息-判断-行动”的完整链条。我看到好的答案是这么写的:先指出异常IP和异常行为模式,再判断攻击类型,最后给出处置建议(封IP、启用双因子认证、检查是否有成功的登录记录、调整密码策略)。这种结构不仅能拿分,也能让阅卷人觉得你确实有处理安全事件的经验。
3.3 代码审阅和漏洞识别题
这部分是我个人最喜欢的设计。试卷2会让你看一小段代码并找出安全问题,这种题比单纯考原理更考验真实水平。比如:
import os from flask import request def download_file(): filename = request.args.get('name') filepath = os.path.join('/data/files', filename) with open(filepath, 'rb') as f: return f.read()你一眼就能看出这是个路径遍历漏洞。用户传一个../../etc/passwd,os.path.join的过滤形同虚设。修复方式是对filename做严格的白名单校验,或者用os.path.realpath检查最终路径是否还在指定目录内。这种题做多了你会发现,出题人不是要你背CVE编号,而是要你养成“代码一上手就找输入入口、找信任边界”的思维习惯。
4. 实操复盘:我在笔试现场踩过的坑
4.1 时间分配策略:我为什么建议先做编程题
这套卷子的题量在60-70分钟里要做完,压力不算小。第一次做的时候,我把太多时间放在了一道多选题上,反复犹豫,结果编程题最后只剩不到15分钟,草草写了一个能跑但边界条件全没处理的版本,最后当然挂了。
第二次复刷时我调整了策略:先用5分钟快速浏览全卷,把编程题放在最开始做。原因很简单,编程题分值高,且对状态要求高,越到后面越没脑子写。选择题再难也是确定性的,可以用后面的时间慢慢抠。这个策略帮我从“勉强做完”变成了“还能留10分钟检查”。
具体的时间分配可以参考:编程题25分钟,简答题15分钟,选择和判断20分钟,最后5分钟扫一遍多选题和填空。简答题不需要长篇大论,把关键几个点写清楚就够了,写得多不一定是好事,反而容易漏出破绽。
4.2 我在多选题上的三个典型失误
多选题是这个卷子里失分最惨的地方,后来复盘时我总结了自己的三个问题,相信很多人也有同感。
第一个问题是“过度联考”。比如题目问“下列哪些命令可以查看TCP连接状态”,选项里有netstat、ss、lsof、ps。我心里清楚netstat和ss是正解,lsof也能通过-i参数看到连接,于是把lsof也选了,结果漏选了nmap。这暴露了我对“边界”拿捏不准的问题。这种题的解法是,尽量按“最常用、最直接”的标准选,别为了展示知识面硬凑选项。
第二个问题是“知道一个选项错,误以为整题都错”。当看到某个明显错误的选项时,潜意识里会对其他选项也放松警惕,结果把本该选上的正确选项漏了。后来我强迫自己每个选项独立判断,不受前后选项干扰。
第三个问题是“多选题里碰到不确定的选项”。我的做法是宁少勿多,因为漏选扣分概率低于错选得0分的概率。别贪,保证能拿的分拿到手,就是胜利。
4.3 编程题踩坑:边界条件和输入校验
编程题最容易踩的坑反而不是算法本身,而是边界条件。有一道题是处理日志里的IP并统计次数,题目没说输入是空的时候输出什么。我按最常规的空列表处理了,但忘了考虑“IP不合法”的情况。这要是真实日志,肯定会有脏数据,所以做笔试题时,看到描述涉及“日志”“用户输入”这类词,第一反应就是加非空判断、非法输入判断。
from collections import Counter def count_ip(log_lines): if not log_lines: return {} ip_counter = Counter() for line in log_lines: parts = line.split() if len(parts) > 0: ip = parts[0] ip_counter[ip] += 1 return ip_counter.most_common()这是我后来优化过的写法,虽然简单,但至少保证了空输入不报错。笔试答题时不求惊艳,求稳健。
4.4 面试官在反问环节追问什么
笔试过了之后,面试官一定会从笔试卷子里挑几道题追问,我在面试里被问过的就有:SQL注入怎么绕过参数化查询、如果让你给一台刚装好的Linux服务器做安全基线加固你会做哪些事、如何从日志中判断一个请求是爬虫还是攻击扫描。
这些追问的本质是看你是不是真的理解原理,而不是背答案。所以备考时不要只记结论,要多问自己几个“为什么”:为什么WAF能拦截SQL注入,为什么它拦不住某些变形,为什么流量加密后WAF就失效了。想明白了这些,面试环节基本就能从容应对。
5. 针对校招备考的完整路线与建议
5.1 三个月的备考时间表
如果你从现在开始准备奇安信这类安全厂商的IT工程师笔试,我建议把备考拆成三个阶段。
第一个月打基础,主攻计算机网络、操作系统和安全基础。这个阶段的重点是把原理吃透,而不是刷题。TCP/IP协议栈、Linux权限模型、常见Web漏洞原理,这三块是地基,建议每天固定花2-3个小时看书加动手做实验。网络用Wireshark抓包看三次握手,Linux自己装个虚拟机练习用户管理、权限管理、日志查看,安全漏洞可以用本地靶场去复现。只有亲手看到漏洞的效果,印象才深。
第二个月进入刷题和查漏补缺。每天固定做一套笔试题或专项题库,做完立刻复盘,建一个错题本。错题本的关键不是记录答案,而是记录你当时为什么想错。这个阶段同时要开始刷LeetCode的字符串和数组题,每天两道就够,重点是保持手感。
第三个月做模拟和实战。严格按照90分钟的时限做套卷,做完后把每类题型的得分率统计出来,针对弱项再补强。同时在Github上找一些开源的靶场和日志分析练习项目,练手的同时也能积累面试时能讲的实战案例。有条件的同学去参加CTF比赛,哪怕是校内赛,也能让自己的漏洞理解上一个台阶。
5.2 资料清单:少而精
备考资料不需要太多,但要选对。网络方面推荐《图解TCP/IP》配《Wireshark数据包分析实战》,协议看得见摸得着,比死记硬背效率高。操作系统方面看《鸟哥的Linux私房菜》的权限、进程、日志三章就够了,没必要整本啃完。Web安全方面,最好的是啃一遍OWASP Top 10官方文档和PortSwigger的Web Security Academy,网上可以免费练习,而且实操性强。
编程题方面,LeetCode前100题里的简单和中等难度题刷熟即可,不需要碰困难题。但请重点练字符串、哈希表、双指针这三类,因为它们在笔试卷里出现频率远超其他类型。
5.3 答题心态:这套卷子没人是满分
最后想说一个很多人会忽略的事实:这类校招笔试卷子并不指望你拿满分。它的作用是筛选,不是竞赛。一张70分以上的卷子可能比一张85分但多选题全靠蒙的卷子更有竞争力,因为面试官能从你的答题过程里看到你哪些能力是扎实的。
我在复盘时最大的感受是,做这套卷子就像重建一条安全链路的信任链:基础原理是证书链,工程能力是加密握手,代码能力是会话密钥。每一环都得验证过,整条链路才稳。你不需要在每个环节做到顶尖,但一定不能有致命的脱节。
如果你准备投奇安信,不妨把这份复盘当成一份地图:先查看自己的网络基础是否牢固,再检查Linux实操是否有短板,最后用Web安全和编程题测试自己的实战嗅觉。把这三关都过了,校招这道坎就算迈过去了一半。剩下的,就看你在面试桌上能不能把笔试里的思考过程讲成属于你自己的故事了。