一、配置防盗链
- 防盗链通俗的讲,就是不让别人盗用你网站上的资源。这个资源,通常指得是图片,视频,歌曲,文档等。
- referer的概念。
比如你通过A网站的一个页面http://a.com/a.html里面的链接去访问b网站的一个页面http://b.com/b.html,那么这个b网站页面的referer就是http://a.com/a.html。也就是说一个referer其实是一个网站。 - 编辑虚拟主机配置文件,增加如下内容
<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
- 访问控制除了目录的形式,也可以匹配链接。
- 写入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
- 如果有一个目录,是允许上传图片的。但是不能保证没有人通过一些手段上传了个人php的文件上去,php的文件被我们去执行,因为apache一般都加有php的模块,那么去访问PHP的请求,它都能解析。php有一些危险的函数,开启上传的权限,然后被上传一些带有木马的文件,一旦中招后,那么它就能拿到服务器的root权限,这是非常危险的,所以需要限定某个目录禁止解析php.
- 虚拟主机配置文件加入以下内容
<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
- 攻击者借助代理服务器生成指向受害主机的合法请求,实现DDOS和伪装就叫:CC(ChallengeCollapsar)。
CC主要是用来攻击页面的。大家都有这样的经历,就是在访问论坛时,如果这个论坛比较大,访问的人比较多,打开页面的速度会比较慢,访问的人越多,论坛的页面越多,数据库压力就越大,被访问的频率也越高,占用的系统资源也就相当可观。
一个静态页面不需要服务器多少资源,甚至可以说直接从内存中读出来发给你就可以了,但是论坛就不一样了,我看一个帖子,系统需要到数据库中判断我是否有读帖子的权限,如果有,就读出帖子里面的内容,显示出来——这里至少访问了2次数据库,如果数据库的数据容量有200MB大小,系统很可能就要在这200MB大小的数据空间搜索一遍,这需要多少的CPU资源和时间?如果我是查找一个关键字,那么时间更加可观,因为前面的搜索可以限定在一个很小的范围内,比如用户权限只查用户表,帖子内容只查帖子表,而且查到就可以马上停止查询,而搜索肯定会对所有的数据进行一次判断,消耗的时间是相当的大。
CC就是充分利用了这个特点,模拟多个用户(多少线程就是多少用户)不停的进行访问(访问那些需要大量数据操作,就是需要大量CPU时间的页面).这一点用一个一般的性能测试软件就可以做到大量模拟用户并发。 - user-agent可以理解为浏览器标识,它的作用就是网站受到cc攻击时,可以通过限制user-agent来减轻服务器的压力。正常的状态码是200,做限制为403,那它也不会对服务器资源有什么影响。
- 配置文件内容如下
<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相关配置
- 查看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