11.25 配置防盗链 11.26 访问控制Directory
11.25 配置防盗链
CURL +X 是来源IP
11.26 访问控制Directory
11.27 访问控制FilesMatch
• 通过限制referer来实现防盗链的功能
• 配置文件增加如下内容
<Directory /data/wwwroot/www.123.com>
SetEnvIfNoCase Referer "http://www.123.com" local_ref
SetEnvIfNoCase Referer "http://123.com" local_ref
SetEnvIfNoCase Referer "^$" local_ref
<filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif)">
Order Allow,Deny
Allow from env=local_ref
</filesmatch>
</Directory>
• curl -e "http://www.aminglinux.com/123.html" 自定义referer
11.25 配置防盗链
防盗链的功能可以通过限制referer来实现,不是本机服务器所认识的referer,不允许第三方服务器通过链接引用跳转至本机服务器进行访问。
修改虚拟主机配置文件
<Directory /data/wwwroot/def.com> //定义访问目录
SetEnvIfNoCase Referer "http://def.com" local_ref //设置referer白名单
SetEnvIfNoCase Referer "http://www.def.com" local_ref //设置referer白名单
SetEnvIfNoCase Referer "^$" local_ref //设置referer白名单(空regerer)
<filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif)"> //定义防盗链需要防护的文件类型
Order Allow,Deny //访问控制规则
Allow from env=local_ref
</filesmatch>
</Directory>
空referer:直接在浏览器输入目的域名,则referer为空。
SetEnvIfNoCase Referer "http://www.111.com" local_ref
SetEnvIfNoCase Referer "http://111.com" local_re
第一条是 哪里跳过来 第二条是直接访问 第一个是白名单,第二个等自己直接打上去这个地址
结果测试
从浏览器直接访问时(空referer),访问正常 测试 http://www.def.com/test.txt
经过博客网站进行访问时,博客网站域名没有加入网站白名单,防盗链生效,访问被拒绝
curl -e "http://www.qq.com/123.html" -x 192.168.88.5:80 def.com/test.txt -I
HTTP/1.1 403 Forbidden
Date: Sun, 03 Jun 2018 09:19:19 GMTServer: Apache/2.4.33 (Unix) PHP/5.6.32Content-Type: text/html; charset=iso-8859-1
curl -e可以自定义referer,进行模拟测试。
11.26 访问控制Directory
访问控制可以限制一些白名单IP,只有白名单上的IP才可以进行正常访问,否则全部拒绝
修改虚拟主机配置文件
<Directory /data/wwwroot/def.com/admin/>
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Directory>
Order用于定义顺序,上述文件中的顺序为先deny(禁止)后allow(允许),并且和防火墙规则匹配机制不同的是,下方具体规则的先后顺序和真正执行的顺序无关,且会按照从先至后依次全部匹配,按照上述文件的策略顺序,最终只有源IP为127.0.0.1才可以正常访问。
结果测试
[root@linux-5 admin]# curl -x 127.0.0.1:80 def.com/admin/test.php -I
HTTP/1.1 200 OK
Date: Sun, 03 Jun 2018 11:30:16 GMTServer: Apache/2.4.33 (Unix) PHP/5.6.32X-Powered-By: PHP/5.6.32Cache-Control: max-age=0Expires: Sun, 03 Jun 2018 11:30:16 GMTContent-Type: text/html; charset=UTF-8
[root@linux-5 admin]# curl -x 192.168.88.5:80 def.com/admin/test.php -I
HTTP/1.1 403 Forbidden
Date: Sun, 03 Jun 2018 11:30:27 GMTServer: Apache/2.4.33 (Unix) PHP/5.6.32Content-Type: text/html; charset=iso-8859-1
虽然-x选项后面的IP地址为目的IP,但是127.0.0.1为主机回环IP,访问时也需要用127.0.0.1作为源IP进行访问,因此满足条件,可以正常访问。同理访问外部网卡地址也需要用外部网卡IP进行访问,不满足访问控制条件,因此无法访问。
11.26 访问控制Directory
• 核心配置文件内容
<Directory /data/wwwroot/www.123.com/admin/> 必须里面的目录
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Directory>
Order deny,allow ## 定义顺序 是先 拒绝还是先 允许
Deny from all ##先被拒绝
Allow from 127.0.0.1 ##再被允许
上述文件中的顺序为先deny(禁止)后allow(允许)
黑名单 黑名单就是全部都同意然后挑几个拒绝,白名单就是全拒绝然后挑几个同意
curl -x127.0.0.1:80 www.111.com/admin/index.php
正确配置文件
<Directory /data/wwwroot/111.com/admin/>
Order deny,allow
Deny from all
Allow from 172.16.90.41
Allow from 172.16.20.16
</Directory>
• curl测试状态码为403则被限制访问了
可以添加多个IP
11.27 访问控制FilesMatch
有时只需要限制某些访问链接,且访问链接中含有一些特殊符号(?、&等),对整个目录进行限制较不合理,可以使用FilesMatch进行限制。
修改虚拟主机配置文件
<Directory /data/wwwroot/def.com>
<FilesMatch "admin.php(.*)">
Order deny,allow
Deny from all
Allow from 127.0.0.1
</FilesMatch>
</Directory>
使用.*代指PHP文件后所有特殊符号 针对文件
正确设置
<Directory /data/wwwroot/111.com/admin/>
<FilesMatch admin.php(.*)>
Order deny,allow
Deny from all
Allow from 127.0.0.1
</FilesMatch>
</Directory>
测试结果
[root@linux-5 admin]# curl -x 192.168.88.5:80 def.com/admin.php? -I
HTTP/1.1 403 Forbidden
Date: Sun, 03 Jun 2018 11:58:16 GMTServer: Apache/2.4.33 (Unix) PHP/5.6.32Content-Type: text/html; charset=iso-8859-1
[root@linux-5 admin]# curl -x 127.0.0.1:80 def.com/admin.php? -I
HTTP/1.1 200 OK
Date: Sun, 03 Jun 2018 11:58:34 GMTServer: Apache/2.4.33 (Unix) PHP/5.6.32X-Powered-By: PHP/5.6.32Cache-Control: max-age=0Expires: Sun, 03 Jun 2018 11:58:34 GMTContent-Type: text/html; charset=UTF-8
正确配置
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/abc.com"
ServerName abc.com
ServerAlias www.abc.com www.123.com
ErrorLog "logs/abc.com-error_log"
CustomLog "logs/abc.com-access_log" common
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/111.com"
ServerName www.111.com
ServerAlias www.example.com www.2111.com www.222.com
# <Directory /data/wwwroot/111.com>
# AllowOverride AuthConfig
# AuthName "111.com user auth"
# AuthType Basic
# AuthUserFile /data/.htpasswd
# require valid-user
#</Directory>
# 核心配置文件内容
<Directory /data/wwwroot/111.com/admin/>
<FilesMatch admin.php(.*)>
Order deny,allow
Deny from all
Allow from 172.16.20.16
</FilesMatch>
</Directory>
<Directory /data/wwwroot/www.111.com>
SetEnvIfNoCase Referer "http://www.111.com" local_ref
SetEnvIfNoCase Referer "http://111.com" local_ref
SetEnvIfNoCase Referer "^$" local_ref
<FilesMatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)">
Order Allow,Deny
Allow from env=local_ref
</FilesMatch>
</Directory>
ErrorLog "logs/111.example.com-error_log"
SetEnvIf Request_URI ".*\.gif$" img
SetEnvIf Request_URI ".*\.jpg$" img
SetEnvIf Request_URI ".*\.png$" img
SetEnvIf Request_URI ".*\.bmp$" img
SetEnvIf Request_URI ".*\.swf$" img
SetEnvIf Request_URI ".*\.js$" img
SetEnvIf Request_URI ".*\.css$" img
CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/111.com-access_%Y%m%d.log 86400" combined env=!img
</VirtualHost>
扩展
几种限制ip的方法 http://ask.apelearn.com/question/6519
apache 自定义header http://ask.apelearn.com/question/830
apache的keepalive和keepalivetimeout http://ask.apelearn.com/question/556
apache开启压缩 http://ask.apelearn.com/question/5528
apache2.2到2.4配置文件变更 http://ask.apelearn.com/question/7292
apache options参数 http://www.365mini.com/page/apache-options-directive.htm
apache禁止trace或track防止xss http://ask.apelearn.com/question/1045
apache 配置https 支持ssl http://ask.apelearn.com/question/1029
apache rewrite教程 http://coffeelet.blog.163.com/blog/static/13515745320115842755199/http://www.cnblogs.com/top5/archive/2009/08/12/1544098.html
apache rewrite 出现死循环 http://ask.apelearn.com/question/1043
php错误日志级别参考 http://ask.apelearn.com/question/6973
php开启短标签 http://ask.apelearn.com/question/120
php.ini详解 http://legolas.blog.51cto.com/2682485/493917
11.28 限定某个目录禁止解析PHP
•核心配置文件内容
<Directory /data/wwwroot/www.123.com/upload>
php_admin_flag engine off
</Directory>
• curl测试时直接返回了php源代码,并未解析
正确
<Directory /data/wwwroot/111.com/upload/> #这里一定要和服务器服务一样,(自己以前加了WWW出错老半天没找出原因)
php_admin_flag engine off
<FilesMatch (.*)\.php(.*)>
Order deny,allow #匹配PHP全部禁用
Deny from all # 不加Deny就会访问你的源代码
</FilesMatch>
</Directory>
mkdir upload 然后里面放一个PHP文件
11.29 限制user_agent 用户代理
•user_agent可以理解为浏览器标识
• 核心配置文件内容
<IfModule mod_rewrite.c> #改写
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR] #NC忽略大小写
RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC] #2个条件直接连接符
RewriteRule .* - [F]
</IfModule>
• curl -A "123123" 指定user_agent
[NC,OR] #2个条件直接连接符 匹配上面 或者下面这个不加OR是并且它或者它
{HTTP_USER_AGENT} 这个是定义条件
{HTTP_USER_AGENT}
RewriteRule .*\.jpg -[F] // 如果请求的是一个.jpg图片就拒绝
以后遇见这种配置前面就写.* 中间关键词再.*
11.30 PHP相关配置上
• 查看php配置文件位置
• /usr/local/php/bin/php -i|grep -i "loaded configuration file"
• date.timezone #定义时区 不然会出现告警信息
• 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
• error_log, log_errors, display_errors, error_reporting
• open_basedir
• php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/"
查看PHP路径位置 可以/data/wwwroot/111.com 创建一个php文件
<?php
phpinfo();
?>
•/usr/local/php/bin/php -i|grep -i "loaded configuration file" 这个方式不靠谱
vim /usr/local/php/etc/php.ini
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
• date.timezone
date.timezone = Asia/Shanghai
display_errors = Off #不希望把错误信息显示到游览器里
error_log = /tmp/php_errors.log 错误日志打开 放到tmp下面
touch /tmp/php_errors.log
chmod 777 /tmp/php_errors.log
最后实验游览器http://www.111.com/phpinfo.php
has been disabled for security reasons 出于安全原因被禁用
有错误日志就是对的
open_basedir #一个网站只有一目录,被黑了也只有一个目录
vim /usr/local/php/etc/php.ini #open_basedir 这个功能只要打开就可以,不要在里面设置,去虚拟主机里面设置vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
• php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/" 添加这行根据目录填写 TMP是一定要的
curl -A "a" -x127.0.0.1:80 http://111.com/index.php
11.30 PHP扩展模块
• /usr/local/php/bin/php -m //查看模块
• 下面安装一个redis的模块
• cd /usr/local/src/
• wget https://codeload.github.com/phpredis/phpredis/zip/develop
• mv develop phpredis-develop.zip
• yum install -y unzip yum install -y autoconf(可能少这个包)
• unzip phpredis-develop.zip
• cd phpredis-develop
• /usr/local/php/bin/phpize //生成configure文件
• /usr/local/php7/bin/phpize //生成7configure文件
• ./configure --with-php-config=/usr/local/php/bin/php-config
• ./configure --with-php-config=/usr/local/php7/bin/php-config //7
• make && make install
生成的文件
• /usr/local/php/bin/php -i |grep extension_dir //查看扩展模块存放目录,我们可以在php.ini中去自定义该路径
• vim /usr/local/php/etc/php.ini //增加一行配置(可以放到文件最后一行)
extension = redis.so
/usr/local/php/bin/php -m |grep redis //查看有没有这个文件
redis