
奇安信2019春招笔试算是国内安全厂商校招里很有代表性的一次考试。当年我刷完这套题最大的感受是它不像一般互联网公司那样只考算法而是把安全基础、网络协议、编码能力放在一张卷子里一起考时间紧、题量大、覆盖面广。如果你准备的是安全方向的校招这套题很值得用来做一次全面自测——它基本能反映出你在“安全基本功”上是否有硬伤。这篇文章我会从出题人的视角把2019春招笔试一拆开来聊重点说清楚每类题到底在考什么、为什么这么考、以及遇到类似题型时怎么下手。没有官方答案的部分我会基于常见实践给出合理的解题思路和参考实现希望能帮你少走弯路。1. 盘点整套笔试题的考点设计与筛选逻辑1.1 笔试题型结构与时间分配整套试卷大致分为三类编程题、安全基础选择题、综合分析与简答。编程题通常占40%左右的分值安全基础占40%综合分析占20%。这个占比本身就透露了一个信息——奇安信筛选的不只是“会做题的人”而是“既懂安全原理又能把原理落地成代码”的人。时间分配上笔试总时长一般是120分钟。如果先做编程题容易在前半段消耗大量精力导致后面安全基础题草草作答。比较稳妥的策略是先花15到20分钟快速做完自己有把握的安全基础选择题再留60到70分钟给编程题最后用剩余时间做综合分析题。当年我在编程题上卡了太久结果综合分析题只写了半段回头复盘时发现那题其实不难纯粹是被时间安排坑了。1.2 从题目反推岗位能力模型从这套笔试题能明显看出奇安信对安全工程师的基础能力期望大致可以拆成四层第一层是网络协议与操作系统基础比如TCP三次握手、Linux文件权限、进程与端口的关系这些是排查问题的基础。第二层是Web安全基础比如SQL注入、XSS、CSRF、文件上传绕过这是安全圈最常见的攻击面。第三层是编码与算法能力体现在编程题里主要考字符串处理、数据结构、边界条件处理。第四层是安全思维体现在综合分析题里比如给你一个攻击场景让你设计检测规则或应急响应方案。我后来面试时和面试官聊过他们的说法是“笔试主要刷掉基本功不扎实的人。”也就是说笔试不是用来选天才的而是用来确认你“能干活”的。所以备考时不要只刷LeetCode还要把TCP/IP、HTTP协议、常见漏洞原理这些基础重新过一遍。2. 编程题解题思路与参考实现2.1 字符串解析类考的是边界条件处理2019春招笔试一里的编程题我印象比较深的一道是给定一个URL字符串要求解析出协议、域名、端口和路径。这题看起来简单实际考查点却很细。常见的做法是用正则表达式提取也可以手写状态机来解析。但这道题的陷阱在于URL里可能包含认证信息user:passhost、默认端口省略、IPv6地址、空路径等特殊情况。如果只考虑到“http://host:port/path”这种标准格式测试用例里有一半过不了。参考实现思路如下用Java举例public class UrlParser { public static void main(String[] args) { String url http://user:pass192.168.1.1:8080/index.html?query1; UrlInfo info parseUrl(url); System.out.println(info.protocol); System.out.println(info.host); System.out.println(info.port); System.out.println(info.path); } static UrlInfo parseUrl(String url) { UrlInfo info new UrlInfo(); // 先去掉认证信息部分 // 注意 符号可能在路径中所以取最后一个 int atIndex url.lastIndexOf(); String withoutAuth url; if (atIndex -1 atIndex url.indexOf(://)) { withoutAuth url.substring(atIndex 1); } // 解析协议 int colonIndex withoutAuth.indexOf(://); if (colonIndex -1) { info.protocol withoutAuth.substring(0, colonIndex); withoutAuth withoutAuth.substring(colonIndex 3); } // 剩余部分可能是 host:port/path 或者 host/path int slashIndex withoutAuth.indexOf(/); String hostPart withoutAuth; if (slashIndex -1) { hostPart withoutAuth.substring(0, slashIndex); info.path withoutAuth.substring(slashIndex); } // 解析 host 和 port注意 IPv6 格式 [::1]:8080 if (hostPart.startsWith([)) { int bracketEnd hostPart.indexOf(]); info.host hostPart.substring(0, bracketEnd 1); if (bracketEnd 1 hostPart.length() hostPart.charAt(bracketEnd 1) :) { info.port Integer.parseInt(hostPart.substring(bracketEnd 2)); } else { info.port 80; } } else { int portIndex hostPart.lastIndexOf(:); if (portIndex -1) { info.host hostPart.substring(0, portIndex); info.port Integer.parseInt(hostPart.substring(portIndex 1)); } else { info.host hostPart; info.port 80; } } return info; } static class UrlInfo { String protocol; String host; int port; String path; } }这个写法考虑了几个关键点认证信息里也可能包含 所以要取最后一个 路径里可能包含冒号所以要用最后一个冒号来切分端口IPv6 地址的 host 要用方括号包裹。这些细节不实际跑一遍测试用例是想不到的所以笔试前应该针对性练习常见的字符串解析题尤其是处理特殊输入。2.2 安全场景模拟类编程题日志分析与异常检测另一类编程题让我印象很深它模拟了安全运营场景给定一份访问日志每行包含IP、时间、URL、状态码要求统计出访问次数最多的前N个IP并过滤掉状态码为404的请求。这类题的本意不是考算法而是考在大数据量下如何高效处理。最简单的思路是HashMap统计遍历所有日志行一次循环统计完所有IP出现次数再用优先队列或排序取前N个。如果日志文件特别大比如几个GB还应该考虑用多线程分片处理或者用外部排序。参考实现Python版本便于快速验证from collections import Counter import re def top_n_ips(log_file, n10): counter Counter() pattern re.compile(r(\d\.\d\.\d\.\d).*? (\d{3}) ) with open(log_file, r, encodingutf-8) as f: for line in f: match pattern.search(line) if match: ip match.group(1) status int(match.group(2)) if status 404: continue counter[ip] 1 return counter.most_common(n)这里我特意加了正则表达式来提取IP和状态码而不是用split因为日志行的格式可能不固定有些字段可能缺省正则匹配更健壮。另外要注意日志文件可能是GB级别逐行读取比一次性load进内存稳妥得多。这类题目告诉我们的道理是安全工程师写代码重点不是炫技而是在资源受限的情况下稳定处理脏数据。很多真实日志格式并不规整写解析脚本时一定要考虑异常情况比如IP字段为空、状态码不是数字、URL里有空格等每个异常都可能导致程序崩溃或统计不准确。3. 安全基础高频考点拆解与答题要点3.1 Web安全类考点漏洞原理与利用条件安全基础题里Web安全占了大头。2019年那批题目里反复出现的考点包括SQL注入的绕过技巧、XSS的三种类型区别、CSRF的防护机制、文件上传的校验绕过。以SQL注入为例题目常考的是给定一个用户登录的SQL语句问如何绕过登录验证。最常见的做法是 OR 11闭合查询条件。但笔试通常不只是考“能不能绕过”而是考为什么能绕过。答题时要写清楚参数拼接的过程SELECT * FROM users WHERE username admin AND password 123456如果输入用户名admin --则SQL变成SELECT * FROM users WHERE username admin -- AND password 123456--在MySQL中表示注释后面的密码校验被注释掉因此只需要知道用户名即可登录。回答这类题时写出拼接后的完整SQL语句比只写绕过payload更显专业因为这说明你理解漏洞根因而不是单纯背payload。XSS的考点通常是区分反射型、存储型和DOM型。很多同学会把“反射型”和“DOM型”搞混。关键区别在于反射型XSS的恶意脚本在服务端响应中直接返回DOM型则完全在客户端JavaScript中触发服务端响应中看不到任何恶意payload。笔试碰到这类选择题时优先看payload在HTTP响应中是否原样出现出现就是反射型或存储型存储型会持久化没出现就是DOM型。CSRF的防护机制也是高频考点选项里经常出现Token验证、Referer验证、SameSite Cookie属性、二次验证。答题时要注意CSRF防护的本质是“请求是否由用户主动发起”。Token验证是目前最常用的方案核心是服务端生成随机Token下发到前端页面提交请求时带上Token服务端比对一致才处理。而SameSite属性通过限制Cookie在跨站请求中携带也能有效缓解CSRF。如果题目问“哪项不能防护CSRF”通常答案是“JSONP”因为JSONP本身就是跨域获取数据的手段反而会扩大攻击面。3.2 网络协议考点从原理到抓包验证协议题几乎每次笔试都会出现最典型的是TCP三次握手。这类题看似简单但容易在变种题型上栽跟头比如问第三次握手失败后客户端会做什么答案是客户端进入ESTABLISHED状态服务端超时重传SYNACK达到最大重传次数后关闭连接。问SYN Flood攻击的原理核心是攻击者伪造源IP发送大量SYN请求服务端回复SYNACK后无法收到确认连接表被占满。再就是HTTP与HTTPS的混合考点。有一道题问HTTPS的加密过程先证书验证还是先密钥协商正确流程是先通过证书验证服务端身份再通过非对称加密协商对称密钥最终用对称密钥加密业务数据。很多人想当然地以为HTTPS全程都是非对称加密忽略了握手完成后数据加密用的是对称加密。笔试复习协议时我的建议是不要只背概念实操一把更有效。本地起一个Nginx服务分别用HTTP和HTTPS访问用Wireshark抓包对比看TCP握手、TLS握手、Application Data的阶段划分。抓过一次包之后很多概念比背十遍书都牢固。3.3 Linux与系统安全考点权限、进程与后门排查系统安全类的考题集中在Linux上。2019年这套题里出现过查看某个端口被哪个进程占用lsof -i:8080或netstat -anp | grep 8080。修改文件权限为只有所有者可读写执行chmod 700 file。排查系统里是否存在可疑后门检查/etc/crontab、/etc/rc.local、~/.ssh/authorized_keys。有个容易混淆的题是chmod 777和chmod 7777的区别。很多初学者以为7777只是多了一个数其实最高位是setuid/setgid/sticky bit的权限位。7777表示在777的基础上再设置setuid、setgid和sticky bit这在安全场景下非常危险因为setuid程序会以文件所有者的身份运行一旦被恶意利用就可能提权。笔试里如果问“哪种权限配置存在重大安全隐患”遇到7777就应该敏感。Linux后门排查是综合分析题的高频素材。答这类题时建议按“账号、计划任务、启动项、网络连接、文件特征”五个维度展开检查/etc/passwd中是否有UID为0的非root账户。检查/etc/crontab和用户crontab中是否有异常计划任务。检查/etc/rc.local、/etc/systemd/system/下是否有新增的启动脚本。检查netstat -anp里是否有非业务端口的对外连接。检查系统目录下是否有近期修改的可疑文件比如/tmp、/var/tmp下的恶意脚本。这样的回答结构清晰面试官会认为你有实际排查经验而不是只背了命令。4. 综合分析题的高分作答思路4.1 应急响应场景题从“给结果”到“给过程”综合分析题一般会给一个安全事件让你描述应急响应流程。常见的场景是某台服务器CPU占用率异常通过排查发现存在挖矿程序请描述处理过程。高分答案不能只写“杀掉进程、删除文件”而是要走完整流程隔离先断开服务器外网连接避免攻击者继续控制也避免挖矿程序持续消耗资源。取证用ps aux查看可疑进程记录PID、启动命令用lsof -p PID查看进程打开的端口和文件用ls -la /proc/PID/exe定位可执行文件路径。溯源检查计划任务、启动脚本、系统日志判断攻击入口——是Redis未授权、SSH爆破还是Web漏洞。清除杀掉进程、删除文件、清理计划任务和自启动项。加固修改所有密码、升级漏洞组件、配置防火墙白名单。关键是第3步“溯源”。很多人在回答时直接跳到“杀进程、删文件”忽略了“攻击者是怎么进来的”。真正的高分答案会强调如果找不到攻击入口杀完进程之后很快会被再次入侵。这就像家里进了小偷你把小偷赶走但不修门锁小偷半夜还会回来。4.2 安全方案设计题权限最小化与纵深防御另一种综合分析题是设计类给一个业务系统要求设计安全加固方案。这类题没有标准答案但评判标准很清晰是否体现了“权限最小化”和“纵深防御”原则。比如题目说一个Web应用部署在Linux服务器上数据库在另一台服务器请设计访问控制方案。一个层次分明的回答是网络层数据库服务器只对Web服务器的内网IP开放3306端口使用安全组或iptables限制。系统层Web服务使用低权限用户运行不允许root直接启动禁用root远程SSH登录使用普通用户密钥认证。应用层数据库账号按业务拆分每个账号只授予所需库表的最小权限Web应用连接数据库时不使用root账号。数据层定期备份并加密存储备份文件备份数据与生产环境隔离。这样的回答覆盖了“网络层、系统层、应用层、数据层”四个维度每条都有具体措施一眼就能看出你具备体系化的安全思维。相反只写“装个防火墙、改个密码”之类的答案很难拿到高分。5. 常见题目陷阱与备考避坑指南5.1 高频陷阱总结出题人最爱埋的“坑”刷完这套题我总结了一个规律陷阱往往藏在“看似多余”的条件里。举几个2019年题目里常见的例子题目说“系统使用了PDO预处理以下哪项操作仍可能导致SQL注入”——很多人看到预处理就直接排除SQL注入但如果你用的是动态表名/列名拼接预处理也无济于事。答案是宽字节注入或表名列名拼接注入。题目说“该网站部署了WAF以下哪个请求能绕过WAF获取敏感信息”——考点是绕过WAF的编码方式比如双重URL编码、分块传输、大小写混淆。答题时不要只看“有没有WAF”要看WAF的解析和Web服务器的解析是否一致。题目说“用户提交的内容经过htmlspecialchars转义后存储是否还会存在XSS”——答案是需要分场景。htmlspecialchars默认只转义、、、、如果在JavaScript上下文中输出且没有做JS编码依然可能被构造出XSS。这题要求你仔细看输出位置是HTML上下文还是JavaScript属性上下文。我做题时的经验是把所有条件读完后先在草稿纸上画一遍数据流图——用户输入到了哪个函数、做了哪些处理、最后输出到哪个上下文。这样做能帮助你发现那些“看起来处理了、实际处理不到位”的环节。5.2 备考路线建议笔试前一个月怎么准备如果你现在准备类似的安全厂商笔试建议按以下路线来安排一个月的复习计划第一周主攻Web安全基础。把OWASP Top 10中每个漏洞的原理、攻击步骤、防御方式过一遍重点是SQL注入、XSS、CSRF、SSRF、文件上传。每个漏洞至少动手在本地靶场跑一遍比如DVWA或Sqli-labs确认自己能复现攻击并能看懂防御代码。第二周主攻网络协议和操作系统。把TCP三次握手、TCP四次挥手、HTTP请求响应结构、HTTPS握手流程吃透可以配合Wireshark抓包验证。Linux方面要熟练掌握ps、netstat、lsof、find、chmod、crontab等命令的常见用法。第三周集中刷编程题。重点练三类字符串解析URL、JSON、日志行、数据结构操作链表反转、二叉树遍历、算法思维滑动窗口、双指针。安全厂商的编程题难度通常低于互联网大厂一般不会出特别偏的算法但边界条件测试很严格宁可多花时间检查边界情况。第四周做套题模拟。找往年安全厂商的笔试真题严格按照120分钟时间完成模拟真实考试节奏。做完后重点复盘哪些题是时间不够没答完哪些题是知识点盲区把错题整理成一个清单考前最后一天只看这个清单。6. 笔试题背后的行业趋势与岗位发展思考6.1 从笔试风格看安全行业的用人标准变化2019年这套笔试题在当时的行业中反映了一个比较明显的趋势安全厂商不再满足于招“懂渗透工具”的人而是更看重基础功底和工程能力。编程题占比提升、综合分析题偏向应急响应场景说明企业希望新入职的员工能直接参与安全运营而不是进公司再从头教。这个趋势放在今天看其实更明显了。现在国内的安全厂商普遍要求工程师具备“开发安全”的复合能力尤其是做检测规则、写爬虫、做日志分析这类工作如果你连基本的编程能力都没有很难落地产出。笔试中持续保留编码题本质上就是在筛选这种复合能力。6.2 哪些能力是笔试考不出来的话说回来笔试能筛掉的只是基本功不达标的人真正决定你在安全行业能走多远的是笔试考不出来的能力主动学习的驱动力、面对未知攻击的推理能力、写文档和沟通的能力。我见过不少笔试分数很高的人入职后发现遇到真实攻击流量时依然一头雾水。原因在于笔试考的是“已知漏洞的正确答案”真实安全对抗永远是“未知漏洞的开放性答题”。所以如果你通过了笔试不要觉得万事大吉后续面试和试用期才是真正的考验。我自己当年从笔试到入职有一个很深的体会安全这个行业永远处于“学不完”的状态。今天流行的攻击手法明天可能就变异了今天刚修复的漏洞后天可能又出现了绕过方式。选择这个行业本质上是选择了一种持续学习的节奏。而一套笔试题只是这条路上的第一道门槛而已。最后分享一个小技巧笔试时如果遇到完全不会的题不要空着。安全基础选择题可以结合常识排除明显错误的选项综合分析题哪怕写不出专业术语也可以把自己排查问题的逻辑写下来。答题纸上留白才是真正的零分写了自己的思考过程至少还能拿到过程分。这在笔试中相当重要实际改卷时面试官真的会看你写了什么思路。