签到式救援系统CISS (LAMP+mailx)

前言

签到式救援系统CISS(Check In SOS System)主要功能:每天都需要在网页进行签到,如果有一天(可自定义天数)没有签到,将按情况发送邮件通知到收件人

1)构思图:
思维导图

2)您需要准备的:
系统:CentOS 7
网络:公网IP或者内网映射(外界网络可以使用IP、域名等直接访问到网页)
邮箱:163邮箱账号(或着使用其他能用mailx发出邮件的邮箱)

=============重要内容============

3)本文以LAMP环境作为基础,搭建流程可参见Centos7从”零”开始的个人网站搭建(LAMP)

===============================

4)如无特殊说明,本教程均使用root权限操作

5)您需要有一定的Linux基础

6)本教程编写时间:2021-12-04,因软件更新等因素,所有的教程都有时效性,请自行判别

7)本项目开源协议:BSD 3-Clause “New” or “Revised” License

【温馨提示】本项目存在的意义是让自己的生活过得更加美好,请您在使用或修改此项目时不要违背作者原意,更不要用来作恶。

—–欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达—–

 


文件目录树

文件目录树

 


防火墙设置

1)请在系统内开启防火墙开放以下端口,防火墙操作请参考:LAMP防火墙设置

SSH端口(默认为22)
网站访问端口(默认为80)
●建议:国内云服务器如未进行备案,不要使用80端口作为网站访问端口

2)如果是购买的云服务器,请留意管理页面中的防火墙规则,是否也开放了相关的端口

管理页面防火墙

 


MySQL数据库

设计图

数据库设计

下载sql文件

下载链接:ciss_db.sql

本人安装的mysql版本:5.7.36(版本不同,影响不大)
文件校验值(SHA256):18DECEF2189D34DDB263D8AA1BF513407AD5E1DD10BE36FFA5E4C2E463B03D87

sql文件导入

1)将ciss_db.sql上传到系统里,比如上传到 /usr/www 目录下

/usr/www/ciss_db.sql

2)登录数据库
mysql -uroot -p
输入密码进入mysql命令操作

3)创建ciss_db数据库
mysql>create database ciss_db;
mysql>use ciss_db;

4)source ciss_db.sql文件的绝对路径
mysql>source /usr/www/ciss_db.sql;

5)退出数据库
mysql>exit

创建签到用的用户名和密码

因为本系统在多数情况下为个人使用,所以网页上不能创建用户,需要使用以下脚本手动创建签到的用户

1)新建脚本:
vi /usr/www/ciss_create_user.sh

注意:如果您不懂怎么使用 vivim,请自行搜索学习

输入以下内容,请按个人情况修改“可编辑区”的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#!/bin/bash
#Edit by ZJHCOFI
#功能:创建签到用的用户名和密码
#后续漏洞修补(如有)通告页面:https://space.bilibili.com/9704701/dynamic
#2021-12-12 18:04

##########可编辑区#############
# 请修改 "" 内的内容 #

# 需要创建的用于签到的用户名(只能由大小写英文字母、数字或下划线组成,不能出现特殊字符和标点符号,限制20个字符)
ciss_user_name="admin"

# 该用户的密码(为了您的信息安全,请设置高强度密码)
ciss_user_passwd="Admin@321"


# mysql数据库用户名
mysql_user="root"

# mysql数据库密码
mysql_passwd="Bili@233"

# mysql数据库端口(默认为3306)
mysql_port="3306"

#########可编辑区结束#########

#-----------------------------
#-------以下代码请勿动--------
#-----------------------------

# 检测用户名/密码是否为空
if [[ "${ciss_user_name}" == "" || "${ciss_user_passwd}" == "" ]];then

echo -e "\n【错误】签到的用户名和密码不能为空!\n"
exit

else

# 如果不为空,将用户名全部转为小写,并进行合法性判断
user_name_lower=`echo -n ${ciss_user_name} | tr "[:upper:]" "[:lower:]"`
user_name_check=`echo -n "${user_name_lower}" | tr -d '^[0-9a-zA-Z_]+$'`
user_name_length=`echo ${user_name_lower} | awk -F "" '{print NF}'`

# 如果用户名不合法
if [[ "${user_name_check}" != "" || "${user_name_length}" -gt 20 ]];then

echo -e "\n【错误】用户名只能由大小写英文字母、数字或下划线组成,不能出现特殊字符和标点符号!\n用户名不能超过20个字符\n"
exit

