LAMP架构(3)

一、配置防盗链

  1. 防盗链通俗的讲,就是不让别人盗用你网站上的资源。这个资源,通常指得是图片,视频,歌曲,文档等。
  2. referer的概念。 
    比如你通过A网站的一个页面http://a.com/a.html里面的链接去访问b网站的一个页面http://b.com/b.html,那么这个b网站页面的referer就是http://a.com/a.html。也就是说一个referer其实是一个网站。
  3. 编辑虚拟主机配置文件,增加如下内容
<Directory /data/wwwroot/111.con>  //定义目录。防盗链的目录其实就是这个站点
    SetEnvIfNoCase Referer "http://www.111.con" local_ref  //定义referer的白名单
    SetEnvIfNoCase Referer "http://www.aaa.con" local_ref 
    #SetEnvIfNoCase Referer  "^$" local_ref //定义空的refererye为白名单
    <filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)"> //定义这样的访问不要设置为白名单,也就是针对这些做防盗链。
    Order Allow,Deny //这2个行的作用是先把白名单的referer做一个允许。其他的给Deny掉
    Allow from env=local_ref
    </filesmatch>
  • 测试 
    在浏览器中访问111.com/qq.png会出现Forbidden的字样(空referer).,因为我们已经将空referer给注释掉了。

在ask.apelearn.com上发帖将111.com/qq.png设置为超链接,并将ask.apelearn.com加入到referer的白名单中,那么这样就能访问到图片了

执行curl -e "http://www.qq.com/123.txt" -x127.0.0.1:80 111.com/qq.png -I//-e 是指定它的referer

那么它的状态码为403 ,如果referer写成111.com/123.txt,这时它的状态码就能为200


二、访问控制Directory

1.对于一些比较重要的网站内容,除了可以使用用户认证限制访问之外,还可以通过其他一些方法做到限制,比如可以限制IP,也可以限制user_anget。限制ip指的是限制访问网站的来源IP,而限制user_agent,通常用来限制恶意或者不正确的请求。

2 . directory操作说明

<Directory /data/wwwroot/111.com/admin/>
    Order deny,allow
    Deny from all
    Allow for 127.0.0.1
<Directory>   

使用来指定限制访问的目录,order定义控制顺序,哪个在前面就先配置哪个规则。这里先匹配Deny from all,这样所有的来源IP都会被限制,然后Allow for 127.0.0.1,这样又允许了127.0.0.1这个IP。最后的结果是,只允许来源Ip为127.0.0.1的访问。

3.测试 
a.创建111.com/admin/index.php(文件内容为1234134) 
b.使用ctrl -x127.0.0.1:80 111.com/admin/index.php -I 可以看到状态码为200 ,说明是可以访问的 
c.再用浏览器访问这个地址,则会提示Forbidden,也就是403。那说明是被限制了


三、访问控制FilesMatch

  1. 访问控制除了目录的形式,也可以匹配链接。
  2. 写入FilesMatch
<Directory /data/wwwroot/111.com/admin/>
    <FilesMatch admin.php(.*)>
    Order deny,allow
    Deny from all
    Allow for 127.0.0.1
    </FilesMatch>
<Directory>   

3.加载配置文件并测试

4.FilesMatch和Directory功能是一样的,但是它们同时开启限制就有些不太合适了。


四、限定某个目录禁止解析php

  1. 如果有一个目录,是允许上传图片的。但是不能保证没有人通过一些手段上传了个人php的文件上去,php的文件被我们去执行,因为apache一般都加有php的模块,那么去访问PHP的请求,它都能解析。php有一些危险的函数,开启上传的权限,然后被上传一些带有木马的文件,一旦中招后,那么它就能拿到服务器的root权限,这是非常危险的,所以需要限定某个目录禁止解析php.
  2. 虚拟主机配置文件加入以下内容
<Directory /data/wwwroot/111.com/upload> //禁止解析upload目录下的所有php
   php_admin_flag engin off 
   <FilesMatch (.*)\.php(.*)>
   Order allow,deny
   Deny from all
   </FilesMatch>
<Directory>   

加上FilesMatch访问控制,所有访问php的都提示403的状态码。解不解析都没有意义。

3 . 重新加载配置文件。并创建/upload/123.php

