安全 WordPress
安全配置日志
0x00 前言
目前的这个网站,建立在一个我自认为是相对安全的体系结构下,撰写此篇文章来描绘一下网站的建构
0x01 服务器建构
上面的这幅图片描述了网站的大体构造,网站有3台服务器组成,3台服务器架构在2台物理服务器上,分别为
网页代码服务器A,仅用来存放和执行网页源代码,代码服务器架构在Docker容器中,宿主机使用CentOS操作系统,Docker虚拟机使用Ubuntu Linux操作系统,宿主机仅运行Docker服务,容器中仅运行Nginx和php-fpm
数据库服务器B,仅用来存放数据库,使用mysql数据库,做站库分离,数据库仅允许wordpress用户远程访问,wordpress用户仅对wordpress数据库有增删改查及建表五项权限,对information_schema数据库有usage权限,对其他数据库无访问权限,数据库服务器运行在内网环境,使用内网域名db.shaoqunliu.cn,内网访问端口随机生成
对象存储服务器C,仅用来存放网页中静态的图片及文件,对公网暴露80及443端口,使用与代码服务器A对等的CDN配置,与网页代码服务器物理隔离
...
C++ 代码优化
0x00 C++代码优化
在这里讲述一些代码优化的奇技淫巧:
0x00 位运算
位运算往往比普通的加减乘除运算快很多,例如:
a2b\frac{a}{2^b}2ba可以写为a >> b,a⋅2ba\cdot2^ba⋅2b可以写为a << b
a mod 2ba\,mod\,2^bamod2b 可以写为a & 2^b -1,例如10与4取余即为10 & 3
计算int类型a与b的平均值,如果使用表达式a+b2\frac{a+b}{2}2a+b可能会出现a+b溢出的情况,但a+b的平均值只能小于等于max(a, b),也就说绝不会溢出,此处可以使用位运算做一个不会溢出的平均值计算:
1(a&b)+((a^b)>>1)
不使用临时变量互换两个整数:
123x ^= y;y ^= x;x ^= y;
0x01 减少运算强度
当计算aba^bab时,如果b比较小的话可以直接写成a*a*a的形式避免使用pow函数
使用自增自减运算符来代替诸如i = i + 1这样的运算,i = i + 1往往生成如下汇编代码:
123move A,i ...
英文文献翻译中的一些体会及感想
0x00 注
2018年3月16日至6月6日,这82天内,我每天都会拿出半个到一个小时的时间来翻译一些英文技术文档,近期又做了些许proofreader的工作,颇有体会。
这82天说长也不长,主要翻译了一下RESTful API设计准则,英译汉,刚刚统计了一下字数,15452字(中文),平均188.4字每天。
我认为将英文技术文档,翻译成中文,有以下难点:
0x01 文化差异(名词释义)
文化差异导致很多东西不能被直译为中文,需要意译,我曾思考过一个问题,众所周知,计算机中的总线,英文名叫bus,bus这个单词小学生都知道它是公共汽车的意思,但是,当时**做翻译的那个人是怎么想到将这个bus翻译成总线的呢?**我查阅了一些资料,例如下面是英文维基百科中对bus这个词在计算机科学中的定义:
In computer architecture, a bus is a communication system that transfers data between components inside a computer, or between computers.
在计算机体系结构中,bu ...
计算题
0x00 常用常数
名称
数值
以太网帧最小帧长
64bit
以太网帧最大帧长
1500B
IP头部长度
20B
以太网有效载荷
1500-20=1480B
TCP首部长度
20B
UDP首部长度
8B
TCP伪首部长度
12B
UDP伪首部长度
20B
0x01 物理层
比特率与波特率:
比特率=波特率×log2n其中n为码元的进制数,比如二进制就是n=2比特率又称信息传输速率在以太网的曼彻斯特编码中,2个bit代表了一个数据比特率=波特率\times \log_2n \\
其中n为码元的进制数,比如二进制就是n=2 \\
比特率又称信息传输速率 \\
在以太网的曼彻斯特编码中,2个\text{bit}代表了一个数据
比特率=波特率×log2n其中n为码元的进制数,比如二进制就是n=2比特率又称信息传输速率在以太网的曼彻斯特编码中,2个bit代表了一个数据
奈奎斯特定理和香农定理:
理想低通信道下极限数据传输率=2Wlog2V其中W为带宽,单位为HzV就是有几种不同的用来表示数据的物理状态信道的极限数据传输速率=W ...
网络层
0x00 功能
异构网络互连
异构网络指的是数据链路层和物理层均不同的网络
路由(选择)和(分组)转发
拥塞控制
判断拥塞:网络负载增加,网络吞吐量明显小于正常吞吐量,或下降就可能进入了拥塞状态,下降为0,则进入死锁状态
有如下2种方法
开环控制:静态预防,力求不产生拥塞
闭环控制:采用监测网络去监测,基于反馈环路,是一种动态的方法
流量控制是点对点之间对通信量的控制,拥塞控制是为了确保通信子网能够传送待发送的数据
网络层的主要目的是在任意结点之间进行数据报传输(不一定是可靠的哦)
0x01 路由算法
路由算法可以分为:
静态路由算法:又称非自适应路由算法,人工手动配置路由表
动态路由算法:又称自适应路由算法,相互连接的路由器彼此交换信息
动态路由算法又可以分为:
距离-向量路由算法:所有结点定期(每隔30秒)以广播的形式将整个路由表传给相邻的结点,同时如果一个路由在180s内未被更新则将相应的距离设置为无穷大(即16)并从路由表中删除该项,最常见的距离向量算法是RIP算法
路由表包含:
路径目的地
路径代价:即跳数,每经过一个路由器跳数+1, ...
排序算法总结
0x00 排序算法
在Wikipedia上一共列举了11种排序算法,分为4大类,如下
Simple sorts 简单排序
Insertion sort 插入排序
Selection sort 选择排序
Efficient sorts 高效排序
Merge sort 归并排序
Heapsort 堆排序
Quicksort 快速排序
Bubble sort and variants 冒泡排序及其变体
Bubble sort 冒泡排序
Shell sort 希尔排序
Comb sort 梳排序
Distribution sort 分配排序
Counting sort 计数排序
Bucket sort 桶排序
Radix sort 基数排序
0x01 术语
先来说说术语,有些术语确实理解起来比较晦涩
0x00 比较型排序算法和非比较型排序算法
比较型排序算法(Comparison sorts)
比较型排序算法就是我们一般常用的那几个排序算法,通过直接比较数列中两个数的大小来完成排序。
摘自维基百科:
A comparison sort is a type of s ...
链表
0x00 链表
在Wikipedia上对链表的定义是一个线性的存储数据的结合。
链表中每一个用于存储数据的单元叫做element或者node,每一个结点中都包含一个指向下一个结点的指针一般被称为next link或者next pointer,剩余的元素一般为数据元素,一般被称为data, information, value, cargo或者payload。链表的第一个元素被称为链表的head。
在某些链表的实现方法中,一般会在链表真正记录数据的结点之前或尾部加入一个多余的结点,通常用来简化或者加速某些链表的算法(list-handling algorithms)或者用于确保链表可以被安全地取消引用(safely dereferenced)以及确保链表始终具有第一个或者最后一个结点,这个结点往往被称为哨兵结点(Sentinel nodes)。
链表一般分为如下几种:
单向链表(Singly linked list)
单向链表中的结点往往含有数据元素以及一个指向下一个链表结点的指针
双向链表(Doubly linked list)
双向链表中的结点往往含有数据元素以及一个指向下一 ...
进程管理
0x00 进程的基本概念
在多道程序环境下,允许多个程序并发执行,此时他们将失去封闭性,并具有间断性和不可再现的特性,为此引入进程的概念。同时为了使并发的程序和数据能独立地运行,必需为其单独配置一个进程控制块(PCB),系统利用进程控制块来描述进程的基本情况和运行状态,进而控制和管理进程。相应地,由程序段、相关数据段和PCB三部分构成了进程映像(进程实体)。创建进程即为创建进程映像中的PCB,撤销进程实质上也是撤销的进程的PCB。由此也说明了PCB是进程存在的唯一标识。进程映像是静态的,进程则是动态的。
进程的基本特征:
动态性:即为进程有着创建、活动、暂停、终止等过程,具有一定的生命周期。
并发性:指的是多个进程实体同存在于内存中,内在一段时间内同时运行。
独立性:指进程实体是一个能独立运行、独立获得资源和独立接受调度的基本单位。凡未建立PCB的程序都不能作为一个独立的单位参与运行。
异步性:进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进。异步性会导致执行结果的不可再现性,为此操作系统必须配置相应的进程同步机制。
结构性:每个进程都有一个PCB对其进行描述,从结构 ...
基本概念
0x00 基本概念
操作系统是一个程序集合,计算机系统中最基本的系统软件。
操作系统的基本特征:
并发
并发就是使两个或多个时间在同一时间间隔内发生。操作系统引入进程的目的就是为了使程序能够并发执行。
在此处注意并发和并行的区别:并发是同一时间间隔,并行是同一时刻,单处理机环境下实际仅能有一道程序执行,微观上这些程序还是在交替执行。
操作系统的并发性通过分时得以实现。
共享
互斥共享方式:在一段时间内仅允许一个进程访问该资源,互斥共享是因为一种资源在一段时间内仅能满足一个请求,就比如说打印机
同时访问方式:允许一段时间内有多个进程同时进行访问,同时访问要求一个请求分几个时间片段间隔完成的效果与连续完成的效果相同
虚拟
虚拟是指把一个物理上的实体变为若干逻辑上的对应物。就比如说虚拟内存虚拟外部设备等等。
异步
在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一贯到底,而是走走停停,以不可预知的速度前进,这就是进程的异步性。
并发和共享是操作系统的两个最基本的特征,两者又互为存在条件,资源共享是以程序的并发为条件的,若系统不允许程序并发执行 ...
查找
0x00 查找
主要有如下查找算法(Searching Algorithms):
顺序查找(Linear Search)
二分查找(又称折半查找Binary Search)
以及几个对查找优化的数据类型:
哈希表(又称散列表Hash Table)
B树(参见树那一节)
介绍一个基本概念叫做平均查找长度(ASL):
ASL的计算公式如下:
ASL=∑i=1nPi×CiASL=\sum_{i=1}^n P_i\times C_i
ASL=i=1∑nPi×Ci
上式中
n为查找长度
PiP_iPi为第iii个元素为目标的概率
CiC_iCi为找到第iii个元素所需要进行的比较次数
0x01 顺序查找和二分查找
0x00 顺序查找
顺序查找不做详述,就是最简单的查找算法,从第一个开始往后依次查找,直到找到目标或者到达结尾。顺序表一般针对无序的序列。
在此,不给出代码了,仅分析其平均查找长度,对于顺序查找而言在查找成功的情况下,ASL计算为:
ASL=∑i=1nin=n+12ASL=\sum_{i=1}^n \frac{i}{n} = \frac{n+1}{2}
ASL ...