阿里云在线扩容磁盘遇到的问题

按照官方文档扩容

输入growpart 命令时 没有查找一下该命令的参数和含义,照着文档以为是截图中的序号,结果报如下错误

NOCHANGE: partition 2 is size 0. it cannot be grown

growpart <DeviceName> <PartionNumber>

应该输入分区好,即截图中1,/dev/vdb 是设备名称 ,/dev/vdb1是设备名称+分区号,即设备分区

总结:
服务器运行不了解的命令一定要先查一下文档手册,看个大概,梳理一下操作的大概意思,然后在操作
完善一下文件系统的文档,复习一下文件系统的知识

参考

在线扩容云盘(Linux系统)

阿里云Linux服务器动态扩容(阿里云服务器扩容后磁盘空间无变化解决方法)

面试题2021-11-02

问:redis 突然变慢了?你要怎样排查?解决方案?

问:怎样保证 redis 和 MySQL 的数据的完整性?解决方案?

问:MySQL 的 CPU 突然飙升,甚至到达了 500%,你会怎样排查和分析?解决方案是什么?

问:一个事务中操作了 A、B、C 三个表,B 表和 C 表操作成功了,A 表的记录没有变化,你会怎样排查和分析?解决方案是什么?

前端好用的轮子汇总

React UI 组件库

Ant Design :https://ant.design/
React Bootstrap: https://react-bootstrap.github.io/
MATERIAL-UI : https://material-ui.com/

Vue UI组件库

Element : https://element.eleme.io/#/zh-CN
vant : https://youzan.github.io/vant/#/zh-C%E2%80%A6
View UI : https://www.iviewui.com/

Alpine.js https://www.alpinejs.cn/

动画库

Animate.css : https://animate.style/


常用效果组件
swiper : https://www.swiper.com.cn/
mescroll.js http://www.mescroll.com/api.html

工具类轮子

lodash.js : https://www.lodashjs.com/
Day.js : https://dayjs.fenxianglu.cn/
timeago.js : https://github.com/hustcc/timeago.js
echarts : https://echarts.apache.org/zh/index.html
Meditor.md : https://pandao.github.io/editor.md/
validator.js : https://github.com/validatorjs/validator.js

Vue工具类

vue-draggable : https://www.itxst.com/vue-draggable/tutorial.html
vue-qr : https://www.npmjs.com/package/vue-qr
vue-cropper : https://github.com/xyxiao001/vue-cropper
vue-lazyload : https://www.npmjs.com/package/vue-lazyload

vue-simple-upload : https://github.com/saivarunk/vue-simple-upload

vue-awesome-swiper (swiper的vue封装) https://github.com/surmon-china/vue-awesome-swiper

CSS

tailwindcss https://www.tailwindcss.cn/

sass https://sass.bootcss.com/documentation

less https://less.bootcss.com/

PHP处理富文本html标签的方法

使用XML 相关扩展操作

https://www.php.net/manual/zh/refs.xml.php

示例代码

以处理图片地址为例子

  $htmlContent = '<p>测试<img src='xxx.jpeg'></p>';
  $htmlDom = new DOMDocument();
  @$htmlDom->loadHTML($htmlContent);
  $images = $htmlDom->getElementsByTagName('img');
  
  //处理富文本中的图片
  foreach ($images as $key => $image)
  {  
      //获取img图片的src属性值
      $src = $image->getAttribute('src');
      //拼接成完整的url
      $image->setAttribute('src', 'http://xxxx.com'.$src);
  }
  
  //获取body标签的内容
  $body = $htmlDom->getElementsByTagName('body')->item(0);
  //转换成html字符串
  $content = $htmlDom->saveHTML($body);
  //替换掉body标签
  $content = str_replace(['<body>', '</body>'], '', $content);

数据库设计相关文章索引

Mysql FAQ

隐式类型转换

例如 pid 字段类型是 int,我们 where pid = “1”,这样就会触发隐式类型转换。字段为数字类型,字符串数字转换成数字时,并不会导致索引失效如下图

当where查询操作符**左边为字符类型**时发生了隐式转换,那么会导致索引失效,造成全表扫描效率极低。

name为字符串类型,传入了数字类型001 转换后索引失效

导致查询结果不符合预期

类型隐式转换规则

当操作符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容,某些转换是隐式发生的

如果不与数字比较,则将十六进制值视为二进制字符串


如果参数之一是a TIMESTAMP或 DATETIME column,而另一个参数是常量,则在执行比较之前,该常量将转换为时间戳。这样做是为了使ODBC更友好。对于的参数,此操作未完成 IN()。为了安全起见,在进行比较时请始终使用完整的日期时间,日期或时间字符串。例如,要在BETWEEN与日期或时间值一起使用时获得最佳结果 ,请使用CAST()将值显式转换为所需的数据类型。