4.使用curl命令去访问这个文件,那么会出现403的状态码,那么既然不能访问,解不解析都没有意义,当将FilesMatch注释掉以后,再去访问时,是可以看到文件的源代码的。在浏览器中去访问则会下载这个文件,并不能进行解析。 
5 .上传图片的目录是不需要解析php的。一般静态文件所存放的目录下不是允许放php的


五、限制user_agent

  1. 攻击者借助代理服务器生成指向受害主机的合法请求,实现DDOS和伪装就叫:CC(ChallengeCollapsar)。 
    CC主要是用来攻击页面的。大家都有这样的经历,就是在访问论坛时,如果这个论坛比较大,访问的人比较多,打开页面的速度会比较慢,访问的人越多,论坛的页面越多,数据库压力就越大,被访问的频率也越高,占用的系统资源也就相当可观。 
    一个静态页面不需要服务器多少资源,甚至可以说直接从内存中读出来发给你就可以了,但是论坛就不一样了,我看一个帖子,系统需要到数据库中判断我是否有读帖子的权限,如果有,就读出帖子里面的内容,显示出来——这里至少访问了2次数据库,如果数据库的数据容量有200MB大小,系统很可能就要在这200MB大小的数据空间搜索一遍,这需要多少的CPU资源和时间?如果我是查找一个关键字,那么时间更加可观,因为前面的搜索可以限定在一个很小的范围内,比如用户权限只查用户表,帖子内容只查帖子表,而且查到就可以马上停止查询,而搜索肯定会对所有的数据进行一次判断,消耗的时间是相当的大。 
    CC就是充分利用了这个特点,模拟多个用户(多少线程就是多少用户)不停的进行访问(访问那些需要大量数据操作,就是需要大量CPU时间的页面).这一点用一个一般的性能测试软件就可以做到大量模拟用户并发。
  2. user-agent可以理解为浏览器标识,它的作用就是网站受到cc攻击时,可以通过限制user-agent来减轻服务器的压力。正常的状态码是200,做限制为403,那它也不会对服务器资源有什么影响。
  3. 配置文件内容如下
<IfModule mod_rewrite.c>
   RewriteEngine on
   RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC OR] //OR表示或者的意思,匹配上面的或者下面的
   RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC]  //NC表示忽略大小写
   RewriteRule .* - [F] //F表示Forbidden
</IfModule>   

curl参数选项说明:

curl -A “ABC” //指定USER_AGENT 
curl -e “http://www………..”指定referer 
curl -x 相当于忽略hosts 
curl ……………. -I 看到状态码


六、php相关配置

  1. 查看php配置文件位置
/usr/local/php7/bin/php -i |grep -i "loaded configuration file 

2 . phpinfo查找是最准确的,在网站下面去创建phpinfo的界面,再用浏览器去访问它 
a.创建index.php 写如下配置:

<?php 
phpinfo();
 

b 用浏览器去访问这个文件,可以看到它的配置文件位置,但是它并没有去加载 
c 没有加载可以去源码包内复制一份

cp php.ini-development /usr/local/php7/etc/php.ini 

加载配置文件后再去刷新浏览器可以看到php.ini的路径

  • 禁用特殊函数
[root@localhost b.com]# vim /usr/local/php/etc/php.ini 
; It receives a comma-delimited list of function names.
; http://php.net/disable-functions
//将不常用特殊函数添加到此处进行限制,可以不被一些木马利用。生产场景phpinfo()函数也会被禁用,避免泄露信息。
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,

; This directive allows you to disable certain classes for security reasons.
  • 设置时区参数(date.timezone)
[root@localhost b.com]# vim /usr/local/php/etc/php.ini 
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
//修改时区为亚洲/上海
date.timezone = Asia/Shanghai

; http://php.net/date.default-latitude
  • 在display_errors = on 时会把错误信息直接显示在浏览器页面上。这样的坏处是会暴露你的目录。将on改为off后,将不会看到任何的信息 
    一旦将display_errors改为off时,还需要修改以下几个地方 
    log_errors = on //定义错误日志开启,用error_log去定义它的路径。
  • 定义错误日志路径

  • 定义错误日志记录的级别

  • open_basedir目录隔离,避免一个网址的目录被黑了导致其他网址的目录同时被黑

