码迷,mamicode.com
首页 > 其他好文 > 详细

2018.3.7 11周2次课

时间:2018-03-08 10:40:45      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:Linux学习

十一周二次课(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

  1. 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

技术分享图片

技术分享图片

  1. date.timezone =Asia/Shanghai    //定义时区

  2. 错误日志: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/"

技术分享图片

技术分享图片


2018.3.7 11周2次课

标签:Linux学习

原文地址:http://blog.51cto.com/415326/2084078

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!