一个或多个表中的单行子查询不被视为常量。例如,如果子查询返回要与DATETIME 值进行比较的整数,则比较将作为两个整数进行。整数不转换为时间值。要将操作数作为DATETIME值进行比较 ,请使用 CAST()将子查询值显式转换为DATETIME


如果参数之一是十进制值,则比较取决于另一个参数。如果另一个参数是十进制或整数值,则将参数作为十进制值进行比较;如果另一个参数是浮点值,则将参数作为浮点值进行比较。


在所有其他情况下,将参数作为浮点数(实数)进行比较。例如,将字符串和数字操作数进行比较,将其作为浮点数的比较。

条件的由字符转为浮点时候

不以数字开头的字符串都将转换为0。如’abc’、’a123bc’、’abc123’都会转化为0;
以数字开头的字符串转换时会进行截取,从第一个字符截取到第一个非数字内容为止。比如’123abc’会转换为123,’012abc’会转换为012也就是12,’5.3a66b78c’会转换为5.3,其他同理。

避免规则,通过程序处理,尽量使类型与数据库字段保持一致

参考

mysql-8.隐式转换导致索引失效或查出不符合where条件结果

类型转换官方文档

Mysql安全指南

禁用local-infile选项访问控制描述

禁用local_infile选项会降低攻击者通过SQL注入漏洞器读取敏感文件的能力检查提示

–加固建议

编辑Mysql配置文件<conf_path>/my.cnf,在[mysqld] 段落中配置local-infile参数为0,并重启mysql服务:

local-infile=0

确保没有用户配置了通配符主机名身份鉴别描述

避免在主机名中只使用通配符,有助于限定可以连接数据库的客户端,否则服务就开放到了公网检查提示

–加固建议

执行SQL更新语句,为每个用户指定允许连接的host范围。

  1. 登录数据库,执行use mysql; ;
  2. 执行语句select user,Host from user where Host='%';查看HOST为通配符的用户;
  3. 删除用户或者修改用户host字段,删除语句:DROP USER 'user_name'@'%'; 。更新语句:update user set host = <new_host> where host = '%';
  4. 执行SQL语句:
OPTIMIZE TABLE user;
flush privileges;

禁用symbolic-links选项服务配置描述

禁用符号链接以防止各种安全风险检查提示

–加固建议

编辑Mysql配置文件<conf_path>/my.cnf,在[mysqld] 段落中配置symbolic-links=0,5.6及以上版本应该配置为skip_symbolic_links=yes,并重启mysql服务。

修改默认3306端口服务配置描述

避免使用熟知的端口,降低被初级扫描的风险检查提示

–加固建议

编辑<conf_path>/my.cnf文件,[mysqld] 段落中配置新的端口参数,并重启MySQL服务:

port=3506 

为MySQL服务使用专用的最低特权账户访问控制描述

使用最低权限账户运行服务可减小MySQL天生漏洞的影响。受限账户将无法访问与MySQL无关的资源,例如操作系统配置。检查提示

–加固建议

使用非root和非sudo权限用户启动MySQL服务

禁止使用–skip-grant-tables选项启动MySQL服务访问控制描述

使用此选项,会导致所有客户端都对所有数据库具有不受限制的访问权限。检查提示

–加固建议

编辑Mysql配置文件<conf_path>/my.cnf,删除skip-grant-tables参数,并重启mysql服务

删除’test’数据库服务配置描述

测试数据库可供所有用户访问,并可用于消耗系统资源。删除测试数据库将减少MySQL服务器的攻击面。检查提示

–加固建议

登录数据库执行以下SQL语句删除test数据库:

DROP DATABASE test;
flush privileges;

确保配置了log-error选项安全审计描述

启用错误日志可以提高检测针对mysql和其他关键消息的恶意尝试的能力,例如,如果错误日志未启用,则连接错误可能会被忽略。检查提示

–加固建议

编辑Mysql配置文件<conf_path>/my.cnf,在[mysqld_safe] 段落中配置log-error参数,<log_path>代表存放日志文件路径,如:/var/log/mysqld.log,并重启mysql服务:

log-error=<log_path>

确保log-raw选项没有配置为ON安全审计描述

当log-raw记录启用时,有权访问日志文件的人可能会看到纯文本密码。检查提示

–加固建议

编辑Mysql配置文件<conf_path>/my.cnf,删除log-raw参数,并重启mysql服务

匿名登录检查身份鉴别描述

检查MySQL服务是否允许匿名登录检查提示

–加固建议

登录MySQL数据库,执行以下命令删除匿名账户:

 delete from user where user='';
flush privileges;

数据库登录弱口令身份鉴别描述

若系统使用弱口令,存在极大的被恶意猜解入侵风险,需立即修复。检查提示

–加固建议

登录mysql数据库;
查看数据库用户密码信息:`SELECT user, host, authentication_string FROM user;` 部分版本查询命令为:`SELECT user, host, password FROM user;` 
根据查询结果及弱密码告警信息修改具体用户的密码:`SET PASSWORD FOR '用户名'@'主机' = PASSWORD('新密码');`
执行刷新命令:`flush privileges;` 

