Shawn's Blog

地址解析协议 ARP

0X00 什么是 ARP 首先纠正一种说法,ARP就是“地址解析协议”,所以严格来说不应该说“ARP 协议”,因为ARP Address Resolution Protocol就已经包含了Procotol了,说“ARP 协议”就相当于是“地址解析协议协议”,很鬼畜。 我们知道网络中寻找其他机器需要用到对方的 ip 地址,但是在局域网内两台机器之间通信是不用 ip 地址直接通信的,而是要用到 mac 地址。而且我们一般说的交换机也是二层交换机,现在假设两台电脑插到一个交换机上去,通过 ip 能找到对方吗?显然不能。因为交换机只支持到链路层,然而对于链路层来说它并不知道 ip 是个什么,ip 需要到再上一层的“网络层”才能发挥作用,所以在这种情况下就需要用到 mac 地址来通信了。 当一个数据包需要被发送到某一 ip 地址的机器上去时,最后一步就需要找到 ip 地址对应机器(严格来说是网口)的 mac 地址,从而进行通信。那么在这一步里“通过 ip 地址找到 mac 地址”的解析协议就被称之为:地址解析协议,也就是ARP: Address Resolution Protocol了。…

在 Linux 中使用网桥 bridge

0X00 什么是网桥 普通的桥就是连接本来不通的路的基础设施,网桥就是用来本来不通的网的设备。但是这里介绍的不是真正意义上的物理设备,而是在 Linux 上创建的虚拟设备。Linux 上不仅可以创建虚拟网卡,也可以创建虚拟网桥,所以说我们在 Linux 环境下学习网络知识确实是一个不错的选择(除非你有钱买一堆物理设备🤣)。 桥接器(英语:network bridge),又称网桥,一种网络设备,负责网络桥接(network bridging)。桥接器将网络的多个网段在数据链路层(OSI模型第2层)连接起来(即桥接)。 -- Wikipedia 0X01 网桥有什么用 网桥的本质就是将互不连通的网卡接到一起,原则上只有这么简单的功能,具体在这个功能之上能做什么事就看我们自己了。 如果用过 Docker 的话可以看一下自己本地的网络拓扑,实际上 Docker 的容器间通信和外网访问也是用到了 bridge 的。…

2020 年终总结

0X00 前言 一年前的这个时候还在想,2020 年这个年号听起来很科幻,然而 “科幻” 这个词还是还是太瞧不起 2020 了,这一年简直是“魔幻”。 最近这几年来,过得最不舒服的应该要数今年的前两个月了,疫情刚刚爆发,武汉封城,人也不出门,就在家里当咸鱼。本来就焦虑的人们每天看到的新闻也只能让大家更加焦虑,每天看到的都是 “口罩、防护服没有了”,“武汉封城”,“急寻密切接触者”.... 不过好在也有火神山雷神山这种好消息,也有后面武汉解封的振奋,还在今年的最后一天还看到了“国产疫苗批准上市,免费接种”这种令人愉悦的消息。如果要真是像🇺🇸️那么搞,真不知道还有没有命在这儿写 2020 年度总结了😵 0X01 2020 年度计划 * ❗️ 写 31 篇博客完成率:63% * ❕️ 欣赏 50 部电影完成率:82% * ✅️ 坚持 5 个小习惯完成率:100% * ✅️ 阅读 20 本书完成率:100% * ✅️ 了解 4 个新领域完成率:100% * ✅️ 提升 5 个专业技能点完成率:100% * ✅️ 减重 15 斤到 150 斤 完成率:100% * ✅️…

防范 CSRF