else

# 如果用户名正常,检测用户名是否重复
mysql -P${mysql_port} -u${mysql_user} -p${mysql_passwd} ciss_db -e "select count(*) from ciss_user where user_name='${user_name_lower}'" > sql.temp
mysql_user_check=`tail -n 1 sql.temp`
mysql_printf_check=`echo -n "${mysql_user_check}" | tr -d '^[0-9]+$'`

# 如果数据库连接异常
if [[ "${mysql_user_check}" == "" || "${mysql_printf_check}" != "" ]];then

echo -e "\n【错误】数据库连接或者查询出现问题,请检查:\n1、可编辑区的数据库信息是否正确\n2、是否已使用root权限执行本脚本\n3、是否已正常导入sql文件\n"
exit

else

# 如果数据库连接正常,但用户名重复
if [[ "${mysql_user_check}" -gt 0 ]];then

echo -e "\n【错误】用户名重复,请换个用户名!\n"
exit

else

# 用户名不重复,新增信息
# 使用SHA256加密密码
passwd_sum=${user_name_lower}${ciss_user_passwd}
passwd_end=`printf ${passwd_sum} | sha256sum | cut -d " " -f 1`

#生成uuid
uuid=`uuidgen`

# mysql插入语句
mysql_insert="INSERT INTO ciss_user (user_id,user_name,user_passwd) VALUES ('${uuid}','${user_name_lower}','${passwd_end}');"

# 插入mysql
mysql -P${mysql_port} -u${mysql_user} -p${mysql_passwd} ciss_db -e "${mysql_insert}"

echo -e "\n【提示】如无报错,则新增用户成功\n【注】“mysql: [Warning] Using a password on the command line interface can be insecure.”不属于报错\n"

fi

fi

fi

fi

2)执行脚本:
sh /usr/www/ciss_create_user.sh
如无报错,则为创建用户成功

如需删除用户或忘记密码

1)如果需要删除自己创建的某个用户(忘记密码只能删除用户再创建),请登录数据库:
mysql -uroot -p
输入密码进入mysql命令操作

2)使用ciss_db数据库
mysql>use ciss_db;

3)删除用户
mysql>delete from ciss_user where user_name="您需要删除的用户名";

4)退出数据库
mysql>exit

 


PHP网页

成品下载

●下载链接:ciss_php.zip

请在网站目录下解压这些网页
解压密码:zjhcofi.com
文件校验值(SHA256):01514E413DE9714EB376F27B79346A844633754F3197A67E14A1165F4AC0CBC3

数据库连接页

●文件:webconn.php

【高危!】为了您的信息安全,请修改数据库连接页的文件名(后缀必须是php),越复杂越猜不透越好 ,比如改成:a83c36b6-1456-40a0-9c38-0a253670a0f2.php 等

附:uuid生成器

【注意】此网页内容需要按个人情况修改
$link=mysqli_connect(“数据库IP”,”数据库用户”,”数据库密码”,”数据库名”,”数据库端口”)

1
2
3
4
5
6
7
<?php
$link=mysqli_connect("127.0.0.1","root","Bili@233","ciss_db","3306");
if (!$link) {
die("数据库连接错误" . mysqli_connect_error());
}
mysqli_set_charset($link,'utf8');
?>

登录页

●文件:index.php

查找网页内的 webconn.php ,替换成您修改后的数据库连接页的文件名

签到页

●文件:check-in.php

查找网页内的 webconn.php ,替换成您修改后的数据库连接页的文件名

重置密码页

●文件:reset-pass.php

查找网页内的 webconn.php ,替换成您修改后的数据库连接页的文件名

css样式

●文件:css/main_bootstrap.min.css

在压缩包内,样式代码无需修改

●文件:css/main_styles.css

在压缩包内,样式代码无需修改

整体效果

登录页面

签到页面

 


mailx服务

邮箱设置

本人使用的是163邮箱,您也可以使用其他能用mailx发出邮件的邮箱

1)登录邮箱,点击“设置”-“POP3/SMTP/IMAP”-开启“POP3/SMTP服务”

邮箱设置1

2)记录授权码

邮箱设置2

mailx安装及配置

1)mailx安装指令:
yum install -y mailx

2)创建证书(163邮箱):

1
2
3
4
5
6
mkdir -p /root/.certs/
echo -n | openssl s_client -connect smtp.163.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/163.crt
certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/163.crt
certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/163.crt
certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ~/.certs/./ -i 163.crt
certutil -L -d /root/.certs

