
1. 试卷整体结构与出题思路1.1 题型分布与分值结构先聊一个很多同学关心的问题一份校招安全开发工程师笔试卷到底长什么样我手头这份美丽联合2018校招的卷子结构其实很典型。试卷分四大部分基础知识选择题、简答题、代码审计与编程题、方案设计题。由于2018年那时候安全校招已经比较卷了这份卷子并没有停留在“背漏洞名词”的层面而是明显在往“真实工作能力”上靠。我当时拿到卷子的第一感受就是考的不是你认识多少漏洞而是你能不能在实际开发场景里把安全问题解决掉。从分值上看基础选择判断占30分左右简答题占35分左右代码审计和编程题占20分左右最后的方案设计大题占15分左右。这个比例对安全开发岗来说非常合理基础题筛选知识面简答题考察理解深度代码题检验动手能力方案设计题则直接模拟入职后的工作场景。很多同学栽在后面的代码题和方案题上因为前面靠背就能过后面必须真会写、真会分析。1.2 出题思路安全开发岗位到底要什么样的人我得先泼一盆冷水如果你按Web渗透测试、CTF打比赛的路子去准备安全开发岗笔试大概率会翻车。这两个方向看着都是“搞安全的”但考察逻辑差异非常大。渗透测试更关注“怎么打进系统”而安全开发更关注“怎么让系统没有洞”以及“出洞之后怎么快速修掉”。这份卷子最核心的出题思路可以用一个词概括开发安全闭环。什么意思安全不只是测试阶段的事而是要前置到需求评审、编码、测试、上线、运维的每个环节做完一环还要把结果反馈到下一环形成闭环。卷子里考SQL注入不是问你注入语句怎么写而是给你一段带漏洞的代码让你指出问题并给出修复方案考XSS也不是背反射型、存储型的区别而是问你输出编码应该放在哪个位置。这些题目背后都在考察同一个能力你懂不懂研发流程能不能用开发的思路解决安全问题。所以准备这份试卷的第一步不是刷题而是调整认知。你要把自己想象成一个“会做开发的甲方安全工程师”而不是一个“挑刺的黑客”。带着这个心态去解题很多题目就知道该往哪个方向答了。2. Web安全基础题目解析2.1 SQL注入考点从代码审计视角答题Web安全是安全开发笔试的绝对核心其中SQL注入基本上每一家都会考。这份卷子里有一道代码审计题大概长这样回忆版?php $id $_GET[id]; $sql SELECT * FROM users WHERE id . $id; $result mysqli_query($conn, $sql); ?题目要求找出漏洞说明原理给出修复代码。这个题本身不算难但很多同学答得很空只写“存在SQL注入需要用参数化查询”没有落到代码上。这道题我当时的答题思路是这样拆开的首先说原理$id直接拼接进SQL语句且$_GET[id]是用户可控的如果传入1 OR 11整个SQL就变成SELECT * FROM users WHERE id 1 OR 11导致查询出所有用户数据。攻击者还可以通过union查询去拖库危害非常大。然后给修复代码?php $id $_GET[id]; $stmt $conn-prepare(SELECT * FROM users WHERE id ?); $stmt-bind_param(i, $id); $stmt-execute(); $result $stmt-get_result(); ?这里重点不是把代码贴出来就完事而是要解释清楚为什么参数化查询能防注入因为使用预编译语句后用户输入被当作参数传入数据库引擎会先完成SQL语句的编译再绑定参数值输入中的特殊字符不会改变SQL语句的结构所以从根上杜绝了拼接注入。2.2 XSS与CSRF关注防御落点另一道高频简答题是关于XSS和CSRF的区别与防御。这类题看着基础但拿高分不容易关键在答题的“颗粒度”要够细。先说XSS题目往往给一个搜索功能页面让你评估风险并给出修复建议。要回答好必须按存储型、反射型、DOM型三种分别说清楚攻击路径然后对应防御方案输入校验但不建议靠黑名单、输出编码、CSPContent Security Policy。这里有个容易被忽略的细节输出编码的位置非常关键。比如在HTML标签内输出需要做HTML实体编码在JavaScript代码块内输出需要做JS编码在URL属性内输出需要做URL编码。位置错了等于没防。这道题我就特地把三种场景的编码位置列出来了阅卷时很加分。CSRF的防御核心是三个维度在关键操作上校验请求来源Referer、Origin、使用同步TokenCSRF Token、在关键接口上校验自定义请求头。其中Token的答题要点在于Token必须绑定用户会话每次会话随机生成服务端校验不能放在URL参数中也不建议放Cookie里因为Cookie会自动携带而是应该放在表单隐藏域或请求头里。我当时还画了个简单流程图文字描述形式说明攻击者构造恶意页面→用户带着Cookie发起请求→服务端误认为是用户本人的合法请求这个攻击链路写清楚答案就完整了。2.3 高频Web题汇总与答题要点基于这份卷子我把安全开发笔试里高频出现的Web考点整理成一个速查表方便大家备考时自查考点常见出题场景答题核心要点SQL注入代码审计、登录绕过参数化查询、最小权限原则、输入校验XSS评论功能、搜索框三大类型攻击路径、输出编码位置、CSPCSRF修改密码、转账接口Token绑定会话、Referer校验、SameSite CookieSSRF图片抓取、URL跳转内网地址拦截、DNS解析校验、白名单限制文件上传头像上传功能白名单扩展名、内容检测、随机文件名、目录权限命令注入系统命令执行场景参数白名单、命令逃逸、禁用危险函数反序列化对象传输与存储不接收不可信数据、加签名验签、性质检查这个表如果展开聊每个都能写一篇文章但备考时至少有两点要记住第一每个漏洞你都得能写出“攻击路径原理修复方案”三段式答案缺一段都不完整第二修复方案的颗粒度必须落到具体代码或配置上只说“做校验”“做过滤”这种空话基本不得分。3. 密码学、网络协议与主机安全基础3.1 密码学考得不深但要理解应用场景密码学在安全开发笔试里占比不大但每年都会出几道送分题丢了很可惜。这份卷子里出现过的题有MD5和SHA-1的存储密码为什么不安全AES和RSA的使用场景有何不同HTTPS握手过程简述。第一题几乎年年考。MD5和SHA-1的致命问题不是算法本身被完全逆向而是哈希速度太快攻击者可以对字典做快速计算用户弱口令很容易被离线碰撞出来。更糟糕的是很多系统直接对密码做一次哈希就入库两个用户密码相同哈希值也相同等于把用户之间的身份信息关联了。所以回答的正确姿势是使用bcrypt、scrypt或Argon2这类慢哈希算法或者至少先加盐随机盐每个用户不同再哈希并且推荐多次迭代增加计算成本。第二题考察对称加密与非对称加密的应用边界。AES是对称加密加解密用同一把密钥性能好适合加密大数据量内容比如文件内容、请求体RSA是非对称加密用公钥加密、私钥解密反之亦然性能差适合加密密钥本身、数字签名等小数据量场景。所以实际工程里的通用方案是“HTTPS混合加密”的思路用RSA协商出对称密钥再用AES加密实际的业务数据。这个逻辑在面试时也要能脱口而出。3.2 网络协议题不要只背三次握手网络协议的知识点在很多安全开发笔试里是“选做题”或“附加题”但这家公司把它放进了必答部分。题目涉及HTTP与HTTPS的区别、TCP三次握手、DNS解析流程。坦白讲这些是计算机基础课内容对安全方向来说出题人真正想看你的是“安全视角的解读”。举个例子HTTP与HTTPS的区别常规答案是“HTTPS多了一层TLS/SSL加密”但更安全的回答要往前再走一步HTTPS靠数字证书解决身份认证问题客户端通过证书链校验服务端身份防止中间人攻击TLS握手时会协商加密套件服务端可以选择支持的前向安全算法如ECDHE这能保证即使服务器私钥泄露历史通信内容也无法被解密。加这句阅卷人就知道你是真懂而不是背的。TCP握手也一样除了三次握手的过程安全视角的关注点是SYN Flood攻击就是利用三次握手过程中服务器需要为半连接分配资源这一特点发送大量伪造源IP的SYN包导致服务器资源耗尽。如果能在基础题里顺带写出这类攻击与防御SYN Cookie、限制半连接数等整个答案的层次立刻就上去了。3.3 主机与运维基础安全开发岗的隐形考点这块容易被忽视但笔试里经常通过一两道选择题或判断题暗戳戳地考。比如Linux下某个文件权限为-rw-r-----属主和属组分别拥有什么权限系统被入侵后通过哪个目录查看当前用户登录记录/tmp目录为什么不能设置成粘滞位缺失的状态我备考时是吃过亏的刚开始觉得安全开发嘛搞漏洞、写代码就行Linux权限这些算毛线。后来才发现安全开发工程师的实际工作里有大量场景需要懂系统基础日志审计要去看/var/log/secure、/var/log/auth.logWindows应急响应要看事件查看器里的登录日志加固服务器要懂GID、UID、文件特殊权限位。这些基础不牢后面做方案设计题时很容易漏掉关键的防护点。所以这部分我的经验是花一个周末把鸟哥Linux私房菜里的文件权限、用户与用户组、进程管理这几章过一遍笔试的基础分基本能保住。4. 安全编码、代码审计与编程题4.1 代码审计题一题就能看出真实水平这份卷子的代码审计题不是那种让你“找洞”的CTF题而是在一段看起来很简单的业务代码里埋了三四层问题考察的是实际工程中的漏洞修复能力。我记得有一道Java题目大概场景是一个文件下载功能伪码类似这样String fileName request.getParameter(filename); String filePath /data/files/ fileName; File file new File(filePath); response.setHeader(Content-Disposition, attachment; filename fileName); // ... 输出文件内容这道题的考点非常典型包含两个关键问题一个是路径穿越如果传入../../etc/passwdfilePath就会拼出/data/files/../../etc/passwd从而读取系统任意文件另一个是下载文件的Content-Disposition头没有对文件名做编码处理如果文件名包含换行符等特殊字符可能引发HTTP响应头注入。这里我想展开讲一下答题的心得。很多同学只会说“存在路径穿越漏洞”但能拿高分的回答需要做到三点第一完整描述攻击路径最好把恶意输入和拼接后的路径写出来证明你真的理解第二给出同时覆盖两层问题的修复代码而不是只堵其中一个洞第三补充说明修复后的代码还能不能处理正常的业务场景比如文件名需要保留原始文件名给用户下载但物理存储路径要改为不可预测的随机名。我当时给的修复思路是物理存储用UUID重命名文件用户下载的展示名单独用URLEncoder.encode处理并加白名单校验文件名不能包含路径分隔符和..。4.2 编程题安全工程师的代码能力要求编程题在2018年的校招笔试里就开始了现在更是标配。美丽联合这份卷子的编程题是给定一个访问日志文件统计每个IP的请求次数并按请求次数降序输出前10个IP。这个题难度不大但区分度很高。为什么我说区分度高因为很多人写出来的代码能跑但漏洞百出。用Python写的话正确做法是读文件、解析行、提取IP、用字典计数、排序输出。但安全开发的视角还会有几个加分项是否做了内存优化如果日志文件非常大一次性读入内存会爆掉正确的做法是逐行读入用生成器或with open()搭配for line in file一行一行处理是否有防御性编程比如日志行格式不规整、IP提取失败时代码会不会崩溃是否考虑了编码问题日志文件的编码不是UTF-8怎么办。把这些细节都处理好代码看起来就是“正经工程师”写的而不是“刷题选手”写的。我当时还在这道题里额外写了容错逻辑用正则表达式匹配IP格式匹配不到的行直接跳过并计数最后在控制台打印统计信息。这种做法在实际工作中非常实用相当于做了一个极简的访问来源分析脚本。安全开发工作的日常很大一部分就是写这种“看似不起眼但必须稳定可靠”的小工具笔试考察的就是这个基本盘。4.3 安全编码规范哪些考点是必拿的安全编码类题目的套路比较固定我把几年备考和面试下来觉得必考的几个点列一下输入校验永远不要信任用户输入所有外部输入都要校验。校验要采用白名单方式而不是黑名单。比如年龄字段就只允许数字而不是去过滤or 11这种关键字。输出编码数据从前端到后端、从数据库到页面每一层流转都可能引入注入所以输出到HTML、JSON、SQL、URL前都要做相应编码或参数化。认证与授权每个接口都要做身份认证与权限校验服务端不能信任来自客户端的“我是管理员”这种参数。权限校验越权漏洞IDOR在开发中非常常见。错误处理与日志异常信息不能直接返回给用户防止信息泄露但要在服务端记录详细日志方便溯源与排查。加密与密钥管理密钥不能硬编码在代码里要放进配置中心或密钥管理系统敏感数据在数据库里要加密存储传输过程中要用TLS。这些点不需要死记硬背只要理解“开发安全闭环”的核心理念安全是研发流程的一部分编码阶段就埋进去比事后补洞便宜一百倍。笔试考安全编码本质上是看候选人有没有这个意识。只要你在答题时体现出“每个环节都在考虑安全”的思维方式这部分的分数不会低。5. 方案设计题从应急响应到安全开发闭环5.1 典型的方案设计题长什么样方案设计题是整份卷子的大boss也是区分度最高的一道题。美丽联合考过这样一道场景题假设公司有一个面向用户的评论功能近期频繁出现恶意广告、辱骂内容、甚至是XSS攻击评论作为安全开发工程师请设计一套安全方案来解决问题。这类题的答题框架我总结了一个固定套路先评估风险面再分析资产和威胁然后设计纵深防御措施最后补充监控与应急响应机制。具体到评论功能这个场景我当时是按这个思路展开的风险面包括恶意内容、垃圾广告、XSS攻击、色情低俗内容、用户隐私泄露。资产是评论内容本身、用户个人信息、Web服务器、数据库。威胁模型分外部攻击者和恶意普通用户XSS攻击属于外部攻击者垃圾广告属于恶意普通用户。然后设计方案分为事前、事中、事后三层防御。事前在应用层做内容安全检测包括关键词过滤、图片审核、敏感信息识别、XSS内容转义事中限制评论频率、IP维度风控、账号维度风控、审核队列机制事后建立举报机制、定期巡检、恶意内容溯源。最后补充监控与应急响应对内容审核通过率、恶意内容上报量等指标做监控出现大规模攻击时启动应急响应预案封禁IP、下线恶意内容、通知受害用户。5.2 什么是“开发安全闭环”以及它的价值如果你去面试安全开发岗位这个热词几乎是必被问到的这里我也多说几句。“开发安全闭环”的核心是让安全能力贯穿软件开发生命周期SDLC而不是在测试阶段临时抱佛脚。一个标准的闭环是需求评审阶段做威胁建模识别可能引入的风险点编码阶段由安全编码规范约束配合IDE插件实时检查自测阶段运行静态代码扫描工具SAST测试阶段做动态安全测试DAST必要时引入渗透测试发布阶段做上线前安全评估配置安全规则运行阶段做基线核查、运行时防护和漏洞监测发现问题后反馈回需求池和修复流程重新进入下一轮迭代。这个闭环的价值在于把安全工作从“事后救火”转化为“事前预防过程中控制事后可回溯”。我在实际工作中见过太多把安全排查放在上线前两天的项目结果要么是上线延期要么是带病上线Bug和漏洞修都修不完。而买过“开发安全闭环”的公司通常会把一道安全卡点放进CI/CD流水线代码提交后自动跑SAST、自动检查密钥泄露、自动生成安全报告开发者收到邮件后再去修复。这样的一次修复成本比上线后被攻击或者被用户泄露数据要低几个数量级。方案设计题里如果能围绕这个闭环来组织答案阅卷官一眼就能看出你了解真实的安全开发流程而不是只会喊口号。所以这部分不是空谈理论而是要真的想清楚每个环节谁来做、做什么、怎么配合。笔试是这么考面试也是这么聊。5.3 答题时的“思维框架”与表达技巧方案设计题最怕的就是想到哪说到哪答完了一看乱成一团。我推荐一个万能框架识别Identify→ 防护Protect→ 检测Detect→ 响应Respond→ 恢复Recover。这其实是NIST网络安全框架的安全五大核心用在笔试题上非常合适。用这个框架答题好处有三点第一它符合管理者视角能体现你的全局思维不只是盯着某一个漏洞打转第二它天然具备逻辑递进从“有什么风险”到“怎么防”再到“被打了怎么办”阅卷时一目了然第三它可以灵活适配场景不管题目给的是评论功能、登录模块还是第三方接口你都能快速套用。当然框架只是骨架要拿高分还得往里填血肉。每个环节至少要给出两个具体可落地的措施最好能结合公司具体业务。比如登录模块的响应环节如果说“进行账户锁定”这只是起步更好的答案是“锁定前先进行风险评分如果IP可信且设备指纹正常可以只进行二次验证而不是直接锁定”这种细节才能让答案脱颖而出。我在面试环节也这样考察候选人能答出这种层次的人入职后基本不需要手把手带。6. 备考路线与常见误区6.1 我给准备校招的同学的学习路线很多同学私信问过我安全开发工程师的笔试到底怎么准备其实无外乎几个阶段按顺序推进效率最高。第一个阶段是打基础3到4周。把Web安全、密码学、操作系统、网络协议的重点知识梳理一遍不需要精通但要做到看到题目能知道考点在哪。参考资源我推荐OWASP Top 10、Cross-site scripting、SQL injection等经典的英文文档看不懂英文的直接看国内一些安全社区的中文翻译版也可以但注意校对时效性。第二个阶段是刷题加动手4到6周。这个阶段建议一边刷校招真题和CTF基础题一边在本地搭几个漏洞靶场DVWA、sqli-labs、WebGoat把漏洞从原理到复现再到修复都过一遍。这里的关键是“修”不是“打”你要能在靶场里写修复代码甚至把靶场源码改到没有漏洞为止这才是安全开发的训练方式。第三个阶段是模拟实战2周。按历年校招真题的形式自己卡着时间完整做一遍试卷尤其是编程题和方案设计题必须用笔和代码写出来不能只在脑子里想。模拟完找同学相互批改或者录下来复盘这一步非常能发现问题。6.2 人人都犯过、但最好别犯的备考错误备考安全开发笔试我见过的最大误区是“用渗透测试的思路准备安全开发”。有不少同学花大量时间刷CTF、学内网渗透、学免杀结果笔试里的代码审计题不会写编程题跑不出来方案设计题更是不知道从哪开始。不是说那些技能没用而是投入产出比太低了。安全开发岗位笔试的底层逻辑是“研发视角的安全”重心在编码能力、安全编码规范、开发流程里的安全卡点。CTF的解题思路适合安全研究员但应届生走安全开发岗先把“安全的开发能力”练好比什么都值。另一个常见问题是“只背不写”。我见过有人能把XSS的三种类型背得滚瓜烂熟但让他用Python写一个从日志里提取攻击IP的小工具半个小时都憋不出来。笔试毕竟是要动手的编程题、代码审计题、方案设计题哪一个都不是靠背能拿分的。我的建议是每个漏洞原理看完后都亲自写一遍攻击Payload、看一遍触发效果、再写一遍修复代码这个“一遍又一遍”的功夫最后都会体现在卷面上。最后还想提醒一点注意答题规范。卷子上的代码题题目要求的语言是Python就用Python要求写Java就别写JavaScript要求分析代码就分析代码不要扯一堆没用的背景方案设计题一定要分点论述宁可多写几个层次也别写成一段话。笔试阅卷是快速扫视的过程结构清楚、标题明确、代码规范的人一定比写得一团乱麻的占便宜。6.3 从笔试到入职安全开发岗位的真实日常说完备考再说点题外话。有些同学对这个岗位的日常有误解以为安全开发就是天天挖漏洞、打攻防。实际工作中我的一天通常包含处理同事反馈的安全告警给某个新上线的接口做安全评审推动某个遗留漏洞的修复写一个自动化检测脚本可能还要参加一个安全应急的电话会议。这些工作不难但对综合能力要求很高既要有技术底子能定位问题又要有沟通能力能推动别人配合更重要的是要有一套完整的安全方法论来知道优先做什么。这套方法论其实就是“开发安全闭环”的落地版从需求阶段就开始问“这个功能有哪些攻击面”在编码阶段就按规范写代码在测试阶段用自动化工具扫一遍上线前做安全评估运行中盯监控告警漏洞出来能快速定位和修复并沉淀成下一次开发的改进项。谁越早建立这套闭环意识谁就越像一个真正的安全开发工程师而不是一个只会报漏洞的“扫描器”。我在实际面试应届生的时候遇到过很多基础知识很扎实的同学但一到“如果让你修复这个Bug你会怎么做”这种问题上就露怯了。所以无论你现在是刚开始准备还是已经刷了不少题都要有意识地进行角色转变你是一个要参与产品研发、为业务保驾护航的开发工程师安全是你职责的一部分而不是游离在外的另一份工作。带着这个认知去准备笔试你会发现答案的深度和广度都完全不一样。