一、限制某个目录禁止解析php:php
<Directory /data/wwwroot/www.123.com/upload> php_admin_flag engine off </Directory>
注释:核心配置内容如上,curl测试时直接返回源代码,并未解析;html
二、假设有一个目录能够上传图片,有可能被别有用心的人上传了php(木马类型)的文件,由于httpd加载了php的模块,只要访问php的请求就会解析,由于php有一些函数,一旦开放了上传文件的权限,确定会被上传一些木马文件,一旦被执行,就能拿到服务器的root权限,或者被恶意篡改一些参数,致使服务器瘫痪;web
有一台服务器被入侵了,不知道是什么缘由,也不知道入侵到什么程度,只知道公司的数据库泄露了,数据是一些电话号码,黑客并无去删除数据,由于他知道这个服务器的数据库里电话号码天天都在增长,他能够源源不断获取新的电话号码,而后买给第三方来获利;sql
分析:把一个新的号码在这个服务器提交后,立刻就有人打电话过来了,证实,黑客得到电话号码,到打电话给新用户,这套体系已经彻底自动化,天天去抓电话号码队列,因此猜想网站的php程序存在漏洞,另外一种就是sql注入的漏洞(能够把查询的sql经过一些特殊的提交,提交到服务器上,服务器就会把这个sql语句转换成正常的查询,最终得到一些数据回来);可是sql注入漏洞,很容易修复,只要在网站提交的入口,增长一些特殊符号的过滤,就能彻底的阻断sql注入的漏洞。shell
解决办法:首先抓包,监控数据库的查询,写一个死循环的脚本,每隔一分钟抓一次查询数据,抓完之后生成一个日志文件;数据库
查询日记文件后,发现有一条sql查询,和网站原生的查询不同,经过日志定位到了时间点,而后就去web服务器上查看时间点的访问日志,经过日志查看到了一个很是特殊的请求,名字是以php结尾的文件,并且这个php文件是在图片的目录下进行访问的,而后去查看这个php 文件,发现这个文件内容是一句话木马,用来是获取服务器的权限,至关于在服务器开了一个后门;这个问题产生的根本缘由,就是由于上传图片目录并无禁止解析phpapache
sql注入:就是经过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来讲,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它能够经过在Web表单中输入(恶意)SQL语句获得一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。[1] 好比先前的不少影视网站泄露VIP会员密码大多就是经过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击;vim
禁止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的:
二、访问控制:user_agent限制
扩展:cc攻击,就是黑客经过肉鸡去同时访问某一个站点,超过服务器并发,就会致使宕机,没有什么特殊的,让站点超过并发致使严重超负荷宕机,可是CC攻击有一个规则的特征,就是user_agent是一致的,好比同一个ip,同一个标识等,遇到这种user_agent频繁访问的状况就能够判定是CC攻击了,咱们能够经过限制它的user_agent来减轻服务器的压力,只须要让它正常访问的状态码变为403,用来减轻服务器的压力,由于403仅仅是一个请求,带宽耗费不会太大。
user_agent 是浏览器标识:curl -A "123123" 指定user_agent
一、核心配置文件内容:
[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;
二、检测配置文件并重启服务:
[root@localhost_002 extra]# /usr/local/apapche2.4/bin/apachectl -t Syntax OK [root@localhost_002 extra]# /usr/local/apapche2.4/bin/apachectl graceful
三、在访问的时候,会显示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
四、查看访问日记(刚刚访问的最后两条日记):
[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"
五、测试是不是由于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代理
三、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/"
一、查看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 以上是比较危险的函数
二、那如何禁止了? 配置文件 /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涉及到服务器的不少配置信息相关,若是不当心上传到线上,容易被黑客查到,实施攻击;
三、从新加载配置文件:
[root@localhost_002 111.com]# /usr/local/apapche2.4/bin/apachectl graceful
四、在去浏览器访问时,会显示phpinfo被禁止掉了;
五、打开php配置文件:定义以下: date.timezone display_errors
一、定义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
二、检测配置文件是否错误,从新启动apache服务;
[root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl -t Syntax OK [root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl graceful
三、这是去浏览器再次访问:www.111.com/index.php 会发现出现白页,这是因打开display_errors参数;
四、配置错误日记(由于修改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
五、检测配置文件是否存在错误,并从新加载apache;
[root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl -t Syntax OK [root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl graceful
六、再次用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
七、查看错误日记文件: 提示由于安全缘由,这个函数被禁掉了;
[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
三、安全相关参数: open_basedir
如:一台服务器上,运行了多个站点,其中有个站点的代码有问题,被黑客攻击了而且拿到了权限,黑客拿了权限会继续往里面渗透,就有可能渗透到其余站点,致使其余站点也被黑;
多个站点 A网站在A目录; B网站在B目录; 互相隔离;
一个站点 也能够只把它限制在这个目录,只能在这个目录活动;
open_basedir 它是一个安全选项,限制不能串岗;只能给它限制在这个目录下活动;
一、配置:打开配置文件: /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
二、检测配置文件是否有错误,并重启apache;
[root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl -t Syntax OK [root@localhost_002 ~]# /usr/local/apapche2.4/bin/apachectl graceful
三、再次访问,会显示正常;
[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>
五、检测配置文件是否有错误,从新加载配置文件;
[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
六、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 "新标示" 的方式来访问;
七、浏览器访问;
第一个站点: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