1、限制某个目录禁止解析php:
<Directory /data/wwwroot/www.123.com/upload>
php_admin_flag engine off
</Directory>
注释:核心配置内容如上,curl测试时直接返回源代码,并未解析;
2、假设有一个目录可以上传图片,有可能被别有用心的人上传了php(木马类型)的文件,因为httpd加载了php的模块,只要访问php的请求就会解析,因为php有一些函数,一旦开放了上传文件的权限,肯定会被上传一些木马文件,一旦被执行,就能拿到服务器的root权限,或者被恶意篡改一些参数,导致服务器瘫痪;
有一台服务器被入侵了,不知道是什么原因,也不知道入侵到什么程度,只知道公司的数据库泄露了,数据是一些电话号码,黑客并没有去删除数据,因为他知道这个服务器的数据库里电话号码每天都在增加,他可以源源不断获取新的电话号码,然后买给第三方来获利;
分析:把一个新的号码在这个服务器提交后,马上就有人打电话过来了,证明,黑客获得电话号码,到打电话给新用户,这套体系已经完全自动化,每天去抓电话号码队列,所以猜测网站的php程序存在漏洞,另一种就是sql注入的漏洞(可以把查询的sql通过一些特殊的提交,提交到服务器上,服务器就会把这个sql语句转换成正常的查询,最终获得一些数据回来);但是sql注入漏洞,很容易修复,只要在网站提交的入口,增加一些特殊符号的过滤,就能完全的阻断sql注入的漏洞。
解决办法:首先抓包,监控数据库的查询,写一个死循环的脚本,每隔一分钟抓一次查询数据,抓完以后生成一个日志文件;
查询日记文件后,发现有一条sql查询,和网站原生的查询不一样,通过日志定位到了时间点,然后就去web服务器上查看时间点的访问日志,通过日志查看到了一个非常特殊的请求,名字是以php结尾的文件,而且这个php文件是在图片的目录下进行访问的,然后去查看这个php 文件,发现这个文件内容是一句话木马,用来是获取服务器的权限,相当于在服务器开了一个后门;这个问题产生的根本原因,就是因为上传图片目录并没有禁止解析php
sql注入:就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。[1] 比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击;
禁止php解析:配置文件如下:
[root@localhost_002 extra]# vim httpd-vhosts.conf
# Virtual Hosts
<VirtualHost *:80>
ServerAdmin yuanhh@foreb.com
DocumentRoot "/data/wwwroot/111.com"
ServerName www.111.com
ServerAlias www.example.com www.2111.com
#<Directory /data/wwwroot/111.com>
#<FilesMatch 123.php>
# AllowOverride AuthConfig
# AuthName "111.com user auth"
# AuthType Basic
# AuthUserFile /data/.htpasswd
# require valid-user
# </FilesMatch>
# </Directory>
#针对upload目录下所有php文件禁止解析;
<Directory /data/wwwroot/111.com/upload>
php_admin_flag engine off #禁止解析php核心内容:
<FilesMatch (.*)\.php(.*)> #增加FilesMatch后,这里访问upload目录下Php都是403Forbidden;
Order allow,deny
Deny from all #如果不写这个deny,访问时会直接显示源代码;
</FilesMatch>
</Directory>
2:检测配置文件是否有错误,并重启欺负apache服务:
[root@localhost_002 extra]# /usr/local/apapche2.4/bin/apachectl -t
Syntax OK
[root@localhost_002 extra]# /usr/local/apapche2.4/bin/apachectl graceful
3:在根目录下创建upload目录,并新建一个php文件:
[root@localhost_002 extra]# cd /data/wwwroot/111.com/
[root@localhost_002 111.com]# mkdir upload
[root@localhost_002 111.com]# echo "123123" >upload/111.php
4:curl访问时是403forbidden;
[root@localhost_002 111.com]# curl -x127.0.0.1:80 'http://www.111.com/upload/111.php' -i
HTTP/1.1 403 Forbidden
Date: Tue, 09 Oct 2018 03:21:08 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.30
Content-Length: 223
Content-Type: text/html; charset=iso-8859-1
5:测试,这时候在虚拟主机配置文件里注释掉FilesMatch,然后看效果:
[root@localhost_002 extra]# vim httpd-vhosts.conf
# Virtual Hosts
#针对upload目录下所有php文件禁止解析;
<Directory /data/wwwroot/111.com/upload>
php_admin_flag engine off #禁止解析php核心内容:
#<FilesMatch (.*)\.php(.*)> #增加FilesMatch后,这里访问upload目录下Php都是403Forbidden;
# Order allow,deny
# Deny from all #如果不写这个deny,访问时会直接显示源代码;
#</FilesMatch>
</Directory>
6:检测配置文件错误,并重新加载apache文件:
[root@localhost_002 extra]# /usr/local/apapche2.4/bin/apachectl -t
Syntax OK
[root@localhost_002 extra]# /usr/local/apapche2.4/bin/apachectl graceful
7:这时使用curl命令测试,会自己显示源代码,不太友好:
[root@localhost_002 extra]# curl -x127.0.0.1:80 'http://www.111.com/upload/111.php'
123123
8:在浏览器访问www.111.com/upload/111.php,也会提示下载这个文件,这是因为无法访问源代码导致的;
9:这时再打开虚拟配置文件,去掉对FliesMatch的注释:
[root@localhost_002 extra]# vim httpd-vhosts.conf
# Virtual Hosts
#针对upload目录下所有php文件禁止解析;
<Directory /data/wwwroot/111.com/upload>
php_admin_flag engine off #禁止解析php核心内容:
<FilesMatch (.*)\.php(.*)> #增加FilesMatch后,这里访问upload目录下Php都是403Forbidden;
Order allow,deny
Deny from all #如果不写这个deny,访问时会直接显示源代码;
</FilesMatch>
</Directory>
10:检测配置文件是否有错误,并重新加载配置文件:
[root@localhost_002 extra]# /usr/local/apapche2.4/bin/apachectl -t
Syntax OK
[root@localhost_002 extra]# /usr/local/apapche2.4/bin/apachectl graceful
注释:这时候再去访问浏览器时会显示403Forbidden,即也无法看到源代码的内容:
注释:即使去访问这个目录下一个不存在的php文件,也会显示403Forbidden:php解析操作主要是针对可以写的目录,服务器安全:
注释:一般网站可写的目录,都不需要php解析的,一般静态文件存放的目录(image目录)页不允许解析php的:
2、访问控制:user_agent限制
扩展:cc攻击,就是黑客通过肉鸡去同时访问某一个站点,超过服务器并发,就会导致宕机,没有什么特殊的,让站点超过并发导致严重超负荷宕机,但是CC攻击有一个规则的特征,就是user_agent是一致的,比如同一个ip,同一个标识等,遇到这种user_agent频繁访问的情况就可以断定是CC攻击了,我们可以通过限制它的user_agent来减轻服务器的压力,只需要让它正常访问的状态码变为403,用来减轻服务器的压力,因为403仅仅是一个请求,带宽耗费不会太大。
user_agent 是浏览器标识:curl -A "123123" 指定user_agent
1、核心配置文件内容:
[root@localhost_002 extra]# cat httpd-vhosts.conf
# Virtual Hosts
<VirtualHost *:80>
ServerAdmin yuanhh@foreb.com
DocumentRoot "/data/wwwroot/111.com"
ServerName www.111.com
ServerAlias www.example.com www.2111.com
#<Directory /data/wwwroot/111.com>
#<FilesMatch 123.php>
# AllowOverride AuthConfig
# AuthName "111.com user auth"
# AuthType Basic
# AuthUserFile /data/.htpasswd
# require valid-user
# </FilesMatch>
# </Directory>
# Directory针对user_agent
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR] #条件
RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC] #条件
RewriteRule .* - [F]
</IfModule>
注释:在两个条件中用OR做一个连接符,或者的意思,匹配第一条规则或者第二条规则;
如果不加OR是并且的意思,表示匹配第一条规则和第二条规则,两条同时匹配才执行;
注释:NC表示忽略大小写,因为user_agent可能会是大写(Mozilla/5.0),首字母大写;
RewriteRule .* - [F]表示Forbidden;
2、检测配置文件并重启服务:
[root@localhost_002 extra]# /usr/local/apapche2.4/bin/apachectl -t
Syntax OK
[root@localhost_002 extra]# /usr/local/apapche2.4/bin/apachectl graceful
3、在访问的时候,会显示403 (Forbidden),这是因为显示user_agent;
[root@localhost_002 extra]# curl -x127.0.0.1:80 'http://www.111.com/upload/111.php' -I
HTTP/1.1 403 Forbidden
Date: Tue, 09 Oct 2018 06:46:07 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.30
Content-Type: text/html; charset=iso-8859-1
[root@localhost_002 extra]# curl -x127.0.0.1:80 'http://www.111.com/123.php' -I
HTTP/1.1 403 Forbidden
Date: Tue, 09 Oct 2018 06:46:30 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.30
Content-Type: text/html; charset=iso-8859-1
4、查看访问日记(刚刚访问的最后两条日记):
[root@localhost_002 extra]# tail ../../logs/111.com-access_log
127.0.0.1 - - [09/Oct/2018:14:36:10 +0800] "HEAD http://www.111.com/upload/111.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [09/Oct/2018:14:36:10 +0800] "HEAD http://www.111.com/upload/111.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [09/Oct/2018:14:36:11 +0800] "HEAD http://www.111.com/upload/111.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [09/Oct/2018:14:36:13 +0800] "HEAD http://www.111.com/upload/111.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [09/Oct/2018:14:46:05 +0800] "HEAD http://www.111.com/upload/111.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [09/Oct/2018:14:46:07 +0800] "HEAD http://www.111.com/upload/111.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [09/Oct/2018:14:46:27 +0800] "GET http://www.111.com/123.php HTTP/1.1" 403 216 "-" "curl/7.29.0"
127.0.0.1 - - [09/Oct/2018:14:46:30 +0800] "HEAD http://www.111.com/123.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [09/Oct/2018:14:47:54 +0800] "HEAD http://www.111.com/upload/111.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [09/Oct/2018:14:48:02 +0800] "HEAD http://www.111.com/123.php HTTP/1.1" 403 - "-" "curl/7.29.0"
5、测试是否是因为user_agent才会被访问:
自定义user_agent: -A 自定义:
[root@localhost_002 extra]# curl -A "fenye" -x127.0.0.1:80 'http://www.111.com/123.php' -I
HTTP/1.1 200 OK
Date: Tue, 09 Oct 2018 07:09:18 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.30
X-Powered-By: PHP/5.6.30
Content-Type: text/html; charset=UTF-8
[root@localhost_002 extra]# !tail
tail ../../logs/111.com-access_log
192.168.149.135 - - [09/Oct/2018:15:06:51 +0800] "GET /123.php HTTP/1.1" 200 6 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
192.168.149.135 - - [09/Oct/2018:15:08:35 +0800] "GET /123.php HTTP/1.1" 200 6 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
192.168.149.135 - - [09/Oct/2018:15:08:35 +0800] "GET /123.php HTTP/1.1" 200 6 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
127.0.0.1 - - [09/Oct/2018:15:09:18 +0800] "HEAD http://www.111.com/123.php HTTP/1.1" 200 - "-" "fenye"
注释:curl命令是一个利用URL规则在命令行下工作的文件传输工具
-A ,指定user-agent,设置用户代理发送给服务器
-e ,指定referer,就是来源网址
-I ,仅仅查看它的状态码
-x ,在指定的端口上使用HTTP代理
3、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
error_log, log_errors, display_errors, error_reporting
open_basedir
php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/"
1、查看php的配置位置:
可以通过浏览器访问phpinfo找到配置文件的路径:
也可以通过 /usr/local/php/bin/php -i|grep "loaded configuration file"找到它的路径,但是有些php -i是不准的,因为apache是调用了php的一个模块,而php -i是php的一个程序,它和libphp5.so可能有关系也可能没关系;
例如:有时候改动了php.ini文件,重启了服务后还是不生效,因为php -i找到的配置文件和在web上phpinfo找到phi.ini不是同一个,如果想找的准确一点,就需要在对应站点的目录下创建一个phpinfo的php文件,在浏览器里打开phpinfo里看到才是最准确的;
[root@localhost_002 111.com]# ls
123.php admin.php image index.php info.php upload
[root@localhost_002 111.com]# cat index.php
<?
phpinfo();
?>
[root@localhost_002 111.com]# cp /usr/local/src/php-7.1.6/php
php7.spec php7.spec.in php.gif php.ini-development php.ini-production
[root@localhost_002 111.com]# cp /usr/local/src/php-7.1.6/php.ini-development /usr/local/php7/etc/php.ini
[root@localhost_002 111.com]# /usr/local/apapche2.4/bin/apachectl graceful
这时候再用流浪器来访问即可:
disable_functions 安全函数
eval 如之前提到的一句话木马涉及到函数,如果把这个函数禁用了,即使上传了一句话木马也不会生效;
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 以上是比较危险的函数
2、那如何禁止了? 配置文件 /usr/local/php7/etc/pin.ini ----> 搜索 disable
搜索diable
在disable_functions = 后添加(禁掉)一些函数:
[root@localhost_002 111.com]# vim /usr/local/php/etc/php.ini
cat /usr/local/php/etc/php.ini |grep disable_functions
#搜索disable_functions = 这里添加则可:
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
注释:当然也可以禁掉phpinfo,很多企业在生成环境中都会禁止掉,因为php涉及到服务器的很多配置信息相关,如果不小心上传到线上,容易被黑客查到,实施攻击;
3、重新加载配置文件:
[root@localhost_002 111.com]# /usr/local/apapche2.4/bin/apachectl graceful
4、在去浏览器访问时,会显示phpinfo被禁止掉了;
5、打开php配置文件:定义如下: date.timezone display_errors
1、定义date.timezone时区,如过不定义,有时候会有写告警信息;
display_errors - On (On表示显示 Off不显示),意思是是否把错误信息显示在浏览器上,这样会把目录给暴露出来,更改为display_errors = Off
[root@localhost_002 ~]# vim /usr/local/php7/etc/php.ini
;删除前面的分号,后面添加Asia/Shanghai或者Asia/Chongqing
date.timezone = Asia/Shanghai
; display_errors
;删除前面的分号,将display_errors = On 改为 display_errors = Off
display_errors = Off
; separately from display_errors. PHP's default behavior is to suppress those
2、检测配置文件是否错误,重新启动apache服务;
[root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl -t
Syntax OK
[root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl graceful
3、这是去浏览器再次访问:www.111.com/index.php 会发现出现白页,这是因打开display_errors参数;
4、配置错误日记(因为修改display_errors的不显示),错误日记是很有必要的;
log_errors = On #定义错误日记开关(On表示打开; Off表示关闭)
error_log = /tmp/php_error.log #定义错误日记路径;
error_reporting = E_ALL 定义日记级别,默认为ALL,表示把所有的error都记录下来,这是最不严谨的;
注释:生产环境中,使用; E_ALL & ~E_NOTICE (Show all errors, except for notices) 通知
[root@localhost_002 ~]# cat /usr/local/php7/etc/php.ini |grep log_errors
; log_errors
;打开错误日记开关;
log_errors = On
; Set maximum length of log_errors. In error_log information about the source is
log_errors_max_len = 1024
;指定错误日日记的位置 /tmp/php_errors.log
error_log = /tmp/php_errors.log
5、检测配置文件是否存在错误,并重新加载apache;
[root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl -t
Syntax OK
[root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl graceful
6、再次用crul命令访问下,会看到/tmp/目录下生成了php_errors.log
[root@localhost_002 ~]# curl -A 'fenye' -x 127.0.0.1:80 www.111.com/index.php
[root@localhost_002 ~]# cat /tmp/php_errors.log #错误日记内容;
[09-Oct-2018 18:20:22 Asia/Shanghai] PHP Warning: phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2
错误日记文件类型:
[root@localhost_002 ~]# ll /tmp/php_errors.log
-rw-r--r-- 1 daemon daemon 145 10月 9 18:20 /tmp/php_errors.log
注释:如上所示,会看到php_error.log的文件所属主和组是daemon,而daemon实际是httpd的属主;
所以php_error.log是以httpd这个进程的身份去运行的;
注释:如果有时候定义的错误日记一直没有生成的话,则要看看定义错误日记所在目录有没有写权限(这个写文件的人是daemon);
保险一点,就是在所在目录下创建一个错误日记文件,然后赋予它777权限,这样就不用担心httpd是否有写权限了;
[root@localhost_002 ~]# cat /usr/local/php7/etc/php.ini |grep error_log
; server-specific log, STDERR, or a location specified by the error_log
; Set maximum length of log_errors. In error_log information about the source is
error_log = /tmp/php_errors.log
;error_log = syslog
[root@localhost_002 ~]# touch /tmp/php_errors.log ; chmod 777 /tmp/php_errors.log
7、查看错误日记文件: 提示因为安全原因,这个函数被禁掉了;
[root@localhost_002 ~]# cat /tmp/php_errors.log #错误日记内容;
[09-Oct-2018 18:20:22 Asia/Shanghai] PHP Warning: phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2
3、安全相关参数: open_basedir
如:一台服务器上,运行了多个站点,其中有个站点的代码有问题,被黑客攻击了并且拿到了权限,黑客拿了权限会继续往里面渗透,就有可能渗透到其他站点,导致其他站点也被黑;
多个站点 A网站在A目录; B网站在B目录; 互相隔离;
一个站点 也可以只把它限制在这个目录,只能在这个目录活动;
open_basedir 它是一个安全选项,限制不能串岗;只能给它限制在这个目录下活动;
1、配置:打开配置文件: /usr/local/php7/etc/php.ini
[root@localhost_002 ~]# cat /usr/local/php7/etc/php.ini |grep open_basedir
; open_basedir, if set, limits all file operations to the defined directory
open_basedir = /data/wwwroot/111.com:/tmp
;删除分号,并添加目录,多个目录有冒号隔开;
扩展注释:此处如果不小心写错了目录,访问是会报500的错误,查看错误日记提示没有权限;
[root@localhost_002 ~]# curl -A 'fenye' -x 127.0.0.1:80 www.111.com/index.php -I
HTTP/1.0 500 Internal Server Error
Date: Tue, 09 Oct 2018 10:51:21 GMT
[root@localhost_002 ~]# tail /tmp/php_errors.log
[09-Oct-2018 18:52:10 Asia/Shanghai] PHP Warning: Unknown: open_basedir restriction in effect. File(/data/wwwroot/111.com/index.php) is not within the allowed path(s): (/data/wwwroot/1111.com:/tmp) in Unknown on line 0
[09-Oct-2018 18:52:10 Asia/Shanghai] PHP Warning: Unknown: failed to open stream: Operation not permitted in Unknown on line 0
[09-Oct-2018 18:52:10 Asia/Shanghai] PHP Fatal error: Unknown: Failed opening required '/data/wwwroot/111.com/index.php' (include_path='.:/usr/local/php7/lib/php') in Unknown on line 0
2、检测配置文件是否有错误,并重启apache;
[root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl -t
Syntax OK
[root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl graceful
3、再次访问,会显示正常;
[root@localhost_002 ~]# curl -A 'fenye' -x 127.0.0.1:80 www.111.com/index.php -I
HTTP/1.1 200 OK
Date: Tue, 09 Oct 2018 10:55:32 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
4:若是服务器上跑了多个站点,那怎么来限制了???
应该是针对站点这些网站去做open_basedir,但php.ini是做不到,因为php.ini是针对所有站点的(这样也没意义);
但我们可以在虚拟主机里去设置,apache的虚拟主机配置文件中针对不同的虚拟主机去设置open_basedir;
注释:多个站点要在虚拟主机里设置open_basedir时,需要每个站点都指定,如果只指定了一个站点,那其他的站点也就没办法访问了;
注释:也可以在虚拟主机配置文件设置error_log错误日记的位置及error_reporting日记级别等;
[root@localhost_002 abc.com]# vim /usr/local/apapche2.4/conf/extra/httpd-vhosts.conf
# Virtual Hosts
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
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
php_admin_value open_basedir "/data/wwwroot/abc.com:/tmp/" #定义open_basedir;
</VirtualHost>
<VirtualHost *:80>
ServerAdmin yuanhh@foreb.com
DocumentRoot "/data/wwwroot/111.com"
ServerName www.111.com
ServerAlias www.example.com www.2111.com
#<Directory /data/wwwroot/111.com> #用户验证;
#<FilesMatch 123.php>
# AllowOverride AuthConfig
# AuthName "111.com user auth"
# AuthType Basic
# AuthUserFile /data/.htpasswd
# require valid-user
# </FilesMatch>
# </Directory>
# Directory针对目录进行
php_admin_value open_basedir "/data/wwwroot/111.com:/tmp" #定义open_basedir
<IfModule mod_rewrite.c> #针对user_agent做限制(cc攻击);
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR] #条件
RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC] #条件
RewriteRule .* - [F]
</IfModule>
<Directory /data/wwwroot/111.com/upload> #某些目录不解析php;
php_admin_flag engine off
<FilesMatch (.*)\.php(.*)>
Order allow,deny
Deny from all
</FilesMatch>
</Directory>
<Directory /data/wwwroot/111.com> #针对目录做验证;
<FilesMatch admin.php(.*)>
Order deny,allow
Deny from all
Allow from 127.0.0.1
</FilesMatch>
</Directory>
<Directory /data/wwwroot/111.com> #防盗链;
SetEnvIfNoCase Referer "http://www.111.com" local_ref
SetEnvIfNoCase Referer "http://www.example.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>
<IfModule mod_rewrite.c> #重定向;
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www.111.com$
RewriteRule ^/(.*)$ http://www.111.com/$1 [R=301,L]
</IfModule>
ErrorLog "logs/111.com-error_log"
CustomLog "logs/111.com-access_log" combined
</VirtualHost>
5、检测配置文件是否有错误,重新加载配置文件;
[root@localhost_002 abc.com]# /usr/local/apapche2.4/bin/apachectl -t
Syntax OK
[root@localhost_002 abc.com]# /usr/local/apapche2.4/bin/apachectl graceful
6、curl命令测试
虚拟主机里第一个网站访问; www.123.com
[root@localhost_002 abc.com]# curl -x 127.0.0.1:80 www.123.com/index.php -I
HTTP/1.1 200 OK
Date: Tue, 09 Oct 2018 11:15:22 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
虚拟主机第二个网站访问; www.111.com
[root@localhost_002 abc.com]# curl -A "fenye" -x 127.0.0.1:80 www.111.com/index.php -I
HTTP/1.1 200 OK
Date: Tue, 09 Oct 2018 11:15:42 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(禁止了curl标识),只能通过curl -A "新标示" 的方式来访问;
7、浏览器访问;
第一个站点:www.123.com
第二个站点:www.111.com
扩展:
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
来源:oschina
链接:https://my.oschina.net/u/3711371/blog/2236868