前言:在此记录平时看到的一些面试问题,为以后面试做准备,也巩固一下基础。
编程语言与操作系统:
- Python 3与Python 2的区别,进行了哪些优化,增加了什么新特性
- print,在python3中是一个函数,在python2中是一个语句。编码问题,在python2中默认用ascii编码,经常遇见编码问题,常在文件头加上
# -*- coding: utf-8 -*-
来声明使用UTF-8的类型,而在python3中默认就是使用utf-8。还有对bytes和原生unicode字符串的支持, 删除了unicode对象, str为原生unicode 字符串, bytes替代了之前的str等等。
- print,在python3中是一个函数,在python2中是一个语句。编码问题,在python2中默认用ascii编码,经常遇见编码问题,常在文件头加上
- 线程、协程的原理与区别
- 线程对多任务经行同时处理,开辟的资源较大。协程对一个任务进行分时处理,开辟的资源较小。
- 线程池与多线程的区别
- 多线程解决多任务同时执行的需求,合理使用CPU资源。线程池开辟一段内存空间,里面含有很多的线程,当需要使用线程时可以从线程池中选取一个线程使用,这样避免了多次创建线程对象带来的资源消耗。
- 并行与并发的区别
- 并发: 任务数大于cpu的核数,多个任务轮流执行,因为cpu切换速度特别快,感觉同时执行,其实不然。并行: 任务数小于或者等于cpu的核数,这个时候多个任务是真正一起执行。
- 进程间通信方式
- IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等
- 1.管道:速度慢,容量有限,只有父子进程能通讯
2.FIFO:任何进程间都能通讯,但速度慢
3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
4.信号量:不能传递复杂消息,只能用来同步
5.共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存
6.Socket,Socket位于应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用,从而实现进程在网络中通信。
7.Streams,命名的 STREAMS 管道机制通过一种途径,使得进程可以给予管道一个文件系统中的名字,使其能够实现双向通信,避免了 FIFO 管道的单向通信。
协议:
- TCP三次握手
- tcp属于传输层,三次握手,首先A向B发SYN(同步请求),然后B回复SYN+ACK(同步请求应答),最后A回复ACK确认,
SYN(synchronous建立联机),ACK(acknowledgement确认),PSH(push传送),FIN(finish结束),RST(reset重置),URG(urgent紧急),Sequence number(顺序号码),Acknowledge number(确认号码)
- tcp属于传输层,三次握手,首先A向B发SYN(同步请求),然后B回复SYN+ACK(同步请求应答),最后A回复ACK确认,
TCP与UDP的区别
- TCP是面向连接的,可靠性高;UDP是基于非连接的,可靠性低
- 由于TCP是连接的通信,需要有三次握手、重新确认等连接过程,会有延时,实时性差,同时过程复杂,也使其易于攻击;UDP没有建立连接的过程,因而实时性较强,也稍安全
- 在传输相同大小的数据时,TCP首部开销20字节;UDP首部开销8字节,TCP报头比UDP复杂,故实际包含的用户数据较少。TCP在IP协议的基础上添加了序号机制、确认机制、超时重传机制等,保证了传输的可靠性,不会出现丢包或乱序,而UDP有丢包,故TCP开销大,UDP开销较小
- 每条TCP连接只能时点到点的;UDP支持一对一、一对多、多对一、多对多的交互通信
- 应用场景选择
udp一般用于视频电话传输。对实时性要求高和高速传输的场合下使用UDP;在可靠性要求低,追求效率的情况下使用
tcp一般要求数据完整性,准确性的传输。需要传输大量数据且对可靠性要求高的情况下使用。
HTTP协议的组成部分,常见的HTTP头的含义
Http协议分为三部分,Http状态行、Http请求头,Http响应
请求头 Accept:可接受响应类型(application/json、text/plain等) Accept-Charest:可接收的字符集(utf-8等) Accept-Encoding:可接受的相应内容的编码方式(gzip、deflate等) Accept-Language:可接受的响应内容语言列表(en-US、zh-CN等) Authorization:http认证信息(oauth认证) Cache-Control:缓存机制控制(on-cache、on-store、max-age、public、private) Connection:客户端优先使用的链接类型(keep-alive、upgrade) User-Agent:浏览器的身份标识字符串 Origin:发起一个针对跨域资源共享的请求 If-Modified-Since:上一次响应的Last-Modified的值回当做If-Modified-Since的值发送给服务器 If-None-Match:上一次响应的ETag的值会当做If-None-Match的值发送给服务器 Referer:表示跳转到当期那页面的之前页面 响应头 Cache-Control:no-store no-cache max-age等等 Date:响应时间 Content-Length:响应内容大小 Content-Type:响应类型
浏览器打开网站的工作流程
- 搜索本地Dns > 本地host > 向宽带运营商服务器发起Dns解析请求 > 建立TCP连接(三次握手) > 数据传输 > TCP连接断开
域名解析的原理
- 通过DNS服务器,把域名解析为对应ip进行访问。
HTTPS的密钥交换过程
- 客服端接收服务端传输的CA证书,从中提取公钥,加密数据传输到服务端,然后服务端通过自己的私钥解密获取数据。
HTTP状态码的含义
1xx 信息处理状态码
2xx 成功状态码
200: 请求已成功,请求所希望的响应头或数据体将随此响应返回。出现此状态码是表示正常状态。
3xx 重定向状态码
302:临时性重定向 301:永久重定向,与302的区别是对于SEO更加友好,搜索引擎到页面后爬虫会记录重定向的地址 304:重定向到本地缓存,浏览器中存在访问页面时会用到
4xx 客服端错误
400:服务器不理解请求的语法 403:服务端收到了请求,但拒绝访问 404:找不到该路径对应的资源
5xx 服务端错误
500:服务器端执行请求时发生错误 503:服务器处于超负载或者正在停机维护,现在无法处理请求
常见漏洞:
CSRF相关的内容(域的概念、跨域的方法、CSRF防御的各种方法对比、Same-site Cookie)
- 跨站请求伪造,攻击者盗用了你的身份,以你的名义发送恶意请求。后面的内容等我学javascript再来补充。
各种Java反序列化原理(RMI、Fastjson、Weblogic)
- 附个链接吧,等我回来补,这方面不了解。。。 链接
SSRF漏洞原理与常见绕过方法
服务端请求伪造,通过控制服务端请求来探测外网达不到的内网,可以通过file协议,gopher协议等进行攻击。
绕过方法
1.http://baidu.com@www.baidu.com/与http://www.baidu.com/请求时是相同的 2.各种IP地址的进制转换 3.URL跳转绕过:http://www.hackersb.cn/redirect.php?url=http://192.168.0.1/ 4.短网址绕过 http://t.cn/RwbLKDx 5.xip.io来绕过:http://xxx.192.168.0.1.xip.io/ == 192.168.0.1 (xxx 任意) 指向任意ip的域名:xip.io(37signals开发实现的定制DNS服务) 6.限制了子网段,可以加 :80 端口绕过。http://tieba.baidu.com/f/commit/share/openShareApi?url=http://10.42.7.78:80 7.探测内网域名,或者将自己的域名解析到内网ip 8.例如 http://10.153.138.81/ts.php , 修复时容易出现的获取host时以/分割来确定host, 但这样可以用 http://abc@10.153.138.81/ 绕过 //来源先知
XXE漏洞原理与常见利用方法
- XML外部实体注入漏洞,可以用来读文件,探测内网,在特殊清况还可以命令执行。有回显直接构造xml读敏感文件,无回显可以把内容带出来。
SQL注入原理与常见利用方法(包括报错注入、BOOL盲注、时间盲注、宽字节注入等等原理)
- 用户的输入语句带到数据库进行执行,利用方法联合查询,报错注入很快,但是要有回显,盲注原理就是判断查询的正误,并且正确和错误的区别很明显,宽字节注入原理采用gbk编码,可以将\闭合。
经验相关:
- 挖过的漏洞
- 目前暂无,有会补充
- 印象深刻的渗透经历
- 目前暂无,有会补充
php中命令执行涉及到的函数:
代码执行
eval(),assert(),popen(),system(),exec(),shell_exec(),passthru(),pcntl_exec(),call_user_func_array(),create_function()
文件读取:
file_get_contents(),highlight_file(),fopen(),readfile(),fread(),fgetss(), fgets(),parse_ini_file(),show_source(),file()等
命令执行:
system(),exec(),shell_exec(),passthru(),pcntl_exec(),popen(),proc_open()