新口令应符合复杂性要求:

1、长度8位以上
2、包含以下四类字符中的三类字符:
英文大写字母(A 到 Z)
英文小写字母(a 到 z)
10 个基本数字(0 到 9)
非字母字符(例如 !、$、#、%、@、^、&)
3、避免使用已公开的弱口令,如:abcd.1234 、admin@123等

Redis安全指南

开启redis密码认证,并设置高复杂度密码 身份鉴别描述

redis在redis.conf配置文件中,设置配置项requirepass, 开户密码认证。 redis因查询效率高,auth这种命令每秒能处理9w次以上,简单的redis的密码极容易为攻击者暴破。 检查提示

存在弱密码(配置文件|密码):/usr/local/redis/etc/redis.conf|加固建议

打开redis.conf,找到requirepass所在的地方,修改为指定的密码,密码应符合复杂性要求:

1、长度8位以上
2、包含以下四类字符中的三类字符:
英文大写字母(A 到 Z)
英文小写字母(a 到 z)
10 个基本数字(0 到 9)
非字母字符(例如 !、$、#、%、@、^、&)
3、避免使用已公开的弱口令,如:abcd.1234 、admin@123等

再去掉前面的#号注释符,然后重启redis

禁止监听在公网 访问控制描述

Redis监听在0.0.0.0,可能导致服务对外或内网横向移动渗透风险,极易被黑客利用入侵。\u0009检查提示

–加固建议

在redis的配置文件redis.conf中配置如下: bind 127.0.0.1或者内网IP,然后重启redis

禁止使用root用户启动 访问控制描述

使用root权限去运行网络服务是比较有风险的(nginx和apache都是有独立的work用户,而redis没有)。redis crackit 漏洞就是利用root用户的权限来替换或者增加authorized_keys,来获取root登录权限的 检查提示

–加固建议

使用root切换到redis用户启动服务:

useradd -s /sbin/nolog -M redis 
sudo -u redis /<redis-server-path>/redis-server /<configpath>/redis.conf 2&1>/dev/null &   

打开保护模式 访问控制描述

redis默认开启保护模式。要是配置里没有指定bind和密码,开启该参数后,redis只能本地访问,拒绝外部访问。检查提示

–加固建议

redis.conf安全设置: # 打开保护模式 protected-mode yes

版本存在安全漏洞入侵防范描述

Redis以下版本存在漏洞,容易被入侵 1. Redis 2.8.1 之前版本和 3.0.2 之前 3.x 版本存在字节码命令执行漏洞 https://avd.aliyun.com/detail?id=AVD-2015-4335 2. Redis 4.x至5.0.5版本存在主从复制命令执行漏洞 3. Redis 3.2.0 至 3.2.4 版本存在缓冲区溢出漏洞,可导致任意代码执行 https://avd.aliyun.com/detail?id=AVD-2016-8339检查提示

–加固建议

更新服务至最新版本,完成漏洞的修复,这些漏洞基于未授权访问或者服务存在弱口令,完成访问认证加固可降低被入侵风险。

限制redis 配置文件访问权限 文件权限描述

因为redis密码明文存储在配置文件中,禁止不相关的用户访问改配置文件是必要的,设置redis配置文件权限为600, 检查提示

–加固建议

执行以下命令修改配置文件权限:

chmod 600 /<filepath>/redis.conf

修改默认6379端口 服务配置描述

避免使用熟知的端口,降低被初级扫描的风险 检查提示

–加固建议

编辑文件redis的配置文件redis.conf,找到包含port的行,将默认的6379修改为自定义的端口号,然后重启redis

禁用或者重命名危险命令 入侵防范描述

Redis中线上使用keys *命令是非常危险的,应该禁用或者限制使用这些危险的命令,可降低Redis写入文件漏洞的入侵风险。检查提示

–加固建议

修改 redis.conf 文件,添加

rename-command FLUSHALL ""
rename-command FLUSHDB  ""
rename-command CONFIG   ""
rename-command KEYS     ""
rename-command SHUTDOWN ""
rename-command DEL ""
rename-command EVAL ""

然后重启redis。 重命名为”” 代表禁用命令,如想保留命令,可以重命名为不可猜测的字符串,如: rename-command FLUSHALL joYAPNXRPmcarcR4ZDgC

Redis未授权访问身份鉴别描述

Redis端口对外开放并且没有配置认证选项,未授权用户除了可直接获取数据库中所有信息,造成严重的信息泄露外,还可以通过未授权访问漏洞入侵攻击系统。检查提示

–加固建议

可以使用以下方法修复: 1、为Redis服务配置认证,在配置文件redis.conf中requirepass 配置复杂密码,然后重启redis。 2、在Redis的配置文件redis.conf中配置如下: bind 127.0.0.1,只允许本机访问,然后重启redis