3)编辑mailx配置文件
vi /etc/mail.rc

在最下方新增以下内容,请按个人情况修改

1
2
3
4
5
6
7
8
set from=test@163.com
set smtp=smtps://smtp.163.com:465
set smtp-auth-user=test@163.com
set smtp-auth-password=QYYNRULAYRGFYSLE
set smtp-auth=login
set smtp-use=starttls
set ssl-verify=ignore
set nss-config-dir=/root/.certs

说明
set from:填您的邮箱地址
set smtp:smtp服务器地址465端口
set smtp-auth-user:填您的邮箱地址
set smtp-auth-password:邮箱名对应的密码或者授权码(163邮箱为授权码)
set smtp-auth:SMTP的认证方式(默认为login)
set ssl-verify:SSL认证方式
set nss-config-dir:证书所在目录

4)发送测试邮件:

echo "测试邮件正文" | mailx -s "测试邮件主题" 收件人@qq.com

收到邮件

注意事项

1)QQ邮箱请参考:Centos使用mailx465端口发送邮件

2)如果不知道怎么在微信上设置QQ邮箱提醒,请搜索“微信设置qq邮箱提醒”

3)mailx参数说明:mailx命令_Linux mailx命令使用详解:用于发送和接收邮件

 


IP封禁(防止攻击)

前置条件

请开启系统防火墙并设置开机自启防火墙设置

编辑封禁脚本

●新建脚本:
vi /usr/www/ciss_ban_ip.sh

输入以下内容,请按个人情况修改“可编辑区”的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!/bin/bash
#Edit by ZJHCOFI
#功能:封禁IP(防止攻击)
#后续漏洞修补(如有)通告页面:https://space.bilibili.com/9704701/dynamic
#2021-12-12 19:15

##########可编辑区#############
# 请修改 "" 内的内容 #

# 24小时内单个IP最大访问次数(超过此次数将被封禁,建议设置为50)
ip_num="50"

# 封禁IP记录文件保存路径
ban_ip_log="/usr/www/ban_ip.log"

# mysql数据库用户名
mysql_user="root"

# mysql数据库密码
mysql_passwd="Bili@233"

# mysql数据库端口(默认为3306)
mysql_port="3306"

#########可编辑区结束#########

#-----------------------------
#-------以下代码请勿动--------
#-----------------------------

# 当前时间
ban_time=$(date "+%Y-%m-%d %H:%M:%S")

# 检测一天内的ip访问次数
select_sql_24_hour="select visit_ip from ciss_ip_num_24_hour where num >= ${ip_num}"

# 检测数据库连接
mysql -P${mysql_port} -u${mysql_user} -p${mysql_passwd} ciss_db -e "select count(*) from ciss_ip_num_24_hour where num >= ${ip_num}" > sql.temp
mysql_check=`tail -n 1 sql.temp`
mysql_printf_check=`echo -n "${mysql_check}" | tr -d '^[0-9]+$'`

# 如果数据库连接异常
if [[ "${mysql_check}" == "" || "${mysql_printf_check}" != "" ]];then

echo -e "\n【错误】数据库连接或者查询出现问题,请检查:\n1、可编辑区的数据库信息是否正确\n2、是否已使用root权限执行本脚本\n3、是否已正常导入sql文件\n"
exit

else

mysql -P${mysql_port} -u${mysql_user} -p${mysql_passwd} ciss_db -e "$select_sql_24_hour" | grep -v ip | while read a
do
echo -e "${ban_time}\t${a}" >> ${ban_ip_log}
if [ $a != "" ]; then
iptables -I INPUT -s $a -j DROP
fi
done

fi

设置定时任务

●编辑定时任务:
vi /etc/crontab

在最下面新增以下内容:

1
2
3
4
#封禁IP,防止攻击
*/2 * * * * root sh /usr/www/ciss_ban_ip.sh
#每6小时恢复一次IP访问权限
0 */6 * * * root iptables -F

IP误封禁处理

如果是自己的IP被封禁,请换个IP登录服务器(比如使用手机流量或重启光猫等),然后执行以下操作
如果是别人的IP被封禁,直接在服务器执行以下操作

1)查看被封禁的IP:
iptables -L

2)登录数据库:
mysql -uroot -p
输入密码进入mysql命令操作

3)使用ciss_db数据库
mysql>use ciss_db;

