
这套卷子我印象挺深。2020年奇安信的秋招软件开发岗笔试和当年不少互联网大厂的出题思路不太一样——它明显更偏向安全底座 工程实现的组合而不是单纯刷LeetCode就能轻松过关。如果你现在正在准备奇安信或者其他安全厂商的软件开发岗这套卷子的题型分布、考点侧重点很值得拿来当一面镜子照出自己的薄弱环节。我以2020年这套试卷为线索结合当年考生反馈和奇安信的技术栈特点把这套卷子从出题逻辑、核心考点到备考策略完整拆开讲一遍。1. 试卷整体出题逻辑安全厂商要的软件开发工程师到底考什么先聊一个很多人忽略的问题安全公司的软件开发岗和普通互联网公司有什么本质区别普通互联网公司考算法、考并发、考缓存本质是在筛选“能扛住高并发流量”的工程师。而安全公司做的是防护产品、检测引擎、安全分析平台它面对的对象不是普通用户流量而是恶意样本、攻击流量、漏洞利用代码。所以奇安信这套题表面看是常规的编程基础实际上每一道题背后都在试探你有没有安全思维能不能站在对抗视角写代码。从2020年这套试卷的反馈来看它的结构大致可以分成四块模块考察方向占比感受编程题手写代码算法基本功、字符串/数组处理、边界条件约30%计算机基础操作系统、网络协议、数据库约35%安全基础知识漏洞原理、安全开发规范、加密/认证约25%逻辑与综合场景题、异常处理、方案设计约10%这里有个很核心的信号安全知识占了三成左右。如果你只刷算法题完全不碰安全基础这套卷子大概率会栽在选择题上。而反过来如果你只懂安全不懂工程实现编程题又会暴露代码功底。奇安信要的是“两条腿走路”的人——这其实是整个安全行业对研发岗的普遍要求。当年有不少考生反馈“没想到考了这么多安全知识”说明多数人在准备时用了投互联网大厂的惯性思路。这是第一大坑下面细说。1.1 编程题的隐藏意图不只考算法更考防御式编程编程题看似是常规的字符串处理、数组操作但奇安信的版本里通常埋了三个“隐藏扣分点”第一是边界条件的处理。普通题目写个排序、去重、反转正常人能想到的测试用例也就空数组、单一元素。但安全场景中输入是不可信的所以题目往往会描述一个“可能包含异常字符、超长输入、空指针”的场景。如果你写的代码没有对这些边界做防御在安全公司眼里就是不专业的代码。第二是内存和效率意识。安全产品往往要处理海量日志、超大型样本代码的时间复杂度和空间复杂度不只是面试题里的理论指标而是实实在在的运维成本。同样能跑通的代码用O(n)和O(n²)写出来在安全数据分析场景下的差距可能是几小时和几天的差别。第三是输入校验。这一点和安全开发直接挂钩——永远不要信任外部输入。哪怕是一个简单的字符串处理题正规的安全开发规范也要求先校验输入的合法性再做业务逻辑。奇安信这类厂商的编程题如果你在校验部分写得干净利落阅卷人一眼就能看出来你是“有安全意识的人”。1.2 计算机基础的出题倾向网络是重点中的重点奇安信的笔试里网络协议相关的题目占比明显高于普通软件开发岗。原因很好理解安全产品对着的就是网络流量不把TCP/IP、HTTP、DNS这些协议吃透做出来的防护产品就是空中楼阁。2020年这套卷子网络部分的考题集中在三个方向TCP三次握手、四次挥手的状态变迁尤其是TIME_WAIT和CLOSE_WAIT的区别和危害HTTP协议细节包括报文结构、常见状态码含义、Cookie和Session的机制加密通信的基础概念对称加密和非对称加密的应用场景、证书的作用操作系统方面则重点考了进程与线程的区别、死锁的四个必要条件、虚拟内存和物理内存的映射关系。这些内容如果你大学期间操作系统课没混日子基本能答个七七八八。数据库考得不算太深主要就是SQL基本语法、索引的作用与失效场景、事务的ACID特性。但这里也有个安全向的变种——SQL注入的原理和防范。这几乎是奇安信笔试必考题当年很多人就是挂在这样一个看似简单实则陷阱重重的题目上。2. 核心考点深度拆解这些题背后不为人知的考察逻辑这一节我们逐个模块拆开讲把每类题背后真正想考察的东西说透。2.1 编程题实战从一道字符串题看答题规范2020年这套卷子有一道很典型的编程题大意是给定一个字符串要求去掉其中的重复字符并保持首次出现的顺序同时过滤掉非字母和数字的字符最后输出处理后的字符串。题目本身不难但它考察的点非常密集。普通解法可能是这样def deduplicate(s: str) - str: seen set() result [] for ch in s: if ch.isalnum() and ch not in seen: seen.add(ch) result.append(ch) return .join(result)代码逻辑本身没错但如果是安全公司的笔试我会建议你多写几步def deduplicate(s: str) - str: if s is None: raise ValueError(input cannot be None) if len(s) 10000: raise ValueError(input too long) seen set() result [] for ch in s: if ch.isalnum() and ch not in seen: seen.add(ch) result.append(ch) return .join(result)差异在哪里第一段代码假设输入一定合法第二段代码假设输入可能非法。在安全开发生命周期SDL里这叫“默认不安全所以我要主动防御”。笔试阅卷人看到这种细节心里对你的评价会高一个档次。再看一个常见的数组题给定一个无序整数数组找出其中缺失的最小正整数。这道题当年也有考生反馈遇到了变体。经典解法是利用“索引对应值”的思路做到时间O(n)、空间O(1)def first_missing_positive(nums): if not nums: return 1 n len(nums) # 只关心 [1, n] 范围内的数字 for i in range(n): while 1 nums[i] n and nums[nums[i] - 1] ! nums[i]: target_idx nums[i] - 1 nums[i], nums[target_idx] nums[target_idx], nums[i] for i in range(n): if nums[i] ! i 1: return i 1 return n 1这类题考的是对数组索引的敏感度。安全领域大量涉及哈希映射、特征匹配、索引查找这种基本功扎实的人写检测规则、写匹配引擎都更靠谱。2.2 计算机网络考察点从状态码到三次握手网络部分的选择题和简答题我挑几个高频考点展开说一下。关于TCP三次握手单纯问“为什么是三次而不是两次”已经算是送分题了。2020年的卷子更喜欢换个姿势考给你一个tcpdump抓包结果让你判断这属于哪个阶段或者给你一段服务端代码问它为什么报错。这里有个容易混淆的点SYN flood攻击的原理和三次握手的关系。攻击者发送大量SYN包但不完成握手服务端会为每个半连接分配资源导致资源耗尽。这个知识点普通开发岗可能不考但安全厂商笔试几乎是必考。你要能说清楚半连接队列syn backlog、SYN Cookie机制、以及如何缓解这类攻击。HTTP状态码里404和500大概是个人都知道但2020年这套卷子考了一个容易被忽略的题301和302的区别。301是永久重定向302是临时重定向。搜索引擎对待301会迁移权重对待302不会。在安全场景中重定向还涉及一个安全隐患——开放重定向漏洞攻击者可以利用某些跳转逻辑把用户引导到钓鱼网站。这就是安全厂商的独特视角同样一个基础知识点它一定会往安全风险方向延伸。Cookie和Session的区别也是高频考点。Session存在服务端Cookie存在客户端Session ID通常通过Cookie传递。但如果Cookie没设置HttpOnly属性那么恶意脚本就可以通过document.cookie偷走它这就是XSS攻击能窃取会话的根本原因。这道题能串起来Cookie、Session、XSS三个知识点属于性价比极高的复习方向。2.3 操作系统考点进程线程与内存管理操作系统在2020年这套卷子里占比不低但难度中等偏基础。进程与线程的区别是默写级题目但卷子喜欢换角度考比如给你一个多线程程序问它哪个变量是线程共享的、哪个是私有的。堆是进程级别共享的栈是线程私有的全局变量是共享的局部变量是私有的。如果你能顺手答出“那线程池的核心参数是怎么设计的”那这道题就拿满了。死锁是另一个必考知识点。四个必要条件互斥、持有并等待、不可剥夺、循环等待。产生死锁后怎么处理常见策略有死锁预防、死锁避免银行家算法、死锁检测与恢复。安全厂商笔试里这个问题有个变种——如何避免多线程采集任务中的死锁。这其实是在考察你对锁顺序的设计思维多个任务竞争多个资源时如果能保证加锁顺序全局一致就能很大程度上避免循环等待。虚拟内存考察的是页表、缺页中断、页面置换算法。LRU最近最少使用和LFU最不经常使用是两大主流算法安全服务中做缓存淘汰也常用到。这里有个小技巧LRU可以通过“哈希表双向链表”实现O(1)的访问复杂度这本身就是一道经典面试题如果把它掌握熟了笔试和后续的技术面都能用上。2.4 安全基础知识拉开分差的关键模块安全基础是奇安信笔试区分度最高的模块。普通开发岗考生在这里容易丢分而有安全课程背景或实战经验的考生则能拿高分。SQL注入可以说必考。不只是问你什么是SQL注入更常考的是参数化查询为什么能防注入原理在于参数化查询把SQL语句结构和数据分离数据库在执行时不会把用户输入当作SQL指令解析。如果你能答出“预编译”这个关键字然后补充“不要用拼接字符串的方式执行SQL”这道题基本就稳了。进阶一点还能聊聊宽字节注入和二次注入的原理——这些在安全产品研发中都是要重点防御的。**XSS跨站脚本攻击**考的是类型存储型、反射型、DOM型。三者的区别在于恶意脚本的“驻留位置”。存储型存在服务端数据库中每次访问页面都会触发危害最大反射型通过URL参数传递需要诱导用户点击DOM型完全在浏览器端完成不经过服务端传统的WAFWeb应用防火墙很难拦截。这里建议你记住每一种类型的防御方案输出编码、输入过滤、CSP内容安全策略。认证与授权方面常考Session和Token的区别、JWT的结构和潜在风险。JWT由Header、Payload、Signature三部分组成Base64编码用密钥签名。经典的安全问题是——如果服务端没有校验签名攻击者就可以自己伪造一个Token。这个知识点在奇安信笔试中出现频率非常高因为它直接关系到API安全。对称加密与非对称加密也是安全基础的重头戏。要清楚对称加密AES、DES、3DES加密解密用同一个密钥速度快非对称加密RSA、ECC公钥加密私钥解密速度慢但解决了密钥分发问题实际场景中常用“非对称加密协商密钥 对称加密传输数据”的混合方案HTTPS就是这样做的你要是能把AES的几种工作模式ECB、CBC、GCM也说清楚尤其是CBC为什么需要随机IV、GCM为什么同时提供加密和完整性校验那阅卷人会觉得你不仅是“知道”而是“用过”。2.5 Linux与数据库基础研发绕不开的日常奇安信的笔试里Linux相关的题一般不会特别难但特别实际。常见的有查看进程、内存、磁盘的命令ps、top、free、df、du日志分析命令grep、awk、sed端口查看与网络排查netstat、ss、telnet、nc这里有个加分项如果你能在答题时写出一条完整命令解决实际问题会比只写命令名词强很多。比如题目问“如何查看某个进程占用的端口”你可以答lsof -i -P -n | grep 进程名或者用更通用的方式netstat -tlnp | grep 进程名或端口数据库方面索引是高频考点。问题经常是这样有一张用户表字段包括id、username、email、created_at有一个查询是“WHERE username ?”应该给username建什么索引答案是普通B树索引即可。但如果业务是模糊查询“WHERE username LIKE abc%”索引仍然有效而“%abc%”这种前模糊查询就会导致索引失效只能全表扫描。能说清这个区别说明你真的理解B树索引的最左前缀匹配原则。事务ACID特性里的隔离级别也常考。读未提交、读已提交、可重复读、串行化四个级别分别解决什么问题各自有什么副作用。MySQL默认是可重复读Oracle默认是读已提交。这个区别如果你在答“默认隔离级别”时准确写出来也是很大的加分点。3. 2020年秋招真实难度评估与应对策略很多人会问安全厂商的笔试到底难不难我的判断是难度中等偏上但难在“覆盖面广”而不在“单个题深”。如果你目标明确提前一个月准备完全有机会通过。但要注意秋招笔试不是看单科成绩而是看总分排名。所以策略上不能只盯着编程题刷要把安全基础补起来。3.1 时间分配建议90分钟怎么花最划算假设笔试时间是90分钟到120分钟题型包含单选、多选、简答、编程。我的建议是先做编程题预留40~50分钟。原因很简单编程题分值高且容易验证对错代码出来了基本就是拿到了分。很多人在选择题上磨磨蹭蹭结果编程题没时间写这是最亏的。次做安全基础20分钟。这部分属于“知道就知道、不知道就蒙”的类型不要过多纠结。再做网络和操作系统20分钟。这些题往往需要理解分析仔细读题避免在选项里绕圈子。最后做数据库和Linux10分钟。相对简单判断和命令类题扫一眼就能选。关于“先易后难”这个原则我的经验是选择题遇到卡壳超过1分钟的先标记跳过不要恋战。编程题如果第一道就卡住先做第二道很多时候写着写着会反过来触发第一题的思路。3.2 编程题的答题规范学会“可读性优先”笔试场景下代码不是给机器看的而是给阅卷人看的。所以我强烈建议你养成三个习惯第一先写注释再写代码。用两行注释说明自己的整体思路然后再实现。这样即使代码有小Bug阅卷人也能从框架逻辑上给你分。第二命名要清晰。用is_valid、dedup_set这种见名知意的命名而不是a、b、c这种临时变量。安全公司研发岗对代码可维护性要求很高代码风格也是印象分。第三主动考虑异常分支。空输入、超长输入、类型异常至少要有一个合理的处理方式。你可以用try-except也可以写if判断但“什么都不处理”是最差选择。我这里补一段经典的“防御式编程”示例字符串转整数的简化版当年卷子中也有类似变体def str_to_int(s: str) - int: if not s or not isinstance(s, str): raise ValueError(invalid input) s s.strip() if not s: raise ValueError(empty string after strip) sign 1 idx 0 if s[0] in (, -): if s[0] -: sign -1 idx 1 result 0 for ch in s[idx:]: if not (0 ch 9): raise ValueError(invalid character: ch) result result * 10 (ord(ch) - ord(0)) # 这里可以加溢出判断比如和 2^31-1 比较 return sign * result这段代码覆盖了空串、正负号、非法字符、大小写虽然这里不涉及等问题代码量不大但显得很专业。在“字符串处理”类笔试中这种写法会比“假设输入都合法”的实现高一个档次。3.3 安全基础的速成路线从0到60分需要多久如果你不是安全专业出身安全基础怎么速成这里给一条经过验证的路线第一步搞清楚“漏洞三兄弟”SQL注入、XSS、CSRF。这三者是安全笔试中出现频率最高的漏洞类型。每个都弄明白三件事攻击原理是什么、有什么危害、怎么防御。建议用思维导图把攻击-防御链条画一遍记忆效率远超看十篇文章。第二步把加密和认证的基础打牢。AES/RSA/HTTPS、Session/Token/JWT这些概念理解它们的应用场景比背定义更重要。看到一个词能条件反射说出它的特征、优缺点、典型场景基本就过关了。第三步了解安全开发流程中的常见实践。比如输入校验、输出编码、最小权限原则。这些内容是软实力在选择题和简答题中不容易直接考但写编程题和面试聊项目时能体现你的安全素养。3.4 我踩过的坑给当年自己的一封信回顾我和身边同学的秋招经历有四个坑特别典型。坑一只刷算法不碰安全。很多人以为大厂笔试就是LeetCode拿号刷题就完事了。但安全厂商笔试最核心的区分度恰恰在安全基础这部分的分数靠的是知识储备不是临场刷题能弥补的。坑二编程题写完不检查。笔试环境里不给你跑测试用例的机会很多时候就是手写代码。我见过不少同学思路完全对但边界条件没考虑导致整个代码在某些输入下崩溃。建议每道编程题写完自己在脑子里过三组测试用例正常输入、空输入、极端输入。坑三多选题当单选题做或者反过来。2020年这套卷子有多选题选少选多都不得分或得一半分。很多人看到“以下哪些选项正确”下意识只挑最把握的那个浪费了大量本可以拿到的分数。备考时就要明确如果是“少选得部分分”规则能排除的错误项越多就尽量多选。坑四时间分配失控。在一道选择题上死磕10分钟导致后面送分题没时间做。遇到不会的果断跳过回头再来这是笔试里最重要的考试技巧没有之一。4. 实操过程回顾从笔试到面试的完整链路笔试只是秋招的第一步但笔试成绩直接决定了你有没有后续。奇安信2020年的流程大致是网申投递 → 在线笔试 → 技术面试 → HR面试 → Offer。笔试通过后面试官手里会拿着你的笔试答卷来提问——这一点很多人忽略了。4.1 笔试答卷会成为面试素材别写完就丢有同学问我“笔试考完就结束了吗”不是的。奇安信这类安全厂商技术面试官多少都会看一眼你的笔试答卷聊着聊着就可能抛出“你笔试里那道XSS防御怎么写的能展开说说吗”这类问题。所以笔试结束后一定要把自己写的代码和答案拍照或截图存档。我当年就是没留底面试时被问到编程题的思路只能凭记忆复述磕磕绊绊印象分就打了折扣。所以这里有个具体建议笔试结束后把关键编程题的代码重新整理一遍把选择题里拿不准的知识点重新过一遍。这不仅能帮你应付面试追问本身也是一次高效复盘。4.2 技术面试高频追问笔试之后才是硬仗如果你的笔试过了那恭喜你。但技术面才是真正拉差距的地方。根据2020年上岸同学的反馈奇安信的技术面通常有两轮常见问题集中在项目经历中遇到的最棘手问题是什么如何排查和解决对安全产品研发流程的理解比如SDL安全开发生命周期一个具体的安全问题场景设计一个简单的登录接口你会怎么防暴力破解数据结构和算法的追问比如哈希表冲突怎么解决红黑树和AVL树的区别尤其要留意的是上面的登录接口场景题。正常回答可能是“加验证码”“加失败次数限制”“加锁定时间”但站在安全厂商的视角还需要补充用户密码不能明文存储要用加盐哈希如bcrypt、scrypt、PBKDF2登录日志要记录IP、User-Agent、时间便于事后审计接口要加限流Rate Limit防止撞库攻击考虑是否需要多因素认证MFA这些点如果能在面试中主动说出来效果远好于面试官问一句你答一句。4.3 简历与笔试的知识点如何衔接笔试是知识面的检验面试是思维深度的检验。如果你简历里写了“研究过Web安全”或“熟悉漏洞原理”那面试官一定会往深了问。我建议简历里涉及的技术点一定要能画出一条“为什么这样用”的逻辑链。比如你写“熟悉Spring框架”那就要准备好回答Spring Security的过滤器链是怎么工作Session固定攻击怎么防不熟悉的安全点宁可少写也别硬写。另外奇安信作为安全厂商最看重的是你对攻击者和防御者两侧的理解。面对一个漏洞你不只要知道“它会带来危害”更要能从攻击者视角还原攻击路径再给出防御方案。这个思维模型如果能在笔试和面试中贯穿始终你会被明显认为是“有安全sense的人”。5. 2020年试卷带来的长期启示安全研发岗的能力模型这套卷子虽然已经是几年前的了但它代表的能力模型在今天依然适用。我不妨说一个更宏观的判断安全软件开发岗的竞争力不在“开发”和“安全”的任何一个单点上而在两者的交集处。这个交集具体来说有三层第一层扎实的编程功底。这不只是算法题能AC还包括代码风格、边界处理、异常捕获、日志规范。安全产品一旦出问题影响的是整个防护体系的可靠性所以代码质量要求非常高。第二层广博的基础知识。网络、操作系统、数据库、Linux这些是研发的底座也是理解攻击原理的基础。没有这些底座你连攻击流量都看不懂更别说写防护规则了。第三层攻防对抗的思维方式。这是安全公司软件研发岗区别于普通研发最核心的一点。你在设计一个功能时不是只问“怎么实现”还要问“如果我是攻击者我会怎么绕过这个实现”。有了这层思考你的代码天然会加上输入校验、权限校验、审计日志而这种代码正是安全产品需要的。如果2020年这套卷子能带给你什么长期价值我觉得不是那些具体的题目而是让你提前看清楚了安全研发这个岗位需要的是“一专多能”的T型人才——在软件开发上要有深度在安全知识和技术广度上要有覆盖面。按照这个方向去积累无论笔试怎么变你都能站得住脚。5.1 给未来考生的最后几条经验最后我把当年踩过坑之后总结的经验放在这里算是给准备投安全厂商开发岗的同学一份备忘录一定要提前研究目标公司的技术方向和产品线。奇安信做防火墙、终端安全、态势感知那你就重点看网络攻防、终端检测、大数据分析这些方向的知识储备。编程题备考以“经典高频 字符串处理 数组操作”为主同时要主动练习在不调试环境下手写代码的能力。安全基础不能临时抱佛脚至少提前一个月开始积累从OWASP Top 10入手理解每个漏洞的攻击和防御。笔试时要抱着“给面试官留下好印象”的心态来写答案代码注释、结构清晰度、异常处理细节都值得多花几秒钟。考完一定留存答卷面试前重新检查一遍押一押面试官可能追问的点。我在实际备考中的体会是笔试从来不是单纯的做题它更像一次“能力画像”目标公司通过这张卷子在最短时间里判断你适不适合做安全研发。你看懂了这一点自然就知道该往哪个方向使劲了。