0X00 前言 假设有这么一个银行(肯定要假设,如果真有这么蠢的话这银行也早就倒闭了)的网上银行站点,他提供了一套的 API,通过GET https://api.xxbank.com/transfer?amount=3000&to=shawn可以向 shawn 转账 3000 块。虽然用 GET 来修改数据是挺蠢的但是好像也没什么大问题是吧。 好的,现在你正在这个银行的网站上沉迷于数自己余额的零,这时候我给你发来了一个链接。你开开心心的看完了发给你的页面,然后关掉了它,回过头来发现自己账户少了 3000 块钱!!!怎么回事呢? 其实是我发给你的链接有“毒”,页面里所有的图都是<img src="https://xxx.xxx.xxx/xxx.jpg"/>,但是有一张图裂了你没发现,裂了的那张图是<img src="https://api.xxbank.com/transfer?amount=3000&to=shawn" />。这里有两个问题需要注意,第一个就是这个 url 并不是图片,所以图片必然会裂掉;第二个就严重了:因为是 img 标签,所以浏览器会去 GET 回来,这一 GET…

MySQL 查询执行内幕-基础篇

0X00 前言 这篇博文概述了一次查询从一条 SQL 到拿到数据的过程,是掌握了基础的 CRUD 后想要进阶 MySQL 的一条必经路(当然我是说这个只知识是必经路,并不是我这篇文章)。如果有兴趣的话就继续看下去吧~ 我们首先看一下下面这张图,其实并不复杂。我们很多人都已经知道了其中的一部分,比如缓存、存储引擎、数据这些。 图源自:高性能 MySQL 我们先来看一下粗略的流程 1. 首先客户端发送一条查询给服务器; 2. 服务器检查缓存,如果命中缓存则直接返回;否则继续执行; 3. 服务器解析 SQL、预处理、由优化器生成执行计划; 4. MySQL 根据执行计划,调用存储引擎 API 执行查询; 5. 将结果返回给客户端; 虽然每一条都比上面描述的、比我们想象的要复杂得多。但是因为这里只是基础篇,所以我们只是了解一下基础流程和原理就好,如果需要深入了解某部分的细节的话,可以查阅更详细更深层的资料。 0X01 客户端 <-> 服务器 首先我们需要知道的一点是:客户端和服务器之间的通信是半双工的 。这一点其实就能解释我们工作中遇到的一个问题:当我们主动发起一个查询请求后,并不能再次主动…

使用 ab 和 http_load 进行简单的性能测试

0X00 概述 我们经常想要简单测试一下某个页面的性能,或者 REST API 的性能,用 postman 这种程序虽然可以很快的模拟请求出来但是并不方便发送大量请求;自己写脚本虽然自定义程度很高,但是写起来总归还是有点麻烦,而且并不能很方便得输出我们需要的一些常用数据。那这种时候一般就需要找些专业的工具来做这种专业的事情了。下面两个就是平时比较常用的性能测试工具,可以针对某个/某些 url 做性能测试,并且输出相对完整的报告。 软件具体怎么装就自己想想办法吧,毕竟 Linux/macOS/windows 之间都不太一样,而且 Linux 上还有 apt/dnf/pacman 巴拉巴拉一堆包管理器,用法都不一样,没必要一个个找出来贴上。需要了解 API 性能的人肯定能很轻松装上这些工具了~ 0X01 apache bench 最简单的使用方式:ab -n 20 -c 2 https://example.org/回车,就会执行一次简单的测试并输出报告。这串命令会用GET请求访问https://example.com/,并发为 2,总共发起 20…

SSO 和 LDAP

0X00 前言 上周在新公司接到的一个任务"给 XXX 系统集成 LDAP 登录"。我以前是没有了解过 LDAP 的,一听是集成登录功能,脑子里第一时间想到的就是之前做过的 SSO,但是经过一番搜索发现 LDAP 和 SSO 完全是两回事,而且发现还是不少人不了解其中的一项或两项技术,正好在这儿整理一下顺便分享给大家~ 内容都是比较基础的,主要介绍了什么是 SSO、SSO 的基本原理、什么是 LDAP、LDAP 的基本原理和 LDAP 如何与 SSO 关联。如果你对这些有兴趣那不妨继续看下去,如果你都了解了那就去看看其他文章或者休息一会儿好了~ 现在开始做一些技术背景预设:假设你公司有 10 个站点,分别是site_0.just666.com/site_1.just666.com.....,同时每个站点都有用户系统,也就是说用户可以登录到站点上去做些操作。 用户肯定不愿意访问每个站点的时候都要登录,比如你登陆淘宝之后再看天猫肯定不想再登陆一次了,如果天猫要你再登陆一次且密码还跟淘宝那边不通你肯定要骂人了。现在怎么办呢?SSO 和 LDAP 两种技术就是用来解决这个问题的。 0X01…

