6月1日任务

11.28限定某个目录禁止解析php

通常网站会有一个目录用于上传文件,但如果某些别有用心的人上传一个php文件,当这个php被执行时就有可能获取一些系统权限,比较危险。所以,我们可以对这个上传的目录里的文件设置禁止解析php,来提高网站安全性。

配置文件

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

<Directory /data/wwwroot/111.com/upload> 
        php_admin_flag engine off
       <FilesMatch (.*)\.php(.*) >    //截图php多了一个点
       Order allow,deny                  //截图deny前面多了个空格
      </FilesMatch>
    </Directory>

6月1日任务

不禁止访问php,别人是可以访问源代码的


测试一下禁止解析php

1,先把禁止访问php文件那几行注释掉,然后检查语法重新加载

6月1日任务

2.创建upload目录,复制123.php到upload目录下

# mkdir /data/wwwroot/111.com/upload

# cp /data/wwwroot/111.com/123.php /data/wwwroot/111.com/upload/

3.进行访问

# curl -x127.0.0.1:80  111.com/upload/123.php   //可以看到直接显示文件源代码了

6月1日任务

网页访问,就直接下载了


6月1日任务



加上禁止访问php那几行配置

6月1日任务

再进行访问

# curl -x127.0.0.1:80  111.com/upload/123.php

6月1日任务

6月1日任务

11.29限制user_agent

CC攻击:攻击者借助代理服务器生成指向受害主机的合法请求,实现DDOS和伪装就叫:CC(ChallengeCollapsar)

由于CC攻击一般采用相同的user_agent,比较规律,所以我们可以通过限制user_agent来在一定程度上防止CC攻击。

user_agent可以理解为浏览器标识

1.编辑配置文件,添加以下内容

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

6月1日任务

这里使用到了RewriteEngine, OR是或者的意思,这就是就是匹配curl或baidu.com,NC表示忽略大小写

RewriteRule  .*  -  [F]   //就是禁止

2.检查语法,重新加载

3.用curl进行访问,403

6月1日任务

4,自定义agent

6月1日任务

5.查看访问日志

6月1日任务

//-A指定useragent  -x相当于省略了host  -I 进查看状态码  -e指定referer



11.30PHP相关配置

1.查看php配置文件位置

#/usr/local/php/bin/php -i|grep -i "loaded configuration file"  //这个查找的不一定准确

6月1日任务


2.比较准确的是用phpinfo来进行查找

# cd /data/wwwroot/111.com/

# vim index.php

6月1日任务

打开浏览器进行访问  //可以看到配置文件是none

6月1日任务


3.加载php配置文件

没有加载就去复制一份到配置文件目录

# cd /usr/local/src/php-7.1.18/   

# cp php.ini-development  /usr/local/php7/etc/php.ini     //复制的开发版的

重新加载一下配置

# /usr/local/apache2.4/bin/apachectl graceful

重新刷新一下网页,可以看到配置文件已经加载了

6月1日任务


4.查看及编辑配置文件内容

#   vim /usr/local/php7/etc/php.ini
6月1日任务

常用配置

1.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(这个通常也要禁掉)

6月1日任务

测试一下phpinfo,网页访问index.php

6月1日任务

2.data.timezone   // 定义一下时区,不然会有一些警告,这里定位到Aisa/Shanghai

6月1日任务


3.日志相关

display_errors        //默认是开启的,错误会显示在浏览器上,暴露目录,这里把它改为Off

6月1日任务

重新打开网页,就变成空白了

6月1日任务

但是这样,什么错误也看不到也不是我们想要的,所以同时要配置一下错误日志,让错误在日志里显示

log_errors   //定义错误日志是否开启

6月1日任务


error_log     //定义错误日志输出路径

6月1日任务

这里把它定义到tmp下

6月1日任务


error_reporting        //定义日志输出级别

6月1日任务

6月1日任务  //默认是all,不太严谨,生产环境一般用E_ALL & ~E_NOTICE

试验是否生成了错误日志

6月1日任务

6月1日任务


另外,错误日志用户和组是daemon

6月1日任务

6月1日任务

错误日志,有时可能因为权限问题无法生成,为了保险起见,我们可以创建错误日志,并给予777权限

# touch /tmp/php_errors.log ;chmod 777 /tmp/php_errors.log


再模拟一个错误

#vim /data/wwwroot/111.com/2.php

6月1日任务

# curl  -x127.0.0.1:80  111.com/2.php -I

6月1日任务

#cat /tmp/php_errors.log

6月1日任务


4.open_basedir     设置允许访问的路径

一台服务器上跑了多个站点,其中一个代码有问题被黑了,其他的站点很可能一样被黑掉,而设置open_basedir,一般只能黑掉一个目录,其他的看不到,就能提高很大安全性,这就是它的作用。

即使只有单个站点,设置open_basedir也是有必要的

open_basedir = /data/wwwroot/111.com:/tmp     //这里设置只允许访问111.com和tmp

6月1日任务

但是如果有多个站点,在php.ini中这样设定是针对所有站点的,这样不合适,我们可以在虚拟主机配置文件中来做限制

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


配置语句是

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

6月1日任务

这样就可以根据虚拟主机来设置目录了,注意tmp目录要有,php在运行中会生成临时文件的。