配置虚拟机配置文件:vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

 路径就是网址的根目录,tmp目录是临时文件存放目录也要添加进去,否者临时文件都写不进去


七、php扩展模块安装

有时候php安装编译完成后,这时候发现缺少了一个模块,但又不想重新编译php模块,可以使用扩展模块编译。

查看模块:

下面以安装一个redis的模块为例:

[root@xzl-linux:/usr/local/apache2.4/logs]# cd /usr/local/src
[root@xzl-linux:/usr/local/src]# wget https://codeload.github.com/phpredis/phpredis/zip/develop //下载redis源码包
[root@xzl-linux:/usr/local/src]# mv develop phpredis-develop.zip
[root@xzl-linux:/usr/local/src]# unzip phpredis-develop.zip  //解压源码包
[root@xzl-linux:/usr/local/src]# cd phpredis-develop
[root@xzl-linux:/usr/local/src/phpredis-develop]# /usr/local/php7/bin/phpize //使用phpize工具去生成一个configure文件
Configuring for:
PHP Api Version:         20160303
Zend Module Api No:      20160303
Zend Extension Api No:   320160303
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script. 
//报错,需要安装autoconf组件
[root@xzl-linux:/usr/local/src/phpredis-develop]# yum install -y autoconf
[root@xzl-linux:/usr/local/src/phpredis-develop]# /usr/local/php7/bin/phpize  //这样才算是生成了configure文件
Configuring for:
PHP Api Version:         20160303
Zend Module Api No:      20160303
Zend Extension Api No:   320160303
[root@xzl-linux:/usr/local/src/phpredis-develop]# ./configure --with-php-config=/usr/local/php7/bin/php-config  //配置编译参数
[root@xzl-linux:/usr/local/src/phpredis-develop]# make && make install
Installing shared extensions:     /usr/local/php7/lib/php/extensions/no-debug-zts-20160303/   //提示模块已经安装到该目录下了,我们使用ls查看一下
[root@xzl-linux:/usr/local/src/phpredis-develop]# ls /usr/local/php7/lib/php/extensions/no-debug-zts-20160303/
opcache.so  redis.so

启用redis模块:

[root@xzl-linux:/usr/local/src/phpredis-develop]# vim /usr/local/php7/etc/php.ini  //编辑php.ini配置文件,并搜索extension关键字
;extension=php_bz2.dll
;extension=php_curl.dll
;extension=php_fileinfo.dll
;extension=php_ftp.dll
;extension=php_gd2.dll
;extension=php_gettext.dll
;extension=php_gmp.dll
;extension=php_intl.dll
;extension=php_imap.dll
;extension=php_interbase.dll
;extension=php_ldap.dll
;extension=php_mbstring.dll
;extension=php_exif.dll      ; Must be after mbstring as it depends on it
;extension=php_mysqli.dll
;extension=php_oci8_12c.dll  ; Use with Oracle Database 12c Instant Client
;extension=php_openssl.dll
;extension=php_pdo_firebird.dll
;extension=php_pdo_mysql.dll
;extension=php_pdo_oci.dll
;extension=php_pdo_odbc.dll
;extension=php_pdo_pgsql.dll
;extension=php_pdo_sqlite.dll
;extension=php_pgsql.dll
;extension=php_shmop.dll
extension=redis.so    //添加此行内容打开redis.so模块
[root@xzl-linux:/usr/local/src/phpredis-develop]# /usr/local/php7/bin/php -m |grep redis  //此时再去查看php的模块便可看到redis模块已经成功加载了
redis

如果PHP源码包下的/usr/local/src/php-7.1.6/ext/目录下有我们需要的扩展模块,就不用下载,直接在该目录下执行

/usr/local/php7/bin/phpize

./configure --with-php-config=/usr/local/php7/bin/php-config

make && make install


扩展:

几种限制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://ask.apelearn.com/question/1051

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

Apache下开启图片防盗链功能

https://xiaozhou.net/enable_rewrite_module_of_apache-2012-02-15.html

Apache Options指令详解 http://www.365mini.com/page/apache-options-directive.htm

Apache访问控制 :https://coding.net/u/aminglinux/p/apache/git/blob/master/access.md

猜你喜欢

转载自blog.csdn.net/xzl18779631005/article/details/82709800