您的位置:首页 > 编程语言 > PHP开发

0511LAMP-防盗链、访问控制Directory和FilesMatch、限定某个目录禁止解析php、限制user_agent、php相关配置和扩展模块安装

2019-05-10 01:06 579 查看

 

任务列表:
11.25 配置防盗链
11.26 访问控制Directory
11.27 访问控制FilesMatch
11.28 限定某个目录禁止解析php
11.29 限制user_agent
11.30/11.31 php相关配置
11.32 php扩展模块安装
扩展
几种限制ip的方法 http://ask.apelearn.com/question/6519
apache 配置https 支持ssl http://ask.apelearn.com/question/1029
apache rewrite教程 http://coffeelet.blog.163.com/blog/static/13515745320115842755199/   http://www.cnblogs.com/top5/archive/2009/08/12/1544098.html
apache rewrite 出现死循环 http://ask.apelearn.com/question/1043
php错误日志级别参考  http://ask.apelearn.com/question/6973

 

pecl.php.net
pecl  安装管理扩展模块
pecl  install  redis
pecl  install  memcache
 

 

一、配置Apache防盗链

防盗链,通过限制referer来实现防盗链的功能,通俗讲就是不让别人盗用你网站上的资源,这个资源指的是图片、视频、歌曲、文档等,在这之前需要理解一下referer的概念,如果你通过A网站的一个页面http://a.com/a.html里面的链接去访问B网站的一个页面http://b.com/b.html,那么这个B网站页面的referer就是http://a.com/a.html。也就是说,一个referer就是一个网址。

打开虚拟主机配置文件,按以下内容配置虚拟主机;

vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf     //编辑虚拟主机配置文件

 /usr/local/apache2.4/bin/apachectl -t
 /usr/local/apache2.4/bin/apachectl graceful

SetEnvIfNoCase Referer "^$" local_ref    定义为空referer,可直接访问图片

通过指定的referer来访问:

但是这个只是针对以下几种格式的内容: <FilesMatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)">

定义111.com: SetEnvIfNoCase Referer "http://111.com" local_ref

定义aaa.com: SetEnvIfNoCase Referer "http://aaa.com" local_ref

如果把空referer注释掉去访问图片的话,显示如下

 curl -x192.168.56.3:80 111.com/qq.jpg -I        直接访问,状态200,相当于空refer

模拟referer为www.qq.com

 curl -e "http://www.qq.com/123.txt" -x192.168.56.3:80 111.com/qq.jpg -I

curl -e  定义referer为www.qq.com,返回Forbidden,禁止referer

 curl -e "http://111.com/123.txt" -x192.168.56.3:80 111.com/qq.jpg -I        定义refer为111.com,可以访问

二、Apache访问控制– Directory

对于一些比较重要的网站内容,除了可以使用用户认证限制访问之外,还可以通过其他一些方法做到限制,比如限制IP,也可以限制user_agent。限制IP指的是限制访问网址的来源IP,而限制user_agent,通常用来限制恶意或者不正常的请求.

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

order 用来定义顺序,先deny或allow,不管ip是否匹配,都会按顺序执行完

实验:

/usr/local/apache2.4/bin/apachectl -t

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

 准备工作:

在允许IP 127.0.0.1下,访问admin目录

curl -x127.0.0.1:80 111.com/admin/index.php -I   可以访问

curl -x192.168.187.3:80 111.com/admin/index.php  当更改源ip即目标ip,访问报错403

curl测试状态码为403则被限制访问了

三、访问控制FilesMatch

这种格式可以使用FilesMatch去匹配

编辑虚拟主机配置文件,进行FilesMatch配置;既要匹配文件,又要限制IP;

<Filesmatch admin.php(.*)> //文件匹配admin.php后面跟任意的字符

Allow from 127.0.0.1 //只允许127.0.0.1访问

403 Forbidden //因为只允许IP:127.0.0.1访问

404 Not Found //能够连接,但是无此页面