我的第一次跳槽之路

0X00 前言 都说“生活需要仪式感“,那对我来说的第一次跳槽还是值得记录的,用处肯定是没什么,但是总归是给自己一点点生活上的仪式感吧。而且脑子记住的东西可能过几年就忘记了,真正记录成文字的东西存活时间就会长久很多。(记录在网络上就算我自己把博客删了,都还会有垃圾站原封不动的抄走,简直不可能丢🤣) 本来说离职当天就来写这篇文章的,结果当天晚上同时请客去吃饭又去唱了歌,回家都凌晨两点了,隧作罢。现在离职手续全部都办好了,新公司的文件们也都准备好了,就等假期过后直接到新公司入职。所以也终于有时间坐下来不用考虑工作相关的任何事情来写一写自己的想法了~ 这不是日记,按蓝青峰跟朱潜龙的说法正经人谁写日记啊🤪 (狗头) 0X01 为什么离开 从我以实习生的身份加入创宇到最后离开一共是 1159 天,算下来是三年多一点点,时间也算是很久的了。毕竟我大学也就只有前三年是在学校的,后面就出来实习了。现在走呢也不是说因为公司有啥问题或者我被开除了,只是说我自己觉得是时候出去看看了,不想常年在一家公司里待下去 这次跳槽主要是这三个问题导致的: 1.…

MySQL 中的四种隔离等级

0X00 What's this 我们知道 MySQL 中存在“事务”这么个事物(我是故意拗口的,哈哈哈哈哈哈哈);我们也知道事务“一荣俱荣,一损俱损”(要么事物内所有查询均生效,要么均不生效)。那么现在问题来了,银行数据库中有两个事务在同时进行,我们来看一下这两个事务 一条 SQL 就是一个查询,不一定是 SELECT xxx 才叫查询。 现在有这么一个情况:shawn 和 bluce 两人账上都有 100 块钱,此时事务 A 和 B 同时开始执行,那么事务 B 所查询到的两人的账户余额究竟是多少呢?这个问题并没有一个确切的结果,因为 B 在查询的时候,转账正在进行中。不过要回答这个问题也不是做不到,就需要引入标题中提到的“隔离等级”这个概念了。 我们在 MySQL 中使用这四种隔离等级:READ UNCOMMITTED/READ COMMITTED/REPEATABLE READ/SERIALIZABLE。隔离等级的不同就意味着在同一个时间节点下查询到的内容可能不同,数据的可靠性也会变得不同。接下来我们来简单了解一下这四种隔离等级,并且通过一个测试数据库来验证一下。 0X01…

Python 上下文管理器

0X00 使用 with as 语法 我们写程序经常会操作文件,我们都知道写文件要 open/write/close ,尤其是 close ,没有的话文件就会出问题(有些内容在缓存里,没写入磁盘)。不过我们现在写文件应该没什么人这样写了,都是用with open('filename', 'w') as f的方式来操作文件了。如果说这样做的好处,那多数人都会说“不用手动关闭文件了”,错肯定没错的。 上下比起来,上面的方式不仅多了一点点代码,而且随着中间逻辑代码变多,很可能会导致最后忘记 close,从而引发 bug。 0X01 这就是上下文管理器 上面 with xxx as xxx 的调用方式就是在调用上下文管理器。简单来说上下文管理器就是:在执行你编写的代码(with xxx as xxx后面那坨)之前,操作一波 ;再在你编写的代码执行完后,操作一波 。我们简单理解一下就是在 with open('file_name', 'w') as f 内层缩进的代码执行完成后自动帮你执行了f.close()(当然没这么简单,有兴趣可以去看一下 open 的源码,但是大体逻辑是这样的)。…