4)删除24内的ip访问记录
mysql>delete from ciss_ip_visit where visit_time >= (now() - interval 24 hour);

5)退出数据库
mysql>exit

6)清空防火墙的封禁IP:
iptables -F

 


按照签到情况发送邮件

编辑脚本

●新建脚本:
vi /usr/www/ciss_send_mail.sh

输入以下内容,请按个人情况修改“可编辑区”的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/bin/bash
#Edit by ZJHCOFI
#功能:按照特定情况发送邮件
#后续漏洞修补(如有)通告页面:https://space.bilibili.com/9704701/dynamic
#2021-12-12 21:31

##########可编辑区#############
# 请修改 "" 内的内容 #

#-----用户信息
# 签到的用户名
user_name="admin"
# 邮件发送记录保存路径
send_mail_log="/usr/www/send_mail.log"

#-----情况一
# 连续未签到几天执行?(注:如果情况一符合条件,会在情况二符合条件前的每天执行)
Attention_day="1"
# 邮件标题
Attention_title="签到提示"
# 邮件正文(换行请使用"\n")
Attention_text="该签到啦!\n再不签到你的隐私就自动发出去了!"
# 邮件附件路径(没有附件请留空)
Attention_appendix=""
# 邮件收件人(多个收件人请用英文逗号","分割)
Attention_addressee="test@qq.com"

#-----情况二
# 连续未签到几天执行?(只在符合条件的当天执行)
Warning_day="3"
# 邮件标题
Warning_title="ZJH可能遭遇意外,请尽快联系他"
# 邮件正文(换行请使用"\n")
Warning_text="ZJH可能遭遇意外,请尽快联系他\n他的手机号:12345\n他父亲的手机号:12345\n他母亲的手机号:12345\n\n此邮件由签到系统自动发出,他已经${Warning_day}天没签到了"
# 邮件附件路径(没有附件请留空)
Warning_appendix=""
# 邮件收件人(多个收件人请用英文逗号","分割)
Warning_addressee="test@qq.com,test@163.com"

#-----情况三
# 连续未签到几天执行?(只在符合条件的当天执行)
Error_day="7"
# 邮件标题
Error_title="本人物品一览表"
# 邮件正文(换行请使用"\n")
Error_text="如果您收到此邮件,请将该邮件附件给到XXX。\n本人各种账号密码等内容在附件内(该附件已加密,只有XXX知道密码)\n\n此邮件由签到系统自动发出,他已经${Error_day}天没签到了"
# 邮件附件路径(没有附件请留空)
Error_appendix="/usr/www/ZJH_something.zip"
# 邮件收件人(多个收件人请用英文逗号","分割)
Error_addressee="test@qq.com,test@163.com"

#-----数据库信息
# mysql数据库用户名
mysql_user="root"

# mysql数据库密码
mysql_passwd="Bili@233"

# mysql数据库端口(默认为3306)
mysql_port="3306"

#########可编辑区结束#########

#-----------------------------
#-------以下代码请勿动--------
#-----------------------------

# 当前时间
send_time=$(date "+%Y-%m-%d %H:%M:%S")

# 检测数据库连接
mysql -P${mysql_port} -u${mysql_user} -p${mysql_passwd} ciss_db -e "select count(*) from ciss_user where user_name='${user_name}'" > sql.temp
mysql_check=`tail -n 1 sql.temp`
mysql_printf_check=`echo -n "${mysql_check}" | tr -d '^[0-9]+$'`

# 如果数据库连接异常
if [[ "${mysql_check}" == "" || "${mysql_printf_check}" != "" ]];then

echo -e "\n【错误】数据库连接或者查询出现问题,请检查:\n1、可编辑区的数据库信息是否正确\n2、是否已使用root权限执行本脚本\n3、是否已正常导入sql文件\n"
exit

else

 # 如果数据库连接正常,但用户名不存在
 if [[ "${mysql_check}" == "0" ]];then

echo -e "\n【错误】用户名不存在,请修改!\n"
exit

else
# 未签到的天数查询
no_check_days=`mysql -P${mysql_port} -u${mysql_user} -p${mysql_passwd} ciss_db -e "SELECT datediff(DATE_FORMAT(now(),'%Y-%m-%d'),DATE_FORMAT(c.check_time,'%Y-%m-%d')) FROM ciss_user u left join ciss_check_in c on u.user_id = c.check_user_id where u.user_name = '${user_name}' order by c.check_time desc limit 1" | grep -v check`
# 如果没有签到记录
if [[ "${no_check_days}" == "" || "${no_check_days}" == "NULL" ]];then
  echo -e "${send_time}\t无签到记录" >> ${send_mail_log}
