第十一章LAMP架构(下)

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
 
 ##自定义referer,要以"http://"开头
 
curl -e "http://www.qq.com/123.txt" -x127.0.0.1:80 123.com/123.png  -I
#www.qq.com不在referer白名单里面,所以被限制访问
[root@xinlinux-03 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砸白名单里面,所以可以访问
[root@xinlinux-03 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
[root@xinlinux-03 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
 
设置后,
[root@xinlinux-03 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
[root@xinlinux-03 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访问自己
[root@xinlinux-03 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
[root@xinlinux-03 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
[root@xinlinux-03 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(可以访问的原因是不是被限制文件的句型,错误)
[root@xinlinux-03 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(被限制访问)
[root@xinlinux-03 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(允许访问,出现错误)
[root@xinlinux-03 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'
[root@xinlinux-03 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'
[root@xinlinux-03 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
[root@xinlinux-03 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.s
 
错误: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
 
 
11.33扩展
 
 
apache的keepalive和keepalivetimeout http://ask.apelearn.com/question/556
 
 
apache2.2到2.4配置文件变更 http://ask.apelearn.com/question/7292
 
 
apache禁止trace或track防止xss http://ask.apelearn.com/question/1045
 
apache 配置https 支持ssl http://ask.apelearn.com/question/1029
 
 
apache rewrite 出现死循环 http://ask.apelearn.com/question/1043
 
php错误日志级别参考 http://ask.apelearn.com/question/6973
 
 
 
 
11.34课堂笔记
一、配置防盗链
盗链,全称是盗取链接,假如我们的网站有很多好看的图片,别人可以查看我们网站图片的链接,然后
将链接放到自己的网站
 
空referer,表示直接打开本网站图片
指定 referer,借助其他网站链接打开本网站的图片
 
 
二、访问控制Directory
#Directory要从根目录开始(存在的目录)
#Directory一定是在DocumentRoot目录下
 
apa2.4以后用到的访问控制选项
 
DocumentRoot   /data/wwwroot/www.111.com
<Directory  /data/wwwroot/www.111.com/abc>
<Location  /123>=/data/wwwroot/www.111.com/123/
<files  index.html>
#files   index.html就表示匹配当前文件
#filesmatch  index 多了个正则表达,只要包含index就能匹配
 
 
三、访问控制FileMatch
Order顺序最后匹配的才生效
例如:
1、Order Allow,Deny  #先allow,后Deny(黑名单)
#允许几个ip,然后将他们几个全部拒绝
 
2、Order Deny,Allow  #先Deny,后Allow(白名单)
#将全部拒绝,然后允许几个ip
 
Allow/Deny  from的是客户端的ip
 
 
四、限定某个目录禁止解析php
有些目录是存放静态文件的目录,如图片目录,本身不需要允许php的解析,如果么注意,允许了PHP解析,而且有开放了该目录的文件上传权限。很可能被别有用心的人利用撒谎那个穿木马,导致服务器被攻破。除了开放人员砸程序开发过程中要注意安全的设计,也可以通过Apache限制某些目录的php解析。
 
 
五、限制user_agent
CC攻击是DDoS攻击的一种类型,使用代理服务器向受害服务器发送大量貌似合法的请求(通常使用HTTP GET)。CC根据其工具命名,攻击者创造性地使用代理机制,利用总舵广泛可用的免费代理服务器发动DDoS攻击。许多免费代理服务器支持匿名模式,这便是追踪变得非常困难。
 
#限制user_agent时,能精准的话尽量精准,避免使用NC;因为使用NC会消耗更多的CPU,而且时间会长一点
 
 
六、PHP相关配置
1)找出php配置文件的两个方法
1、命令行(有可能不准)
/usr/local/php/bin/php -i|grep -i "loaded configuration file"
2、通过phpinfo函数的页面查看(绝对准确)
 
2)禁用特殊函数
默认disable_functions为空
 
3)配置错误日志
1、display_errors  off
#排除问题的时候也可以打开为on,方便排查,但是要记得排查完关闭
2、指定error_log存放路径
error_log   /tmp/php_errors.los
 
4)open_basedir 限制网站目录,不能访问其他目录
 
 
七、php扩展模块安装
在PHP源码包中没有第三方模块的包,但是在源码包的/ext/目录下有很多扩展模块吗,如果所需要的扩展模块在该目录下,可以直接进行安装
例如安装zip
cd   /usr/local/src/php-7.1.6/ext/zip/
/usr/local/php7/bin/phpize
#生成配置文件
 
然后编译模块包,
./configure --with-php-config=/usr/local/php7/bin/php-config
make && make install
 
最后编辑php配置文件,添加一句:extension = zip.so
 
第二种方法:
类似yum的php安装模块工具/php/bin/pecl 
/usr/local/php7/bin/pecl  install  redis     #直接安装redis模块(包括编译,安装,添加extension = redis.so到php配置文件)
 
 
/usr/local/php7/bin/pecl list-all   #将所有的模块列出来
 
 
八、拓展
1、apache自定义header
#需要加载mod_headers模块
1)、 检查是否有mod_headers模块
 /usr/local/apache2/bin/apachectl  -l 
 
如果,显示有mode_headers.c  则是加载了这个模块,否则就需要重新编译一下了。
另外,如果你使用的是rpm安装的话,那肯定是已经加载了mod_headers这个模块的。
 
2).  在httpd.conf 中加入
  Header add MyHeader "Hello"
保存后,重启apache就可以了
双引号中的内容为自定义内容。当然这里的"MyHeader"也是可以自定义的。
3). 测试
curl  -I http://localhost
看是否显示有  MyHeader  "Hello"
 
 
2、 apache的keepalive和keepalivetimeout
在APACHE的httpd.conf中,KeepAlive指的是保持连接活跃,类似于Mysql的永久连接。换一句话说,如果将KeepAlive设置为On,那么来自同一客户端的请求就不需要再一次连接,避免每次请求都要新建一个连接而加重服务器的负担。     
 
KeepAlive的连接活跃时间当然是受KeepAliveTimeOut限制的。如果第二次请求和第一次请求之间超过KeepAliveTimeOut的时间的话,第一次连接就会中断,再新建第二个连接。    
 
所以,一般情况下,图片较多的网站应该把KeepAlive设为On。但是KeepAliveTimeOut应该设置为多少秒就是一个值得讨论的问题了。    
 
如果KeepAliveTimeOut设置的时间过短,例如设置为1秒,那么APACHE就会频繁的建立新连接,当然会耗费不少的资源;反过来,如果KeepAliveTimeOut设置的时间过长,例如设置为300秒,那么APACHE中肯定有很多无用的连接会占用服务器的资源,也不是一件好事。    
 
所以,到底要把KeepAliveTimeOut设置为多少,要看网站的流量、服务器的配置而定。    
 
其实,这和MySql的机制有点相似,KeepAlive相当于mysql_connect或mysql_pconnect,KeepAliveTimeOut相当于wait_timeout。    
 
以下是我的配置: KeepAlive On KeepAliveTimeout 3 考虑到我的网站上有不少的图片,所以将KeepAlive设为On,一般的页面两次请求间隔不会超过3秒,所以这样设置,至尽运行状况良好
 
 
3、Apache开启压缩
#Apache压缩针对的是普通的静态文件,可以节省带宽资源
 
首先,需要看一下我们的apache是否支持压缩功能。
/usr/local/apache2/bin/apachectl -l
看看是否有mod_deflate
如果这里没有,那继续看一下
 
ls /usr/local/apache2/modules/
下面有没有 mod_deflate.so 这个文件
 
如果这里也没有,那说明你的apache不支持压缩,需要重编译一下,或者扩展形式安装,或者重新编译apache, 需要在编译的时候,加上  --enable-deflate=shared  
 
好,如果你的apache有了deflate这个模块支持,也就支持了压缩功能。
 
下面该配置httpd.conf 了。
在httpd.conf 中增加 :
LoadModule deflate_module modules/mod_deflate.so
 
然后再增加如下配置:
DeflateCompressionLevel 5
AddOutputFilterByType DEFLATE text/html text/plain text/xml
AddOutputFilter DEFLATE js css
#其中DeflateCompressionLevel  是指压缩程度的等级,从1到9,9是最高等级。
 
 
4、apache2.2到2.4配置文件变更(了解即可)
1).  访问控制
2.2 的时候
Order deny,allow
Deny from all
在 2.4 需要改成
Require all denied
 
常用的配置有:
Require all denied   
Require all granted   
Require host xxx.com
Require ip 192.168.1 192.168.2   
Require local
 
2). RewriteLogLevel  变为:logLevel
如,LogLevel warn rewrite: warn
 
3). Namevirtualhost 被移除
 
4). 网站压缩,除了使用mod_deflate,还要mod_filter
使用ssl,除了使用mod_ssl,还需要mod_socache_shmcb
 
 
5、apache options参数
Options指令是Apache配置文件中一个比较常见也比较重要的指令,Options指令可以在Apache服务器核心配置(server config)、虚拟主机配置(virtual host)、特定目录配置(directory)以及.htaccess文件中使用。Options指令的主要作用是控制特定目录将启用哪些服务器特性。
Options指令常见的配置示例代码如下:
 <Directory />
 #指定根目录"/"启用Indexes、FollowSymLinks两种特性。
     Options Indexes FollowSymLinks
    AllowOverride all
    Order allow,deny
    Allow from all
 </Directory>
 
 
6、apache禁止trace或track防止xss
TRACE和TRACK是用来调试web服务器连接的HTTP方式。
支持该方式的服务器存在跨站脚本漏洞,通常在描述各种浏览器缺陷的时候,把"Cross-Site-Tracing"简称为XST。
攻击者可以利用此漏洞欺骗合法用户并得到他们的私人信息。
禁用trace可以使用rewrite功能来实现
RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^TRACE
RewriteRule .* - [F]
或者还可以直接在apache的配置文件中配置相应参数
TraceEnable off
 
 
7、apache 配置https 支持ssl
 
8、apache rewrite教程
 
 
 
9、apache rewrite 出现死循环
我的一条规则
 RewriteRule ^(.*) /111/$1 [R,L]
 
使用curl测试,没有问题,但是使用浏览器访问时,出现了无限循环。
本来访问的是 www.111.com 结果变成了 www.111.com/111/111/111/.....
虽然在最后加了 [L] 依然不管用,可能apache还是不够智能,一直满足条件就一直去匹配,一直去跳转。最后没招了只能再加一个条件。
RewriteCond   %{REQUEST_URI} !^/111
 RewriteRule ^(.*) /111/$1 [R,L]
 
 
10、php错误日志级别参考
; E_ALL             所有错误和警告(除E_STRICT外)
; E_ERROR           致命的错误。脚本的执行被暂停。
; E_RECOVERABLE_ERROR    大多数的致命错误。
; E_WARNING         非致命的运行时错误,只是警告,脚本的执行不会停止。
; E_PARSE            编译时解析错误,解析错误应该只由分析器生成。
; E_NOTICE          脚本运行时产生的提醒(往往是我们写的脚本里面的一些bug,比如某个变量没有定义),这个错误不会导致任务中断。
; E_STRICT          脚本运行时产生的提醒信息,会包含一些php抛出的让我们要如何修改的建议信息。
; E_CORE_ERROR      在php启动后发生的致命性错误
; E_CORE_WARNING    在php启动后发生的非致命性错误,也就是警告信息
; E_COMPILE_ERROR    php编译时产生的致命性错误
; E_COMPILE_WARNING  php编译时产生的警告信息
; E_USER_ERROR       用户生成的错误
; E_USER_WARNING    用户生成的警告
; E_USER_NOTICE      用户生成的提醒
 
 
11、php开启短标签
控制参数: short_open_tag = On
如果设置为Off,则不能正常解析类似于这样形式的php文件:
<?
phpinfo()
?>
 
而只能解析
<?php
phpinfo()
?>
这样形式的php文件
所以要想php支持短标签,需要我们把short_open_tag  设置为On.
 
 
12、php.ini详解
#将视频列出的选项会用就好,其他的等用的时候再看
 
 
13、几种限制ip的方法
1.  禁止访问某些文件/目录
增加Files选项来控制,比如要不允许访问 .inc 扩展名的文件,保护php类库
<Files ~ "\.insc$">
 
2. 禁止访问某些指定的目录:(可以用 <DirectoryMatch> 来进行正则匹配)
<Directory ~ "/var/www/(.+)*[0-9]{3}">
当然也可以写目录全局路径
<Directory  /var/www/111>
 
3. 通过文件匹配来进行禁止,比如禁止所有针对图片的访问:
<Filesmatch (.*)php>  
 
4. 针对URL相对路径的禁止访问
<Location /dir/>
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(可以访问的原因是不是被限制文件的句型,错误)
[root@xinlinux-03 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(被限制访问)
[root@xinlinux-03 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(允许访问,出现错误)
[root@xinlinux-03 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'
[root@xinlinux-03 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'
[root@xinlinux-03 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
[root@xinlinux-03 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

 

posted @ 2018-09-14 13:28  最爱吃菜  阅读(277)  评论(0编辑  收藏  举报