在求职过程中,参加了建信金科的笔试和电信北京研究院安全岗的一面,这两个经历都让我收获颇丰。下面将详细分享这两次经历以及相关技术问题的总结。
以下是对建信金科笔试部分内容的进一步扩展和分析:
一、建信金科笔试
(一)选择题部分深度分析
-
Java 相关题目
- 面向对象三大特性:
- 封装:将数据和操作封装在类中,通过访问修饰符控制外部对类内部成员的访问,提高了代码的安全性和可维护性。例如,将一些敏感数据设置为私有属性,并通过公共方法提供有限的访问权限。
- 继承:允许子类继承父类的属性和方法,实现代码的复用。例如,创建一个动物类作为父类,然后创建猫、狗等子类继承动物类的一些通用属性和行为。
- 多态:同一操作作用于不同的对象可以有不同的表现形式。比如,定义一个方法接收父类类型的参数,实际传入不同的子类对象时,会根据子类的具体实现执行不同的行为。
- 线程同步机制:
- synchronized 关键字:可以用于修饰方法或代码块,确保在同一时刻只有一个线程访问被修饰的部分。例如,在多线程环境下对共享资源的访问进行同步,防止数据不一致。
- Lock 接口:提供了比 synchronized 更灵活的锁机制,可以实现尝试获取锁、中断等待锁等功能。例如,使用 ReentrantLock 实现更加复杂的同步逻辑。
- 面向对象三大特性:
-
数据库题目
- 数据库规范化设计:
- 目的是减少数据冗余、提高数据的一致性和完整性。例如,将一个包含重复数据的表拆分为多个表,通过外键关联起来,避免数据的重复存储。
- 常见的规范化级别有第一范式(1NF)、第二范式(2NF)、第三范式(3NF)等。
- SQL 语句操作:
- 查询(SELECT):可以使用各种条件筛选数据、进行排序、分组等操作。例如,使用 WHERE 子句筛选满足特定条件的数据,使用 ORDER BY 子句对结果进行排序。
- 插入(INSERT):向表中插入新的数据行。需要指定插入的列和对应的值。例如,INSERT INTO table_name (column1, column2) VALUES (value1, value2)。
- 更新(UPDATE):修改表中已有的数据。可以使用 WHERE 子句指定要更新的行。例如,UPDATE table_name SET column1 = new_value WHERE condition。
- 删除(DELETE):删除表中的数据行。同样可以使用 WHERE 子句指定要删除的行。例如,DELETE FROM table_name WHERE condition。
- 数据库规范化设计:
-
网络安全题目
- SQL 注入防范措施:
- 输入验证:对用户输入的数据进行严格的验证和过滤,确保输入的数据符合预期的格式和类型。例如,使用正则表达式对输入的字符串进行验证。
- 参数化查询:使用参数化查询而不是拼接 SQL 语句,可以防止恶意用户注入 SQL 代码。例如,在使用 JDBC 进行数据库操作时,使用 PreparedStatement 进行参数化查询。
- 最小权限原则:确保数据库用户只具有完成其任务所需的最小权限。避免使用具有过高权限的数据库用户进行应用程序的操作。
- 网络通信安全保护措施:
- 使用加密技术:如 SSL/TLS 加密协议,确保数据在网络传输过程中的机密性。例如,在 Web 应用中使用 HTTPS 协议来加密客户端和服务器之间的通信。
- 身份验证和授权:对用户进行身份验证,确保只有合法用户能够访问系统。同时,根据用户的角色和权限进行授权,限制用户对资源的访问。例如,使用用户名和密码进行身份验证,使用基于角色的访问控制(RBAC)进行授权。
- 网络防火墙:设置网络防火墙,限制外部对内部网络的访问,防止恶意攻击。可以根据 IP 地址、端口号等规则进行过滤。
- SQL 注入防范措施:
-
计算机网络题目
- TCP/IP 协议栈工作原理:
- TCP/IP 协议栈分为四层:网络接口层、网络层、传输层和应用层。
- 网络接口层负责将数据帧在物理网络上传输。网络层使用 IP 协议进行路由和寻址。传输层使用 TCP 和 UDP 协议提供可靠的数据传输和不可靠的数据传输服务。应用层则包含各种应用协议,如 HTTP、FTP、SMTP 等。
- IP 地址划分:
- IP 地址分为 IPv4 和 IPv6 两种。IPv4 地址由 32 位二进制数组成,通常表示为点分十进制形式。IPv6 地址由 128 位二进制数组成,通常表示为十六进制形式。
- 根据子网掩码可以将 IP 地址划分为网络地址和主机地址两部分。通过子网划分可以将一个大的网络划分为多个小的子网,提高网络的管理效率和安全性。
- TCP/IP 协议栈工作原理:
(二)编程题部分深入探讨
以下是对建信金科笔试编程题部分以问题、文字解答和代码解答的方式呈现:
一、第一道编程题
问题:给定一个链表,求至少去除多少个链表元素使得所有链表元素值都相同。
文字解答:
- 首先考虑边界情况,如果链表为空或者只有一个元素,直接返回 0。
- 然后遍历链表,使用哈希表(如 Java 中的 HashMap)统计不同元素值出现的次数。
- 找出出现次数最多的元素值。
- 最后计算需要去除的元素个数,即链表总长度减去出现次数最多的元素值的出现次数。
代码解答(Java 示例):
class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
}
}
public class RemoveElementsForSameValue {
public static int removeElements(ListNode head) {
if (head == null) {
return 0;
}
if (head.next == null) {
return 0;
}
java.util.Map<Integer, Integer> countMap = new java.util.HashMap<>();
ListNode current = head;
while (current!= null) {
countMap.put(current.val, countMap.getOrDefault(current.val, 0) + 1);
current = current.next;
}
int maxCount = 0;
int maxValue = 0;
for (java.util.Map.Entry<Integer, Integer> entry : countMap.entrySet()) {
if (entry.getValue() > maxCount) {
maxCount = entry.getValue();
maxValue = entry.getKey();
}
}
int totalCount = 0;
current = head;
while (current!= null) {
totalCount++;
current = current.next;
}
return totalCount - maxCount;
}
}
二、第二道编程题
问题:给定一个链表,将链表在偶数位置的值合并到前一个值或后一个值,但题目描述不够明确,如何确定合并规则并实现该功能?
文字解答:
- 首先分析题目理解难点,由于题目描述中对偶数位置的值合并要求不明确,我们可以假设优先合并到前一个值。如果前一个值不存在或者有特定限制(如前一个值已达到某个条件不能再合并),则考虑合并到后一个值。
- 在遍历链表过程中,维护前一个节点和当前节点的指针。判断当前节点位置是否为偶数,如果是偶数位置,则根据合并规则进行值的合并操作。
- 对于边界情况,如链表的头节点为偶数位置时,创建一个虚拟头节点可以简化处理。
代码解答(Java 示例):
class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
}
}
public class MergeEvenPositionValues {
public static ListNode mergeEvenPositions(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode prev = dummy;
ListNode current = head;
int position = 1;
while (current!= null && current.next!= null) {
if (position % 2 == 0) {
int mergedValue = prev.next.val + current.val;
prev.next.val = mergedValue;
current = current.next;
} else {
prev = prev.next;
current = current.next;
}
position++;
}
return dummy.next;
}
}
二、电信北京研究院安全岗一面
(一)面试流程
投递的安全运营和攻防研究岗位,一面于下午 2 点开始,提前进入会议室后提前开始面试,总时长大概 40 分钟。自己需要开启视频,但两个面试官不开视频。
(二)面试问题及答案
-
自我介绍
简要介绍自己的教育背景、专业技能、项目经验和对安全领域的兴趣。 -
问简历项目,渗透的思路
根据自己在简历中提到的渗透测试项目,阐述渗透测试的整个流程和思路。回答示例:
- 首先进行信息收集,包括目标系统的域名、IP 地址、开放的端口和服务等。
- 然后进行漏洞扫描,使用各种漏洞扫描工具查找可能存在的安全漏洞。
- 针对发现的漏洞进行进一步的分析和利用,尝试获取系统的权限。
- 最后进行后渗透测试,包括收集敏感信息、扩大权限等。
-
结合实际工作讲讲 SQL 注入
解释 SQL 注入的原理、危害以及在实际工作中的防范措施。回答要点:
- 原理:SQL 注入是通过在用户输入的数据中插入恶意的 SQL 语句,从而欺骗数据库服务器执行这些恶意语句。
- 危害:可能导致数据泄露、数据篡改、权限提升等严重后果。
- 防范措施:对用户输入进行严格的过滤和验证,使用参数化查询,避免拼接 SQL 语句等。
-
HTTPS 和 HTTP 有什么不同?TLS 是怎么实现的?
-
HTTPS 和 HTTP 的不同:
- HTTPS 是在 HTTP 的基础上增加了 SSL/TLS 加密层,保证了数据传输的安全性。
- HTTP 是明文传输,容易被窃听和篡改;HTTPS 则通过加密保证了数据的机密性和完整性。
- HTTPS 的默认端口是 443,而 HTTP 的默认端口是 80。
-
TLS 的实现方式:
- TLS 协议通过握手过程在客户端和服务器之间建立安全连接。
- 握手过程中,双方协商加密算法、交换密钥等。
- 然后使用协商好的加密算法对数据进行加密传输。
-
-
TCP 三次握手
描述 TCP 三次握手的过程。回答要点:
- 第一次握手:客户端向服务器发送一个 SYN 包,请求建立连接。
- 第二次握手:服务器收到 SYN 包后,向客户端回复一个 SYN/ACK 包,表示收到请求并同意建立连接。
- 第三次握手:客户端收到 SYN/ACK 包后,向服务器回复一个 ACK 包,表示确认建立连接。
-
文件上传的挖掘和利用思路?
阐述文件上传漏洞的挖掘和利用方法。回答示例:
- 挖掘思路:
- 测试不同的文件类型上传,看是否存在文件类型过滤不严的问题。
- 尝试上传恶意文件,如 webshell、可执行文件等,看是否能够成功上传。
- 利用思路:
- 如果成功上传恶意文件,可以通过访问该文件来执行恶意代码,获取服务器的权限。
- 或者利用文件上传漏洞上传一个后门程序,以便后续的渗透测试。
- 挖掘思路:
-
怎么绕 CDN?
介绍绕过 CDN 的方法。回答要点:
- 通过查询域名的历史解析记录,找到真实的 IP 地址。
- 利用子域名查询,有些子域名可能没有使用 CDN。
- 利用网络漏洞扫描工具,扫描目标网站的开放端口,可能会发现没有经过 CDN 的服务器。
-
讲讲你对安全运营的了解?
谈谈对安全运营的理解和认识。回答示例:
- 安全运营是指通过一系列的技术和管理手段,保障企业或组织的信息系统的安全。
- 包括安全监控、漏洞管理、事件响应、安全培训等方面。
- 安全运营的目标是及时发现和处理安全事件,降低安全风险,保护企业的资产和声誉。
-
在学校关于网络的课程讲什么?
根据自己在学校学习的网络课程内容进行回答。回答示例:
- 可能包括计算机网络的体系结构、网络协议、网络安全等方面的知识。
- 例如,讲解 TCP/IP 协议栈的工作原理、网络层的 IP 地址和路由、传输层的 TCP 和 UDP 协议等。
- 还可能涉及网络安全的基本概念、常见的安全威胁和防范措施等。
-
现在在做的项目?详细解释一下
介绍自己目前正在进行的项目,包括项目的背景、目标、技术架构和自己在项目中的角色和贡献。
(三)反问环节
在面试的最后,可以向面试官提出一些问题,例如:
- 岗位的具体职责和发展前景。
- 团队的技术栈和工作氛围。
- 公司对安全岗位的重视程度和投入。
三、总结与反思
通过这两次经历,我深刻认识到在安全领域的求职中,不仅需要扎实的技术基础,还需要良好的沟通能力和问题解决能力。在准备面试时,要对常见的安全技术问题有深入的理解和掌握,同时要能够将自己的项目经验清晰地表达出来。对于笔试中的编程题,要注意理解题目要求,提高代码的质量和效率。在未来的学习和实践中,我将继续努力提升自己的技术水平和综合素质,为进入理想的安全岗位做好充分的准备。