exit
fi
# 如果是情况一
if [[ "${no_check_days}" -ge "${Attention_day}" && "${no_check_days}" -lt "${Warning_day}" ]];then
if [[ "${Attention_appendix}" != "" ]];then
echo -e "${Attention_text}" | mailx -s "${Attention_title}" -a ${Attention_appendix} ${Attention_addressee}
echo -e "发送记录:\t${send_time}\t${Attention_title}\t${Attention_text}\t${Attention_addressee}\t${Attention_appendix}" >> ${send_mail_log}
else
echo -e "${Attention_text}" | mailx -s "${Attention_title}" ${Attention_addressee}
echo -e "发送记录:\t${send_time}\t${Attention_title}\t${Attention_text}\t${Attention_addressee}" >> ${send_mail_log}
fi
fi
# 如果是情况二
if [[ "${no_check_days}" == "${Warning_day}" ]];then
if [[ "${Warning_appendix}" != "" ]];then
echo -e "${Warning_text}" | mailx -s "${Warning_title}" -a ${Warning_appendix} ${Warning_addressee}
echo -e "发送记录:\t${send_time}\t${Warning_title}\t${Warning_text}\t${Warning_addressee}\t${Warning_appendix}" >> ${send_mail_log}
else
echo -e "${Warning_text}" | mailx -s "${Warning_title}" ${Warning_addressee}
echo -e "发送记录:\t${send_time}\t${Warning_title}\t${Warning_text}\t${Warning_addressee}" >> ${send_mail_log}
fi
fi
# 如果是情况三
if [[ "${no_check_days}" == "${Error_day}" ]];then
if [[ "${Error_appendix}" != "" ]];then
echo -e "${Error_text}" | mailx -s "${Error_title}" -a ${Error_appendix} ${Error_addressee}
echo -e "发送记录:\t${send_time}\t${Error_title}\t${Error_text}\t${Error_addressee}\t${Error_appendix}" >> ${send_mail_log}
else
echo -e "${Error_text}" | mailx -s "${Error_title}" ${Error_addressee}
echo -e "发送记录:\t${send_time}\t${Error_title}\t${Error_text}\t${Error_addressee}" >> ${send_mail_log}
fi
fi

fi

fi

设置定时任务

●编辑定时任务:
vi /etc/crontab

在最下面新增以下内容:

1
2
#每天20点检测签到情况,并按情况发送邮件(如果每天想检测多次,再新增定时任务即可)
00 20 * * * root sh /usr/www/ciss_send_mail.sh

支持多用户

●如果需要检测多个用户的签到情况,并按情况发送邮件:

1)新建一个脚本(比如:vi /usr/www/ciss_send_mail_2.sh),复制上面的脚本内容
2)修改新脚本的“可编辑区”的内容
3)添加新脚本的定时任务

注意事项

1)请在正式使用前,测试一下脚本是否会报错,邮件是否能正常接收
2)如有报错,请检查可编辑区的内容是否正确,各种路径是否正确,环境是否已完成搭建

最终效果

收到邮件

收到邮件2

文章目录
  1. 1. 前言
  2. 2. 文件目录树
  3. 3. 防火墙设置
  4. 4. MySQL数据库
    1. 4.1. 设计图
    2. 4.2. 下载sql文件
    3. 4.3. sql文件导入
    4. 4.4. 创建签到用的用户名和密码
    5. 4.5. 如需删除用户或忘记密码
  5. 5. PHP网页
    1. 5.1. 成品下载
    2. 5.2. 数据库连接页
    3. 5.3. 登录页
    4. 5.4. 签到页
    5. 5.5. 重置密码页
    6. 5.6. css样式
    7. 5.7. 整体效果
  6. 6. mailx服务
    1. 6.1. 邮箱设置
    2. 6.2. mailx安装及配置
    3. 6.3. 注意事项
  7. 7. IP封禁(防止攻击)
    1. 7.1. 前置条件
    2. 7.2. 编辑封禁脚本
    3. 7.3. 设置定时任务
    4. 7.4. IP误封禁处理
  8. 8. 按照签到情况发送邮件
    1. 8.1. 编辑脚本
    2. 8.2. 设置定时任务
    3. 8.3. 支持多用户
    4. 8.4. 注意事项
    5. 8.5. 最终效果