2018-9-13 直播课堂笔记

Apache与PHP高级配置技巧
本文深入探讨Apache服务器的防盗链、访问控制、文件限制及PHP配置优化等高级技巧,包括如何防止盗链、限制特定目录和文件的访问、配置PHP以提升安全性与性能。

         1.配置防盗链

2.访问控制Directory

3.访问控制FilesMatch

4.限定某个目录禁止解析php

5.限制user_agent

6.php相关配置

7.php扩展模块安装


1.配置防盗链

1.1 为什么会产生盗链

  一般浏览有一个重要的现象就是一个完整的页面并不是一次全部传送到客户端的。如果请求的是一个带有许多图片和其它信息的页面,那么最先的一个Http请求被传送回来的是这个页面的文本,然后通过客户端的浏览器对这段文本的解释执行,发现其中还有图片,那么客户端的浏览器会再发送一条Http请求,当这个请求被处理后那么这个图片文件会被传送到客户端,然后浏览器回将图片安放到页面的正确位置,就这样一个完整的页面也许要经过发送多条Http请求才能够被完整的显示。基于这样的机制,就会产生一个问题,那就是盗链问题:就是一个网站中如果没有起页面中所说的信息,例如图片信息,那么它完全可以将这个图片的连接到别的网站。这样没有任何资源的网站利用了别的网站的资源来展示给浏览者,提高了自己的访问量,而大部分浏览者又不会很容易地发现,这样显然,对于那个被利用了资源的网站是不公平的。一些不良网站为了不增加成本而扩充自己站点内容,经常盗用其他网站的链接。一方面损害了原网站的合法利益,另一方面又加重了服务器的负担。

1.2盗链的解决方案

       a.其实通过WEB服务器的URL过滤技术,这个伤脑筋的问题会很容易得到解决。 

  b.如果WEB服务器用的是APACHE的话,那么使用APACHE自带的Url Rewrite功能可以很轻松地防止各种盗链,其原理是检查REFER,如果REFER的信息来自其他网站则禁止访问所需要的资源。

<Directory /data/wwwroot/111.com>
        SetEnvIfNoCase Referer "http://test.com" local_ref
        SetEnvIfNoCase Referer "http://test.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>

2.访问控制Directory

2.1在配置文件里添加如下段,目的是对test.com下的images目录进行访问控制

<Directory /data/wwwroot/test.com/images>

        Order deny,allow

        Deny from all

        Allow from 127.0.0.1

     </Directory>

 Order  用来定义顺序  Order deny,allow    表示先deny 再allow

这段话表是拒绝所有的访问,仅通过127.0.0.1

2.2 Apache中DocumentRoot和Directory的区别

  DocumentRoot指定apache服务器网页(文档)根目录,用于指定了一种URL映射的根目录路径。例如http://localhost/

   而Directory标签是为了指定URL路径在后续的请求中可以进行操作的权限范围属性。

   即DocumentRoot为子目录,Directory为父目录。

3.访问控制FilesMatch

3.1针对某个文件来做限制

 <FilesMatch  "1.php(.*)">
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
    </FilesMatch>

3.2  在2.2以及以前版本中,使用allow,deny来实现访问控制, 在2.4版本中,使用require granted和require denied来实现。 访问控制主要使用在<location> <locationmatch> <directory> <directorymatch> <files> <filesmatch> 中。

4.限定某个目录禁止解析php

4.1如果网站代码有漏洞,让黑客上传了一个用PHP代码写的木马,由于网站可以执行PHP程序,最终会让黑客拿到服务器权限,为了避免这种情况发生,我们需要把能上传文件的目录直接禁止解析PHP代码.

4.2 核心配置文件

 <Directory /data/wwwroot/test.com/upload>
        php_admin_flag engine off //在upload目录下禁止解析php
        <FilesMatch *\.php(.*)> //这行以及以下两行的意思就是
        //让php的文件访问受到限制,防止php文件的源代码被查看
        Order allow,deny
        Deny from all
        </FilesMatch>
    </Directory>

5.限制user_agent

5.1 user_agent可以理解为浏览器标识,针对user_agent来限制一些访问,比如可以限制一些不太友好的搜索引擎“爬虫”,你之所以能在百度搜到一些论坛,就是因为百度会派一些“蜘蛛爬虫”过来抓取网站数据。“蜘蛛爬虫”抓取数据类似于用户用浏览器访问网站,当“蜘蛛爬虫”太多或者访问太频繁,就会浪费服务器资源。另外,也可以限制恶意请求,这种恶意请求我们通常称作cc攻击,他的原理很简单,就是用很多用户的电脑同时访问同一个站点,当访问量或者频率达到一定层次,会耗尽服务器资源,从而使之不能正常提供服务。这种cc攻击其实有很明显的规律,其中这些恶意请求的user_agent相同或者相似,那我们就可以通过限制user_agent发挥防攻击的作用。

5.2 核心配置文件

<IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{HTTP_USER_AGENT}  .*curl.* [NC,OR]
        //OR是或者的意思,user_agent匹配curl或者匹配baidu.com
        //NC是忽略大小写
        RewriteCond %{HTTP_USER_AGENT}  .*baidu.com.* [NC]
        RewriteRule  .*  -  [F] //F是Forbidden
    </IfModule>

6.php相关配置

6.1  查看php配置文件位置  /usr/local/php/bin/php -i|grep -i “loaded configuration file” 

6.2 我们还可以编辑phpinfo函数来查看配置文件路径,这个会比命令行的查看来的更为准确一些。

