滴滴 2016 研发工程师笔试题(五)(7 题)
点击「查看答案」展开答案解析。
来源: 牛客原题 | 题量: 7 题
第1题(问答题) 请解释下referer是什么,并任意描述一些与之相关的攻击场景或安全漏洞。
查看答案
要点 Referer 是 HTTP 请求头,标识请求来源页面 URL。 攻击场景:
- 信息泄露:URL 中带 token/敏感参数时,Referer 会泄露给第三方;
- 防盗链绕过:部分站点仅靠 Referer 校验防盗链,可伪造/置空绕过;
- CSRF 关联:依赖 Referer 做 CSRF 校验可被伪造或缺失绕过。
第2题(问答题) 分类列举sql注入常用判断方法?
查看答案
要点 按注入方式分类:
- 报错注入:输入单引号、
extractvalue/updatexml等触发报错回显; - 布尔盲注:
and 1=1/and 1=2观察页面差异; - 时间盲注:
sleep()/benchmark()观察响应延迟; - 联合查询:
union select判断列数(order by); - 堆叠注入:分号拼接多条语句。
第3题(问答题) 根据不同的维度,描述软件测试可以划分的种类。例如,根据软件的生命周期,我们可以将测试划分为:单元测试,集成测试,系统测试,验收测试…..请至少根据两种不同的依据,说出2-3软件测试方式。(不包含举例的内容)
查看答案
要点
- 按是否查看代码:黑盒测试、白盒测试、灰盒测试;
- 按是否执行程序:静态测试、动态测试;
- 按测试目的:功能测试、性能测试、安全测试、兼容性测试;
- 按测试阶段:单元测试、集成测试、系统测试、验收测试。
第4题(问答题) 有如下2个文件:test.cpp,test.hpp,简述下g++编译器将其编译成binary的工程中都做了哪些事情?
查看答案
要点
- 预处理:展开头文件、宏替换、条件编译、去注释,生成 .i;
- 编译:语法/语义分析、优化,生成汇编 .s;
- 汇编:汇编转机器码,生成目标文件 .o;
- 链接:合并目标文件与库、符号重定位,生成可执行 binary。
第5题(问答题) 如何用一枚硬币等概率地产生一个1到3之间的随机整数?如果这枚硬币是不公正的呢?
查看答案
要点 公平硬币:掷两次得 00/01/10/11 四种等概率结果,映射三个给 1/2/3,第四种重掷(拒绝采样)。 不公平硬币:掷两次,P(正反)=p(1−p) 与 P(反正)=(1−p)p 相等,用「正反→1、反正→2、同面→重掷」的冯·诺依曼技巧。
第6题(问答题) 简述对称密钥密码体系与公钥密码体系的区别
查看答案
要点 对称密钥:加解密用同一密钥,速度快,适合大数据加密,难点在密钥安全分发。 公钥密码:公钥加密、私钥解密(或私钥签名、公钥验签),速度慢,无需预共享密钥,用于密钥交换与数字签名。
第7题(问答题) 现在有10个人被一个魔鬼逮住了。魔鬼对于直接把人杀掉的方法不感兴趣了。于是,他就想了一个杀人的新花样。是这样的,一天晚上,魔鬼向着十个人宣布了游戏规则,即明天早上他要把10个人排成一排,然后从一堆既有无限多的白帽子混着无限多黑帽子的帽子堆为每个人随机抽取一顶帽子,给他们10个人都戴上帽子。因为10个人是排成一排的,所以排在第10个的人可以看到前面9个人帽子的颜色,排在第9个人可以看到前面8个人的帽子的颜色,…以此类推。然后,魔鬼会从排在第10个人开始,问他,你头上的帽子的颜色是白色还是黑色,如果答对了,就放他走;如果答错了,就被杀掉。然后同样问排在第9位的人,然后问排在第8位的人,….以此类推。在这其中,10个人所能做的只有当他被魔鬼问到的时候,答白色或者黑色。不能有超越此范围的任何行动,不然,魔鬼会把它们10个人全部杀死。
现在魔鬼给他们10个人一晚上的时间去商量一个对策,使得他们中能存活下来的人越多越好。请问,你会有什么样的对策,请计算出按照你的对策执行时最坏的情况下,他们中能有多少人能100%够活下来?期望能活下来的人数又是多少?
查看答案
要点 策略:第 10 人用「黑=前 9 人黑帽数为奇数、白=偶数」传递奇偶校验(自身 50% 概率活);第 9 人根据看到的 8 人 + 第 10 人的校验推出自己颜色;后续每人根据前面的报色修正计数推出自己颜色。 结果:最坏情况 9 人 100% 存活,第 10 人 50%;期望存活 = 9 + 0.5 = 9.5 人。
—