四、限定某个目录禁止解析php

有这样一种情况,有些站点和论坛是允许上传图片到服务器,他们上传一些php或者js到服务器,然后被我们执行加载,从而对数据造成威胁。 为了避免这种事情的发生,我们需要限制上传类型。

编辑虚拟主机配置文件,进行以下配置;

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

<Directory /data/wwwroot/111.com/upload>
        php_admin_flag engine off
        <FilesMatch (.*)\.php(.*)>
        Order deny,allow
        Deny from all
       </Filesmatch>
</Directory>
 

加deny是为了防止源代码被访问

/usr/local/apache2.4/bin/apachectl -t

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

创建目录,并把123.php复制到upload

进行测试,发现禁止解析php,也不能输出源代码;

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

curl -x127.0.0.1:80 http://111.com/upload/123.php     //禁止访问,也不能输出源代码

再进行配置,把FilesMatch部分不执行,加上#号

进行测试,结果不能解析php,只能输出源代码;

把FilesMatch注释取消,即可限制输出源代码,显示403

因此为了安全,我们必须让其根本不能访问php(匹配.php),不给其解析机会,不能访问源代码

五、访问控制,限制user_agent

User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。

 

 <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{HTTP_USER_AGENT}  .*curl.* [NC,OR]        //定义条件,在这两个条件之间使用OR作为连接符,user_agent匹配第一个条件或第二个条件,不加OR就是并且的关系(不推荐使用),NC表示忽略大小写
        RewriteCond %{HTTP_USER_AGENT}  .*baidu.com.* [NC]        定义条件
        RewriteRule  .*  -  [F]
    </IfModule>

/usr/local/apache2.4/bin/apachectl -t

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

 curl -x127.0.0.1:80 'http://111.com/123.php' -I        直接用curl访问111.com目录下的123.php,禁止访问,因为user_agent是匹配curl

用curl -A自定义user_agent的值

 curl -A "tobe" -x127.0.0.1:80 'http://111.com/123.php' -I    指定user_agent为tobe,可以访问

 tail /usr/local/apache2.4/logs/111.com-access_20190512.log  查看日志,可以看出user_agent为"curl/7.29.0" ,和tobe

curl -A  指定user_agent

curl -e指定referer     "http://"

curl -x 相当于省略了hosts

-I 查看状态码

六、php相关配置

查看php配置文件位置

通过编辑index.php内容查看

<?php

phpinfo();

Configuration File (php.ini) Path     配置文件所在目录:/usr/local/php7/etc

Loaded Configuration File    没有加载

使Loaded Configuration File    加载:

到php源码包配置文件中:cd /usr/local/src/php-7.1.25/

找到php.ini-development复制到/usr/local/php7/etc/目录下

cp php.ini-development /usr/local/php7/etc/php.ini

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

此时已经加载

date.timezone   设置时区

对php的安全函数配置

vim /usr/local/php7/etc/php.ini      编辑/usr/local/php7/etc/php.ini配置文件

搜索 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   这些函数都是比较危险的,为了安全,一般要把他们禁用

/usr/local/apache2.4/bin/apachectl graceful  重新加载,此时已经禁用了phpinfo

在访问时会报错,并且会显示错误信息,显示目录

在编辑脚本 vim /usr/local/php7/etc/php.ini

搜索display_errors               display_errors = off //把on改为off

/usr/local/apache2.4/bin/apachectl -t

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

此时显示空页面

设置php的错误日志

vim /usr/local/php7/etc/php.ini

搜索log_errors

log_errors = On //定义错误日志是否开启,开启on
用error_log定义路径 

设置error_reporting 错误级别  

error_reporting = E_ALL  默认为E_ALL

更改为error_reporting = E_ALL & ~E_NOTICE //在生产环境中,最常用的就是这个!有时候出现notice并不是出错

/usr/local/apache2.4/bin/apachectl -t

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

 curl -A "tobe" -x127.0.0.1:80 'http://111.com/index.php'  继续访问,没有输出

