11.25 配置防盗链
11.26 访问控制Directory
11.27 访问控制FilesMatch
11.28 限定某个目录禁止解析php
11.29 限制user_agent
11.30/11.31 php相关配置
11.32 php动态扩展模块装安
11.33扩展
11.34课堂笔记
11.25 配置防盗链
通过限制referer来实现防盗链的功能
配置文件增加如下内容
<Directory /data/wwwroot/www.123.com>
SetEnvIfNoCase Referer "http://www.123.com" local_ref
SetEnvIfNoCase Referer "http://123.com" local_ref
#定义Referer的白名单
#SetEnvIfNoCase Referer "^$" local_ref #这行不用先注释掉
<filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)">
Order Allow,Deny
#Order是定义顺序的,是先允许(Allow)还是拒绝(Deny)
Allow from env=local_ref
#将上面设置的白名单允许,其他的Deny拒绝掉(只有防盗链特殊,其他的Order都是最后匹配的生效的)
</filesmatch>
</Directory>
#filesmatch的f和m大小写都行
#referer指的是允许用户通过指定的其他网站链接访问本网站的图片等文件
#空referer则表示允许直接访问本网站的图片等文件链接地址
然后-t检查,然后graceful
/usr/local/apache2.4/bin/apachectl -t
/usr/local/apache2.4/bin/apachectl graceful
curl -e "http://www.qq.com/123.txt"
##自定义referer,要以"http://"开头
curl -e "http://www.qq.com/123.txt" -x127.0.0.1:80 123.com/123.png -I
#www.qq.com不在referer白名单里面,所以被限制访问
[[email protected] www.123.com]# curl -e "http://www.qq.com/123.txt" -x127.0.0.1:80 123.com/123.png -I
HTTP/1.1 403 Forbidden
Date: Fri, 14 Sep 2018 00:45:42 GMT
Server: Apache/2.4.34 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1
#www.123.com砸白名单里面,所以可以访问
[[email protected] www.123.com]# curl -e "http://www.123.com/123.txt" -x127.0.0.1:80 123.com/123.png -I
HTTP/1.1 200 OK
Date: Fri, 14 Sep 2018 01:00:19 GMT
Server: Apache/2.4.34 (Unix) PHP/7.1.6
Last-Modified: Thu, 13 Sep 2018 09:08:09 GMT
ETag: "18b42-575bd0bb17040"
Accept-Ranges: bytes
Content-Length: 101186
Content-Type: image/png
#将空referer设置白名单后,SetEnvIfNoCase Referer "^$" local_ref,直接输入网站图片链接可以访问
没设置空referer
[[email protected] www.123.com]# curl -x127.0.0.1:80 123.com/123.png -I
HTTP/1.1 403 Forbidden
Date: Fri, 14 Sep 2018 01:08:13 GMT
Server: Apache/2.4.34 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1
设置后,
[[email protected] www.123.com]# !curl
curl -x127.0.0.1:80 123.com/123.png -I
HTTP/1.1 200 OK
Date: Fri, 14 Sep 2018 01:09:19 GMT
Server: Apache/2.4.34 (Unix) PHP/7.1.6
Last-Modified: Thu, 13 Sep 2018 09:08:09 GMT
ETag: "18b42-575bd0bb17040"
Accept-Ranges: bytes
Content-Length: 101186
Content-Type: image/png
11.26 访问控制Directory
目的是限制目录访问
核心配置文件内容
<Directory /data/wwwroot/www.123.com/admin/>
Order deny,allow
#先执行deny语句,后执行allow语句
Deny from all
Allow from 127.0.0.1
</Directory>
#Order会从头到尾执行一遍,不管是Deny还是allow
#将127.0.01允许访问,其他的Deny掉
检查语法-t,然后重载文件grateful
#限制的是源ip访问,而curl -x指定的是目标ip
curl -x127.0.0.1:80 123.com/admin/1.php -I
#这个是127.0.0.1自己访问自己,123.com/admin/1.php
[[email protected] www.123.com]# curl -x127.0.0.1:80 123.com/admin/1.php -I
HTTP/1.1 200 OK
Date: Fri, 14 Sep 2018 01:16:37 GMT
Server: Apache/2.4.34 (Unix) PHP/7.1.6
X-Powered-By: PHP/7.1.6
Content-Type: text/html; charset=UTF-8
curl -x192.168.233.150 123.com/admin/1.php -I
#这是源ip192.168.233.150访问自己
[[email protected] www.123.com]# curl -x192.168.233.150:80 123.com/admin/1.php -I
HTTP/1.1 403 Forbidden
Date: Fri, 14 Sep 2018 01:16:47 GMT
Server: Apache/2.4.34 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1
当访问被限制目录下的不存在文件时,允许访问的源ip显示404状态码,被限制不允许访问的源ip显示403状态码
curl -x127.0.0.1:80 123.com/admin/aghf -I
[[email protected] www.123.com]# curl -x127.0.0.1:80 123.com/admin/aghf -I
HTTP/1.1 404 Not Found
Date: Fri, 14 Sep 2018 01:20:10 GMT
Server: Apache/2.4.34 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1
curl -x192.168.233.150:80 123.com/admin/aghf -I
[[email protected] www.123.com]# curl -x192.168.233.150:80 123.com/admin/aghf -I
HTTP/1.1 403 Forbidden
Date: Fri, 14 Sep 2018 01:20:48 GMT
Server: Apache/2.4.34 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1
11.27 访问控制FilesMatch
目的:匹配文件名(链接);有些网站的网址很长,还带有特殊字符,若干的参数等等
核心配置文件内容(在Directory中间插入FilesMatch)
<Directory /data/wwwroot/www.123.com>
<FilesMatch admin.php(.*)>
Order deny,allow
Deny from all
Allow from 127.0.0.1
</FilesMatch>
</Directory>
curl -x192.168.233.150:80 123.com/admin/ghfjkas -I
#状态码为404(可以访问的原因是不是被限制文件的句型,错误)
[[email protected] www.123.com]# curl -x192.168.233.150:80 123.com/admin/ghfjkas -I
HTTP/1.1 404 Not Found
Date: Fri, 14 Sep 2018 01:36:12 GMT
Server: Apache/2.4.34 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1
curl -x192.168.233.150:80 'http://123.com/admin.php?ghfjkas' -I
#状态码为403(被限制访问)
[[email protected] www.123.com]# curl -x192.168.233.150:80 'http://123.com/admin.php?ghfjkas' -I
HTTP/1.1 403 Forbidden
Date: Fri, 14 Sep 2018 01:36:18 GMT
Server: Apache/2.4.34 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1
curl -x127.0.0.1:80 'http://123.com/admin.php?ghfjkas' -I
#状态码为404(允许访问,出现错误)
[[email protected] www.123.com]# curl -x127.0.0.1:80 'http://123.com/admin.ph?gfjkas' -I
HTTP/1.1 404 Not Found
Date: Fri, 14 Sep 2018 01:36:42 GMT
Server: Apache/2.4.34 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1
11.28 限定某个目录禁止解析php
目的:网站允许上传图片,为了防止别有用心的人上传一些恶意的php文件,然后被网站的php解析,给网站带来不好的影响
核心配置文件内容(禁止目录解析php)
<Directory /data/wwwroot/www.123.com/upload>
php_admin_flag engine off
</Directory>
#curl测试时直接返回了php源代码,并未解析
curl -x127.0.0.1:80 'http://www.123.com/upload/123.php'
[[email protected] www.123.com]# curl -x127.0.0.1:80 'http://www.123.com/upload/123.php'
<?php
phpinfo();
?>
使用浏览器打开www.123.com/upload/123.php时,会直接下载123.php文件,说明根本没有解析123.php
这一段表示限制访问所有的php文件
<FilesMatch (.*)\.php(.*)>
Order allow,deny
Deny from all
#如果不加Deny,它会直接访问源代码
</FilesMatch>
将这一段插入禁止php解析后面
<Directory /data/wwwroot/www.123.com/upload>
php_admin_flag engine off
<FilesMatch (.*)\.php(.*)>
Order allow,deny
Deny from all
</FilesMatch>
</Directory>
实现的效果是不会返回源代码,显示状态为403
curl -x127.0.0.1:80 'http://www.123.com/upload/123.php'
[[email protected] www.123.com]# curl -x127.0.0.1:80 'http://www.123.com/upload/123.php'
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /upload/123.php
on this server.<br />
</p>
</body></html>
使用浏览器打开www.123.com/upload/123.php时,直接是403状态,Forbidden,连解析的机会都没有
11.29 限制user_agent
有时候网站可能受到cc攻击,攻击者通过一些手段让大量的主机访问网站,导致网站崩溃;cc攻击的特点是user_agent一致
user_agent可以理解为浏览器标识
核心配置文件内容(用到rewrite模块)
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC]
RewriteRule .* - [F]
</IfModule>
#OR作为连接符,或者的意思,
#NC表示忽略大小写
#F表示Forbidden;RewriteRule .* - [F]意思是直接Forbidden
curl -A "123 123" #-A表示模拟指定user_agent
curl -A "123 123" -x127.0.0.1:80 'http://www.123.com/123.php' -I
#状态为200
[[email protected] www.123.com]# curl -A "a" -x127.0.0.1:80 'http://www.123.com/123.php' -I
HTTP/1.1 200 OK
Date: Fri, 14 Sep 2018 01:58:38 GMT
Server: Apache/2.4.34 (Unix) PHP/7.1.6
X-Powered-By: PHP/7.1.6
Content-Type: text/html; charset=UTF-8
查看访问日志可看到user_agent变成 a
127.0.0.1 - - [14/Sep/2018:09:58:38 +0800] "HEAD http://www.123.com/123.php HTTP/1.1" 200 - "-" "a"
11.30/11.31 php相关配置
#精确查看网站php.ini配置文件位置方法
1、先去网站根目录下
cd /data/wwwroot/www.123.com
2、创建一个phpinfo的页面
vim 123.php
内容如下:
<?php
phpinfo();
?>
3、通过浏览器访问1.php的phpinfo页面查看php.ini的位置
如果发现配置文件没有加载,可以去php7的源码包目录下复制一个配置文件
cd /usr/local/src/php-7.1.6/
cp php.ini-development /usr/local/php7/etc/php.ini
然后重新加载httpd配置文件graceful
/usr/local/apache2.4/bin/apachectl -t
/usr/local/apache2.4/bin/apachectl graceful
然后刷新页面,找到Loaded Configuration File就可以了
4、找到php.ini的路径,然后修改这个配置文件就行了
php配置文件相关操作
1、
date.timezone
#要定义这个时区,不然可能会有一些告警信息
Asia/Shanghai #定义时区到上海
2、
#限定函数(禁用)
disable_functions
eval,assert,popen,passthru,escapeshellarg,escapeshellcmd,passthru,exec,system,chroot,scandir,chgrp,chown,escapeshellcmd,escapeshellarg,shell_exec,proc_get_status,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,leak,popepassthru,stream_socket_server,popen,proc_open,proc_close,phpinfo(一般企业会把phpinfo这个函数也禁掉)
php日志相关的操作
一、配置错误日志
1、
display_errors #on开启状态,会直接把错误信息显示在浏览器上面(会把该网页的目录暴露出来),要改为off,改为off后需要配置错误日志
2、
log_errors 默认是on,所以我们需要定义error_log来存放错误日志路径,
error_log /tmp/php_errors.los
3、
还需定义错误级别 error_reporting
默认是E_ALL,所有错误都纪录
生产环境当中一般用E_ALL & ~E_NOTICE(所有错误除了notice错误),将开头的#号去掉就行
注意:
#如果没有生成error_log,要检查定义配置文件的目录是否有写权限,而且写文件的人是Apache,即daemon
#保险起见,可以直接在错误日志文件目录下创建错误日志,添加777权限,
touch /tmp/php_errors.log; chmod 777 /tmp/php_errors.log
chown daemon:daemon /tmp/php_errors.log
二、限制网站目录open_basedir
一台服务器有多个站点,某个站点写的差,漏洞很多,被被人黑了拿到了服务器权限,,通过该网站的目录,可能导致其他站点被黑
open_basedir #定义受限制目录
php配置文件/usr/local/php7/etc/php.ini
#修改php配置文件针对的是所有站点,如果是针对单个站点的,应该修改虚拟主机配置文件/usr/local/apache2.4/conf/extra/httpd-vhosts.conf
1、针对全部站点,修改PHP配置文件
vim /usr/local/php7/etc/php.ini
open_basedir /data/wwwroot/www.123.com:/tmp
#添加受限制目录
#默认临时文件是放在/tmp/目录下
检查语法-t,然后重载graceful
curl -A "a" -x127.0.0.1:80 http://www.123.com/2.php -I
#状态码200正常
若是将open_basedir的目录放在/data/wwwroot/www.123456.com:/tmp下
curl -A "a" -x127.0.0.1:80 http://www.123.com/2.php -I
#状态码500
查看错误日志cat /tmp/php_errors.log
2、针对单个站点,修改虚拟主机配置文件
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
php_admin_value open_basedir "/data/wwwroot/www.123.com:/tmp/"
#在中间插入上面这行
检查语法-t,然后重载graceful
curl -A "a" -x127.0.0.1:80 http://www.123.com/2.php
11.32 php动态扩展模块安装
/usr/local/php/bin/php -m #查看模块
下面安装一个redis的模块
1、下载包
cd /usr/local/src/
wget https://codeload.github.com/phpredis/phpredis/zip/develop
2、将包改为.zip后缀,并解压
mv develop phpredis-develop.zip
unzip phpredis-develop.zip
3、生成configure文件
cd phpredis-develop
/usr/local/php7/bin/phpize #生成configure
4、编译模块包
./configure --with-php-config=/usr/local/php7/bin/php-config
make && make install
5、编辑php.ini配置文件,加载redis模块
/usr/local/php7/bin/php -i |grep extension_dir
#查看扩展模块存放目录,我们可以在php.ini中去自定义该路径
vim /usr/local/php7/etc/php.ini
#增加一行配置(可以放到文件最后一行)
extension = redis.so
错误:Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.
解决:yum install -y autoconf
免下载编译扩展模块方法
如果php源码包的/ext/目录下有zip这个目录,那可以跳过下载解压步骤,直接从生成configure文件开始(需要在zip目录下进行)
cd /usr/local/src/php-7.1.6/ext/zip
./configure --with-php-config=/usr/local/php7/bin/php-config
make && make install