2019独角兽企业重金招聘Python工程师标准>>>
任务列表:
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来访问:
但是这个只是针对以下几种格式的内容:
定义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;
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
php_admin_flag engine off
Order deny,allow
Deny from all
加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 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR] //定义条件,在这两个条件之间使用OR作为连接符,user_agent匹配第一个条件或第二个条件,不加OR就是并且的关系(不推荐使用),NC表示忽略大小写
RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC] 定义条件
RewriteRule .* - [F]
/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内容查看
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/