十一周二次课(3月7日)
11.28 限定某个目录禁止解析php 11.29 限制user_agent 11.30/11.31 php相关配置
11.28 限定某个目录禁止解析php
对于使用PHP语言编写的网站,有一些目录是有需求上传文件的,比如在前面列举的那个防盗链案例,因为服务器可以上传图片,并且没有做防盗链,所以被人家当成了一个图片存储服务器,并且盗用带宽流量。如果网站代码有漏洞,让黑客上传了一个用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(.*)">
Require all denied
</FilesMatch>
</Directory>
测试:
配置文件中FilesMatch字段起作用:
注释掉FilesMatch字段
#<FilesMatch "(.*).php(.*)">
# Require all denied //拒绝所有(apache2.4配置文件里的写法。2.2里没有)
#</FilesMatch>
再次测试:能访问,但不能解析,直接显示源代码
curl测试时直接返回了php源代码,并未解析
11.29 限制user_agent
前面讲过user_agent为浏览器标识,当用curl访问时,user_agent为“curl/7.29.0",用Firefox浏览器访问时,user_agent为“Mozilla/5.0 (Windows NT 6.1;Win64; x64;rv:52.0)Gecko/20100101 Firefox/52 .0在工作中经常针对user_agent来限制一些访问,比如可以限制一些不太友好的搜索引擎“爬虫",你之所以能在百度搜到阿铭的论坛,就是因为百度会派一些“蜘蛛爬虫" 过来抓取网站数据。“蜘蛛爬虫" 抓取数据类似于用户用浏览器访问网站,当“蜘蛛爬虫"太多或者访问太频繁,就会浪费服务器资源。另外,也可以限制恶意请求,这种恶意请求我们通常称作cc攻击,它的原理很简单,就是用很多用户的电脑同时访问同一个站点,当访问量或者频率达到一定层次,会耗尽服务器资源,从而使之不能正常提供服务。这种cc攻击其实有很明显的规律,其中这些恶意请求的user_ agent相同或者相似,那我们就可以通过限制user_ agent发挥防攻击的作用。
user_agent可以理解为浏览器标识
编辑虚拟主机配置文件:vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR] //user_agent匹配curl,OR:或者(与下一个条件的连接符),NC:不区分大小写
RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC] // user_agent匹配baidu.com
RewriteRule .* - [F] //F:相当于Forbidden
</IfModule>
这个需求也用到了rewrite模块,%{HTTP_USER_AGENT} 为user_agent的内置变量
测试:
user_agent为“curl/7.29.0”匹配了第一个条件。所以会403
自定义user_agent:-A
user_agent为自定义的“aminglinux”,没有匹配任何条件,所以状态码200
11.30/11.31 php相关配置
虽然PHP是以httpd一个模块的形式存在的,但是PHP本身也有自己的配置文件
查看php配置文件位置:/usr/local/php/bin/php -i|grep -i "loaded configuration file": //用-i不一定准确
通过浏览器查看phpinfo来查找php.ini位置: //是最准的
更改index.php:
<?php
phpinfo();
通过浏览器:
配置文件目录是:
没有加载
去源码包里复制:
cd /usr/local/src/php-7.2.2
cp php.ini-development /usr/local/php7/etc/php.ini
/usr/local/apache2.4/bin/apachectl graceful
再刷新网页就出来了
php配置:vim /usr/local/php7/etc/php.ini
PHP有诸多内置的函数,有一些函数(比如exec)会直接调取Linux系统命令,如果开放将会非常危险。因此,基于安全考虑应该把一些存在安全风险的函数禁掉
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
date.timezone =Asia/Shanghai //定义时区
错误日志:error_log
搜索display_errors更改为
display_errors = Off // display_errors设置为on,则会把错误日志直接显示在浏览器里,这样对于用户访问来说体验不好,而且还会暴露网站的一些文件路径等重要信息,所以要设置为off
搜索log_errors,更改为log_errors = On //打开错误日志,如果想让PHP记录错误日志, 需要设置为on
搜索error_log,更改为error_log = /tmp/php_errors.log //定义错误日志路径
搜索error_reporting,更改为error_reportinr = E_ALL & ~E_NOTICE // error_reporting设定错误日志的级别,E _ALL为所有类型的日志,不管是提醒还是警告都会记录。在开发环境下面设置为E _ALL, 可以方便程序员排查问题,但也会造成日志记录很多无意义的内容。&符号表示并且,~表示排除,所以两个组合在一起就是在E_ ALL的基础上排除掉notice相关的日志。
显示的是白页
查看日志:
查看属主信息:是daemon
daemon是httpd的属主:
错误日志是已httpd的进程身份去生成的
需要保证PHP的错误日志所在的目录存在,并且权限为可写
可以先创建日志文件,再给文件777的权限
模拟一个错误:状态码是500
错误日志级别是error,比warning要高级了。说明很严重。
通过日志我们可以判断,在2.php文件第三行少了分号。
配置open_basedir
一个服务器上跑很多网站,这是几乎所有小公司为节省成本采用的做法,但这样做也会有一些弊端:多个网站跑在同一个服务器上,如果其中一个网站被黑,很有可能连累到其他站点。为了避免这种尴尬的事情发生,我们应当作一些预防手段。
还好PHP有一个概念叫作open_basedir,它的作用是将网站限定在指定目录里,就算该站点被了,黑客只能在该目录下面有所作为,而不能左右其他目录。如果你的服务器上只有一个站点,那以直接php.ini中设置open_basedir参数。但如果服务器上跑的站点比较多,那在php.ini中设置就不适了,因为在php.ini中只能定义一次,也就是说所有站点都一起定义限定的目录,那这样似乎起不到隔离多个站点的目的。
在php.ini中设置open-basedir: vim /usr/local/php7/etc/php.ini
open_basedir = /data/wwwroot/111.com:/tmp/ //可以是多个目录,用:分隔
测试:状态码500
查看日志文件
在虚拟主机配置文件httpd.conf里可以给单个虚拟主机设置open_basedir
在2台虚拟主机配置里分别加入open_basedir设置
php_admin_value open_basedir "/data/wwwroot/abc.com:/tmp/"
php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/"