6.3 PHP的disable_functions:PHP有诸多的内置的函数,有一些函数(比如exec)会直接调取linux的系统命令,如果开放将会非常危险,因此,基于安全考虑应该把一些存在安全风险的函数禁掉。

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,

6.4 配置 error_log

需要将php.ini中的配置指令做如下修改: 

1. error_reporting  =  E_ALL                   ;将会向PHP报告发生的每个错误   

2. display_errors = Off                        ;不显示满足上条 指令所定义规则的所有错误报告   

3. log_errors = On                             ;决定日志语句记录的位置   

4. log_errors_max_len = 1024                   ;设置每个日志项的最大长度   

5. error_log = /usr/local/error.log                ;指定产生的 错误报告写入的日志文件位置  

6.5 配置open_basedir

6.5.1它的作用是将网站限定在指定目录里,就算该站点被黑了,黑客只能在该目录下面有所作为,而不能左右其他目录。如果你的服务器上只有一个站点,那可以直接在php.ini中设置open_basedir参数。但如果服务器上跑的站点比较多,那在php.ini中设置就不合适了,因为在php.ini中只能定义一次,也就是说所有站点都一起定义限定的目录,那这样似乎起不到隔离多个站点的目的。

vim /usr/local/php/etc/php.ini //编辑添加open_basedir目录地址

定义如下

open_basedir = /data/wwwroot/test.com:/tmp 

6.5.2 针对不同的虚拟主机去限制不同的open_basedir

vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf


定义如下:

php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/"

7.php扩展模块安装

7.1 php通过pecl方式安装扩展

PECL 的全称是 The PHP Extension Community Library ,是一个开放的并通过 PEAR(PHP Extension and Application Repository,PHP 扩展和应用仓库)打包格式来打包安装的 PHP 扩展库仓库。通过 PEAR 的 Package Manager 的安装管理方式,可以对 PECL 模块进行下载和安装。与以往的多数 PEAR 包不同的是,PECL 扩展包含的是可以编译进 PHP Core 的 C 语言代码,因此可以将 PECL 扩展库编译成为可动态加载的 .so 共享库,或者采用静态编译方式与 PHP 源代码编译为一体的方法进行扩展。PECL 扩展库包含了对于 XML 解析,数据库访问,邮件解析,嵌入式的 Perl 以及 Pthyon 脚本解释器等诸多的 PHP 扩展模块,因此从某种意义上来说,在运行效率上 PECL 要高于以往诸多的 PEAR 扩展库。

7.2 首先我们先查找一下有多少模块可以安装

[root@knightlai ~]# /usr/local/php/bin/pecl list-all
WARNING: channel "pecl.php.net" has updated its protocols, use "pecl channel-update pecl.php.net" to update
All packages [Channel pecl.php.net]:
====================================
Package                   Latest  Local
pecl/amfext               0.9.2         ActionScript Message Format extension
pecl/apfd                 1.0.1         Always Populate Form Data
pecl/augeas               0.6.1         PHP bindings to the Augeas API
pecl/big_int              1.0.7         big_int library provides a set of functions for calculations with arbitrary length integers and bitsets
pecl/binpack              1.0.1         binpack for PHP.
pecl/bloomy               0.1.0         Extension implementing a Bloom filter
pecl/bz2_filter           1.1.0         bz2 filter implementation backport for PHP 5.0
pecl/cld                  0.5.0         PHP Bindings for Chromium Compact Language Detector
pecl/clips                0.5.0         Integrated CLIPS environment for deployment of expert systems
pecl/clucene              0.0.9         Extension for CLucene
pecl/coin_acceptor        0.3           Interface for serial coin acceptors
pecl/crack                0.4           "Good Password" Checking Utility: Keep your users' passwords reasonably safe from dictionary based attacks
pecl/crack_dll            0.4           "Good Password" Checking Utility: Keep your users' passwords reasonably safe from dictionary based attacks
pecl/crypto               0.3.1         Wrapper for OpenSSL Crypto Library
pecl/cybercash            1.18p1        providesa access to cybercash online payment API
pecl/cybermut             1.1           CyberMut Paiement System
pecl/date_time            0.1           Date and Time Library

7.3 pecl search key-word #用于查找扩展 pecl install key-word #用于安装扩展

[root@knightlai swoole-1.9.3]# /usr/local/php/bin/pecl install swoole
................
Build process completed successfully
Installing '/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/swoole.so'
.........

7.4 然后在php.ini文件里添加extension="/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/swoole.so",然后重启php-fpm加载swoole扩展模块即可。

 

 

 

扩展知识:apache几种限制ip的方法

1.  禁止访问某些文件/目录,增加Files选项来控制,比如要不允许访问 .inc 扩展名的文件,保护php类库:

2. 禁止访问某些指定的目录:(可以用  来进行正则匹配),当然也可以写目录全局路径

3. 通过文件匹配来进行禁止,比如禁止所有针对图片的访问:

4. 针对URL相对路径的禁止访问

apache设置自定义header

1. 在设置自定义header前,需要先检测一下你的httpd是否加载了mod_headers

/usr/local/apache2/bin/apachectl  -l

如果,显示有mode_headers.c  则是加载了这个模块,否则就需要重新编译一下了。

另外,如果你使用的是rpm安装的话,那肯定是已经加载了mod_headers这个模块的。

2.  在httpd.conf 中加入

Header add MyHeader "Hello

保存后,重启apache就可以了

双引号中的内容为自定义内容。当然这里的"MyHeader"也是可以自定义的。

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。    

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值