此时有设置的错误日志出现

查看看这个错误日志的权限,发现为daemon;说明跟httpd配置文件相关,daemon用户是httpd的属主,日志是已进程的身份进行的,如果定义了错误日志,但是始终没有生成,需要检查一下定义错误日志存放的目录是否有写权限,为了防止这种情况发生,可以先创建该目录,并给权限 

查看php错误日志cat /tmp/php_errors.log

模拟错误:

vim /data/wwwroot/111.com/2.php //新建2.php

 curl -A "to" -x127.0.0.1:80 http://111.com/2.php    空页面

 curl -A "to" -x127.0.0.1:80 http://111.com/2.php -I    500状态码

查看错误日志,可以看出不同的错误级别

open_basedir配置

open_basedir安全选项

如果有一台服务器跑了很多个站点,其中就有一个站的程序写的很烂,漏洞百出,很容易被黑,一旦该站点被黑,整个服务器就会沦陷,其它站点同样也会被黑。在php配置文件中设置open_basedir防止该情况发生。

在php配置文件中,把111.com故意写成1111.com

curl -A "to" -x127.0.0.1:80 http://111.com/2.php -I   返回状态码500

在php配置文件中,把错误的目录1111.com改回111.com

curl -A "to" -x127.0.0.1:80 http://111.com/2.php -I    此时返回正常

 

针对不同的虚拟主机设定不同的open_basedir,当有多个站点时php.ini就无法满足要求了,php.ini是针对所有站点的

针对不同的虚拟主机限定不同的open_basedir,可以通过设置apache的虚拟主机配置文件设置

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

php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/"   加入此命令

默认的临时文件在tmp下,如果限制了tmp,临时文件都无法写入

重启配置后,可以访问成功

/usr/local/apache2.4/bin/apachectl -t

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

七、PHP扩展模块安装

 /usr/local/php/bin/php -m //查看模块

1. 下载模块包安装

安装一个redis的模块,下载源码包

cd /usr/local/src/   进入目录

wget https://codeload.github.com/phpredis/phpredis/zip/develop   下载

mv develop phpredis-develop.zip   把下载的包改名

 unzip phpredis-develop.zip  解压

cd phpredis-develop/  进入目录

生成configure 文件  :/usr/local/php7/bin/phpize  此时报错,提示缺少autoconf包

安装:yum install -y autoconf

继续执行生成configure文件,生成成功

配置、编译,安装

./configure --with-php-config=/usr/local/php7/bin/php-config

make && make install

编译完成后会把redis.so放到 /usr/local/php7/lib/php/extensions/no-debug-zts-20160303/这个目录下

 /usr/local/php7/bin/php -i |grep extension_dir     //查看扩展模块存放目录,可以在php.ini中去自定义该路径

/usr/local/php7/lib/php/extensions/no-debug-zts-20160303/路径和上面看的是同样的

  /usr/local/php7/bin/php -m |grep redis  此时还没有该模块

目录为空,此时在php.ini加载一条扩展语句

vim /usr/local/php7/etc/php.ini

添加extension=redis.so

 /usr/local/php7/bin/php -m |grep redis  此时已经加载

2. 编译自带的PHP源码包

php7的源码包中,有很多自带的源码包。我们不需要再次下载,直接编译即可!

cd /usr/local/src/php-7.1.25/

cd ext/

 /usr/local/php7/bin/php -m |grep zip  此时没有zip模块

想要编译zip模块

进入zip目录    cd zip/

/usr/local/php7/bin/phpize    //生成configure文件

配置、编译,安装

./configure --with-php-config=/usr/local/php7/bin/php-config

make && make install

查看目录,此时发现zip.so模块

ls /usr/local/php7/lib/php/extensions/no-debug-zts-20160303/

(adsbygoogle = window.adsbygoogle || []).push({});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  curl PHP Apache LAMP V-IM
相关文章推荐