ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

奇安信软件开发岗笔试拆解:安全思维如何贯穿秋招试卷

奇安信软件开发岗笔试拆解:安全思维如何贯穿秋招试卷 每年秋招奇安信的软件开发卷总能劝退一批人。不是题目本身难到做不出来而是它的考法跟互联网大厂不太一样。很多同学拿着刷 LeetCode 的手感去考结果在选择题和简答题上栽了跟头。奇安信毕竟是做安全起家的它的软件开发岗位笔试表面上考的是计算机基础实际上是在筛“有没有安全思维”的开发者。这篇东西就把我对这套试卷的观察和拆解写出来给后面准备秋招的人做个参考。如果你是准备投奇安信软件开发岗的应届生或者想了解安全厂商笔试跟普通互联网公司有什么区别这篇文章值得看完。我会从试卷结构、各模块考点、典型题目思路、备赛时间线几个维度展开也会穿插一些我在实际做题和面试里总结出来的教训。1. 奇安信这套卷子到底在考什么1.1 试卷结构长什么样先说结论奇安信软件开发方向的笔试整体风格比字节、腾讯那种“全算法”路线要传统得多题型更杂覆盖面更广。以2020年秋招为例整套卷子大致由四部分组成选择题、简答题、编程题、场景设计或安全分析题。不同岗位方向可能略有调整但大框架基本稳定。我根据自己的记忆和面试交流整理了一个大概的模块分布模块大致题量分值占比考察内容计算机基础选择题20-30题30%左右网络、操作系统、数据库、编译原理、数据结构编程与算法题2-3题30%左右手写代码、数据结构操作、字符串处理、边界条件安全常识与设计题5-10题20%左右安全漏洞原理、防护方案、安全开发意识简答题2-3题20%左右概念解释、方案设计、项目相关问题这个比例不是绝对固定但能看出来一条主线它不是要把你考成 ACM 选手而是想确认你有没有扎实的计算机基础同时有没有安全厂商特别看重的“风险意识”。换句话说LeetCode 刷得飞起只能保证你在算法题不吃亏前面那些选择题和简答题才是真正拉开差距的地方。1.2 为什么安全公司要考这些很多同学不理解安全公司的软件开发岗为什么笔试里不全是安全题反而有一堆计算机网络、操作系统、数据库的内容。我一开始也有这个疑惑后来在面试里跟面试官聊过才想明白安全不是凭空长出来的它是寄生在系统、网络、应用之上的。一个开发者如果连 TCP 握手过程都说不清楚连进程和线程的区别都含糊那他写出来的代码即使能跑也大概率会在边界条件、资源管理、异常处理这些地方埋雷。安全开发的核心是“默认不安全处处要校验”。你写的每个接口、每个文件操作、每条 SQL都是攻击面。如果基础不牢你连攻击面在哪里都看不见。所以这套卷子其实是在用一种很朴素的方式告诉你想进安全厂商做开发先证明你是合格的后端或客户端工程师再谈安全。2. 基础模块网络、操作系统、数据库2.1 网络协议题不是背一遍就行计算机网络在选择题里几乎必考而且考法很细。TCP 三次握手、四次挥手的状态变迁、HTTP 状态码语义、DNS 解析过程这些都是常见考点。但奇安信的题不会只问你“三次握手是哪三次”它会把场景揉进去。举个例子我印象里有一类题目是这样出的一个客户端访问一个不存在的域名大概经历了哪些步骤最后浏览器报什么错。这种题表面考 DNS实际考的是你对整个网络栈的理解。你需要在脑子里走一遍完整链路先查浏览器缓存、 hosts 文件、本地 DNS 解析器、根服务器、顶级域服务器、权威服务器然后才是 TCP 连接和 HTTP 请求。中间每一步失败会返回什么报错长什么样都是考点。另一个高频点是 HTTP 状态码。别只记 200、404、500像 301、302、304、401、403、502、504 这种状态码的区别和典型场景选择题里翻来覆去地考。尤其是 301 和 302一个是永久重定向一个是临时重定向涉及到浏览器缓存行为和 SEO 语义后端开发经常会用到。如果你觉得没底建议我把这几个状态码整理成一个表状态码含义典型场景301永久重定向域名变更、HTTP 跳 HTTPS302临时重定向未登录跳登录页、活动页304未修改使用缓存静态资源协商缓存401未认证缺少登录凭证403禁止访问权限不足但已认证502网关错误反向代理后后端不可用504网关超时后端响应超时这种表不是让你死背而是要能在场景里选对。比如一个接口突然从 http 跳到了 https状态码应该是 301 还是 302答案是 301因为这是永久性的策略变更。再比如你访问一个接口返回 403但你已经登录了说明什么多半是角色权限不够而不是登录失效。这些细节在选择题里很容易设置干扰项。2.2 操作系统和并发题怎么答操作系统模块的重点集中在进程和线程、死锁、内存管理、文件描述符。奇安信的题里进程与线程的区别几乎是必考但问法很刁。它不会让你简单罗列而是给你一个具体场景比如“多线程程序里一个线程崩溃会不会导致整个进程退出”或者“多进程共享数据有哪些方式多线程呢”。我见过一道很有代表性的选择题父子进程之间继承了什么不共享什么。很多同学会选错因为进程 fork 之后子进程拿到的是父进程页表拷贝内存空间独立文件描述符表共享底层打开文件描述但标准的答案是“内存空间不共享文件描述符共享”。这种题就是考你底层模型的掌握程度而不是背概念。死锁也是高频点。四个必要条件互斥、持有并等待、不可剥夺、循环等待。选择题通常会给四个场景问你哪个不是死锁产生的必要条件或者给你一段并发代码问你会不会死锁。答题的时候注意区分“互斥”和“竞争”的关系有竞争不一定死锁只有四个条件同时满足才可能死锁。简答题偶尔会考“如何避免死锁”答案是破坏其中的一个条件比如资源排序加锁、超时重试、银行家算法这类题只要原理说清楚就行。还有一个容易忽略的考点是协程。奇安信校招里有些岗位偏服务端会问到协程和线程的区别。协程是用户态调度的轻量级调度单元切换开销小适合 I/O 密集场景线程是内核态调度适合 CPU 密集和并行场景。这个点如果简历里写了 Go 或者 Python asyncio面试时一定会追问笔试里也会以选择题形式试探。2.3 数据库题从范式到 SQL 注入数据库选择题主要考三块SQL 语法和执行顺序、索引原理、事务隔离级别。SQL 执行顺序是个经典坑很多人写 SQL 很熟练但问你执行顺序就懵。正确顺序是FROM确定数据源WHERE过滤行GROUP BY分组HAVING过滤分组SELECT投影列DISTINCT去重ORDER BY排序LIMIT/OFFSET分页这个顺序决定了你写的 SQL 能不能跑以及 where 和 having 能不能互换。奇安信的题不会单独考这个但会在 SQL 注入相关的题里藏执行顺序。比如一个查询加了 group by但是 where 里用了聚合函数这就是非法的。你如果对执行顺序没概念很容易选错。事务隔离级别也是必考点。读未提交、读已提交、可重复读、串行化四种隔离级别分别解决脏读、不可重复读、幻读。MySQL 默认是可重复读但可重复读下仍然可能出现幻读InnoDB 通过间隙锁来解决大部分幻读场景。这块不但笔试考面试也更爱问。我建议你把每种隔离级别能避免的问题和不能避免的问题都列出来别只记名字。数据库还有一个隐藏考点是 SQL 注入。奇安信作为安全公司至少在选择题或简答题里会问“如何防护 SQL 注入”。常规答案就是预编译加参数化查询、白名单校验、最小权限原则、过滤危险关键字。但注意在笔试里只答“预编译”可能不够你要说明为什么预编译能防注入因为参数与 SQL 语句模板分离参数不会再被拼接为可执行代码。这个“为什么”才是安全公司想看到的。3. 算法与手写代码保住基础分3.1 笔试判卷眼中的“能跑”和“不能跑”编程题是很多人的主战场但奇安信的编程题并不追求高难度更看重完成度和代码质量。我做过好几个安全厂商的笔试普遍风格是题目描述比较务实比如实现一个字符串过滤、一个 LRU 缓存、一个二叉树遍历或者一个带边界检查的文件路径解析。这类题你可能在 LeetCode 上做过原题但笔试环境有几点和本地刷题不同。第一没有自动补全所有结构体、头文件要自己写。第二判题系统只关注样例是否通过但人工阅卷会看代码风格。第三边界条件检查和空指针处理是安全公司格外看重的。你写一个函数如果入参是空指针你直接解引用这在普通公司可能只是扣点分在安全公司眼里就是“没有防御性编程意识”印象分会很差。所以我的建议是写代码之前先花一分钟思考输入边界。字符串有没有可能为空数组长度会不会是 0数字会不会溢出文件路径会不会带 ..这些边界条件处理好了哪怕算法不是最优至少给阅卷人的感觉是“这个人能写生产代码”。3.2 必须拿下的三张算法脸编程题高频题型我总结下来就三类链表、字符串处理、Top K 或排序。别小看这三类它们覆盖了大部分笔试。链表题最经典的是反转链表、判断链表是否有环、合并两个有序链表。这种题看似简单但手写时很容易在指针移动上出错。我建议你准备一个模板比如反转链表用迭代法三个指针 prev、cur、next 循环移动边界条件注意 head 为空或只有一个节点。如果你用递归要理解返回值是反转后的新头否则很容易写成死循环。字符串处理题更贴近工程比如“给定一个文件路径规范化它去掉多余的斜杠和 ..”。这题就是 LeetCode 的 Simplify Path也是奇安信这类安全公司喜欢考的因为它跟路径遍历漏洞直接相关。实现方法是用栈处理路径片段遇到 .. 就弹出遇到空片段或 . 就跳过。这个题的代码量不大但你要把栈的出入时机写对。如果路径是绝对路径和相对路径初始栈的状态还不一样这种细节就很容易丢分。Top K 类问题比如“从海量整数中找出前 K 大的数”最优解是堆排序时间复杂度 O(n log k)。但笔试里你直接用数组排序再取前 K 个如果 K 比较小或者数据量不大其实也能过。关键是你能不能写出建堆、调整堆的代码。如果堆不熟我建议你用快速选择算法写起来短但要小心极端情况退化到 O(n²)。安全起见笔试现场还是优先用稳定的 sort 再取切片先把用例跑通再说。3.3 安全场景代码题路径遍历和输入校验这部分是奇安信试卷的特色。普通的软件开发卷只考“实现一个功能”奇安信会考“实现一个安全的版本”。比如让你写一个文件下载接口接收 filename 参数从某个目录读取文件返回给客户端。这题表面是文件操作实际考的是路径遍历防护。路径遍历的漏洞原理很简单攻击者传入../../etc/passwd把路径逃逸出根目录读取任意文件。如果你的代码直接拼路径open(base_dir filename)那就炸了。安全的写法要先规范化路径然后检查最终路径是否以 base_dir 开头。代码可以写成import os def safe_read(base_dir, filename): full_path os.path.realpath(os.path.join(base_dir, filename)) base_path os.path.realpath(base_dir) if not full_path.startswith(base_path os.sep): raise ValueError(invalid path) with open(full_path, rb) as f: return f.read()这里关键有两点用realpath解析掉..和符号链接再用前缀判断限制目录范围。你可能会说为什么不用abspath因为如果 base_dir 本身是符号链接abspath不会解析符号链接realpath会。这个细节写出来阅卷人会高看你一眼。输入校验也是安全代码题的重头戏。比如让写一个函数判断用户输入的邮箱是否合法。大部分人会直接用正则但正则写不好容易出问题要么校验过松要么引发灾难性回溯。更好的做法是先用长度限制再做格式校验甚至通过解析器来验证。虽然简单题用正则也能过但你可以在注释里说明“这里假设输入长度上限为 100避免 ReDoS”这个思路比代码本身更值钱。4. 安全常识与选择题拉开差距的地方4.1 安全基础题的高频范围安全常识题对很多没有安全背景的同学来说是完全陌生的但它恰恰决定了你能不能过笔试。高频考点集中在几个经典漏洞XSS、CSRF、SQL 注入、SSRF、文件上传、路径遍历、越权访问。你不一定需要深入漏洞利用但至少要理解漏洞产生的原因、危害和修复方案。XSS 要分三类记反射型、存储型、DOM 型。反射型需要用户点击恶意链接非持久化存储型把 payload 存进服务端其他人访问就触发危害最大DOM 型在前端修改 DOM 时触发不经过服务端。修复方案的核心是输出编码和输入过滤富文本场景还要用白名单过滤标签。CSRF 的考点更容易混淆。它利用的是用户的登录态伪造请求让用户执行非预期操作。修复方案常见有三种CSRF Token、SameSite Cookie、校验 Referer/Origin。这里要注意 CSRF 和 XSS 的区别XSS 是信任用户输入导致的脚本执行CSRF 是信任浏览器请求导致的伪造操作。选择题里经常把这两个混在一起设置选项你脑子里要有清晰的对比。SSRF 这块安全厂商特别看重因为它通常出现在服务端请求外部资源的场景比如图片代理、URL 抓取。攻击者传入内网地址让服务端去访问内网资源从而探测内网。修复方案是限制目标地址为公网 IP并校验 DNS 解析结果禁用重定向。这类题在奇安信笔试里出现的概率很高因为它的安全产品就经常要处理这类攻击。4.2 奇安信产品线相关的常识笔试里偶尔会出现跟奇安信自家产品、安全事件相关的选择题用来判断你对公司的了解程度。我当时准备的时候专门把奇安信的主要产品线过了一遍。天擎是终端安全管理系统有主机防护、资产管理、漏洞管理这些能力天眼是威胁监测与分析平台代码卫士是源代码安全审计工具网站卫士是云 WAF。不用太深但至少看到产品名字要知道它属于哪个方向。这类题不会难更多是送分题。比如问“下面哪个产品属于终端安全类”四个选项里混了天擎、天眼和其他竞品你能认出来就得分。如果你完全没了解过只能猜。所以我建议投简历之前花半小时浏览一下奇安信官网上产品中心把主要产品的定位记住笔试不吃亏面试也会加分。4.3 选择题里的坑选择题的坑主要在“绝对化表述”和“偷换概念”。比如“只要对用户输入做了过滤就不会被 SQL 注入”这种选项百分之百是错的因为过滤不是根本方案参数化查询才是。再比如“HTTPS 可以防止所有中间人攻击”也是错的HTTPS 只能防窃听和篡改防不住钓鱼和证书被信任问题。安全领域里没有银弹所有“一定”“百分百”的表述基本都值得怀疑。另一个坑是选项之间高度相似只在细微处不一样。比如“跨站脚本攻击”“跨站请求伪造”“服务端请求伪造”三兄弟名称缩写像原理完全不同。做题时先看攻击链条是用户输入进 HTML是伪造请求还是服务端主动发请求这条逻辑链能帮你快速排除干扰项。简答题里也常见送命题“谈谈你对安全开发的理解”。这题不要泛泛而谈一定要把安全左移、SDL软件安全开发生命周期、威胁建模这些关键词说出来再结合自己熟悉的开发流程举个例子。比如你可以在 CI/CD 里接入代码审计工具在 code review 时关注输入校验和错误处理。这种答案既专业又落地比贴大词强得多。5. 备赛时间线与实战建议5.1 八周复习安排如果你现在离秋招还有两三个月时间很充裕。我建议按八周来规划前四周过基础中间两周刷题最后两周做模拟和查漏补缺。第一周到第四周主要任务是把计算机基础补扎实。网络、OS、数据库三门课每天抽两小时按章节过。不要直接背八股而是结合问题去理解。比如学 TCP 就抓着一个问题问为什么挥手需要四次因为被动关闭方可能还有数据要发所以要分开确认。学进程就追着问进程和线程到底共享了什么资源这样带着问题学记忆深刻笔试简答题也答得上来。第五周到第六周集中刷题。LeetCode 上按标签刷数组、链表、字符串、二叉树、堆、动态规划每个标签刷 20 道左右不求多但求能手写出模板。这个阶段要注意限时训练一道中等题控制在 25 分钟以内否则笔试现场时间容易不够。第七周开始做模拟题。找一些牛客网或者历年校招真题按照真实笔试的时间和环境走一遍。重点不是做对多少而是培养节奏感。有些同学前面选择题抠太久导致后面编程题只剩十几分钟这是最亏的。碰到没思路的题先标记跳过别死磕。5.2 线上笔试系统要注意的细节奇安信秋招笔试一般是线上进行用的系统可能是牛客或者其他第三方平台。有几个细节要提前确认好。浏览器兼容性。有些笔试系统只支持 Chrome提前装好更新到最新版。摄像头监控需要授权别考试时被系统拦截。网络环境当然要稳定但更重要的是提前测速。我见过有人考试时突然断网虽然系统一般能续答但心态直接崩了。代码编辑器方面有些平台支持多种语言但没有本地调试。你要对自己的代码能力有信心写完仔细检查语法。平时练习时不要依赖 IDE 的自动补全和语法提示多用手写或简单文本编辑器模拟真实环境。另一个容易被忽略的是输入输出格式。很多笔试不是让你实现一个函数而是让你从标准输入读数据处理完再输出。如果你不熟悉cin 、printf或sys.stdin.readline()的细节很容易在 IO 上卡壳。5.3 笔试之后的面试衔接笔试只是第一关奇安信的面试通常会参考笔试结果问得更多。我在面试里就被问过“你笔试那道路径遍历题如果用户传入的是 Unicode 编码的斜杠怎么办”。这是个非常现实的追问因为路径校验的坑远不止..。这类问题其实没有唯一答案面试官想看你的思考链路。你可以说先做 Unicode 规范化把变体字符映射成标准斜杠再做合法性校验同时用realpath解析最终路径确保不逃逸目录最后用操作系统级别的访问控制兜底。这里考察的不只是安全知识还有你对生产系统防御深度的理解。准备面试时把你笔试做错的题都复盘一遍。尤其是选择题里那些模糊的概念面试官很可能直接拿出来问。笔试阶段记不清的地方面试时就是照妖镜。我当时就因为在笔试里把 CSRF 和 SSRF 搞混了面试被追问了一轮非常狼狈。所以笔试结束不是终点把每道错题变成知识点才算真正把这套卷子吃透。最后再分享一个我在实际笔试里养成的习惯分配时间时给编程题留足 45 分钟以上选择题最多一题一分钟。奇安信的卷子题量不小如果前面东抠西抠后面代码题很容易仓促收尾。而这类公司的编程题虽然不算难但代码质量直接影响进面试后的评价值得你把所有精力集中在上面。准备秋招本身就是场信息战方向对了努力才不会白费。
返回列表