LAMP架构(3)

设置防盗链

防盗链的作用是,我们网站的图片,只能通过我们自己的网站去访问,其他网站借用不行。 
比如:我们的网站,被用户上传了很多图片,而用户又在他自己的网站上加上了我们网站图片的链接,就直接能访问了。 
这样可以节省他网站的带宽
一、图片防盗链原理 
http标准协议中有专门的字段记录referer 
一来可以追溯上一个入站地址是什么 
二来对于资源文件,可以跟踪到包含显示他的网页地址是什么 
因此所有防盗链方法都是基于这个Referer字段
如果是直接在浏览器上输入地址,回来进来,则没有referer头。
这也是:为什么服务器知道我们的图片是从哪儿引用的,也知道我们的客户从哪个网站链接点击过来的
referer防盗链的配置文件:
<Directory /data/wwwroot/ www.123.com >//用来定义那个目录,就是站点所在目录
SetEnvIfNoCase Referer " http://www.123.com " local_ref //定义referer的白名单
SetEnvIfNoCase Referer "http://123.com" local_ref //定义referer的白名单
SetEnvIfNoCase Referer "^$" local_ref //定义referer的白名单(空的referer,直接输入网址进去的,没经过其他网站跳转)
<filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif)"> //定义规则,针对那些访问做防盗链
Order Allow,Deny //定义访问控制的
Allow from env=local_ref //允许白名单的referer
</filesmatch>
</Directory>
在Apache设置防盗链:
打开虚拟配置文件:
[root@ma-1 ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

<VirtualHost *:80>
DocumentRoot "/data/wwwroot/111.com"
ServerName 111.com

<Directory /data/wwwroot/111.com>
SetEnvIfNoCase Referer "http://111.com" local_ref
SetEnvIfNoCase Referer "http://111.com" local_ref
SetEnvIfNoCase Referer "^$" local_ref
<filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)">
Order Allow,Deny
Allow from env=local_ref
</filesmatch>
</Directory>

SetEnvIf Request_URI ".*\.gif$" img
SetEnvIf Request_URI ".*\.jpg$" img
SetEnvIf Request_URI ".*\.png$" img
SetEnvIf Request_URI ".*\.bmp$" img
SetEnvIf Request_URI ".*\.swf$" img
SetEnvIf Request_URI ".*\.js$" img
SetEnvIf Request_URI ".*\.css$" img
ErrorLog "logs/111.com-error_log"
CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/111.com-access_%Y%m%d.log 86400" combined env=!img
</VirtualHost>
保存退出,检查配置文件语法并重新加载配置文件
[root@ma-1 ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@ma-1 ~]# /usr/local/apache2.4/bin/apachectl graceful
这是只有通过referer白名单的才能访问:
用curl测试: 
curl -e 可以指定referer:在白名单里
[root@ma-1 ~]# curl -e "http://111.com/123.txt" -x127.0.0.1:80 111.com/logo.png -I
HTTP/1.1 200 OK
Date: Mon, 25 Dec 2017 09:33:36 GMT
Server: Apache/2.4.29 (Unix) PHP/5.6.30
Last-Modified: Thu, 21 Dec 2017 14:12:26 GMT
ETag: "1914-560da4a1b6680"
Accept-Ranges: bytes
Content-Length: 6420
Content-Type: image/png
不在白名单里的
[root@ma-1 ~]# curl -e " http://www.qq.com/123.txt " -x127.0.0.1:80 111.com/logo.png -I
HTTP/1.1 403 Forbidden
Date: Mon, 25 Dec 2017 09:36:02 GMT
Server: Apache/2.4.29 (Unix) PHP/5.6.30
Content-Type: text/html; charset=iso-8859-1
问题1:
查看日志的时候,明明访问了多次站点,却没有日志。
原因:这里由于访问的是图片,由于以前做过日志不记录静态文件,配置文件没有更改或删除,访问.png时,就没记录。
更改配置文件,将其注释掉。

访问控制

访问控制和用户认证其实是不一样的,用户认证是通过用户名密码的方式允许访问,访问认证是通过允许IP白名单允许访问。
访问控制的配置文件:
<Directory /data/wwwroot/ www.123.com/admin/ > //针对admin目录
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Directory>
order用来定义顺序,是先deny(不允许),allow(允许)。
Order deny,allow
Deny from all
Allow from 127.0.0.1
这里先所有都不允许,在只允许127.0.0.1 。执行完后才生效。 
如果:
Order allow,deny
Deny from all
Allow from 127.0.0.1
先allow在deny。就所有都不允许了。
设置admin文件的访问控制:
打开虚拟配置文件
[root@ma-1 ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf


//设置访问控制

<Directory /data/wwwroot/111.com/admin/>
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Directory>

//设置防盗链

<Directory /data/wwwroot/111.com>
SetEnvIfNoCase Referer "http://111.com" local_ref
SetEnvIfNoCase Referer " http://weibo.com " local_ref
SetEnvIfNoCase Referer "^$" local_ref
<filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)">
Order Allow,Deny
Allow from env=local_ref
</filesmatch>
</Directory>
保存退出,检查配置文件语法并重新加载配置文件
[root@ma-1 ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@ma-1 ~]# /usr/local/apache2.4/bin/apachectl graceful
创建admin文件:
[root@ma-1 ~]# cd /data/wwwroot/111.com/
[root@ma-1 111.com]# mkdir admin/
[root@ma-1 111.com]# touch admin/index.php
[root@ma-1 111.com]# echo '121212' > admin/index.php
[root@ma-1 111.com]# cat admin/index.php
121212
通过curl进行测试:
自测试:
[root@ma-1 111.com]# curl -x127.0.0.1:80 111.com/admin/index.php -I
HTTP/1.1 200 OK
Date: Mon, 25 Dec 2017 10:27:40 GMT
Server: Apache/2.4.29 (Unix) PHP/5.6.30
X-Powered-By: PHP/5.6.30
Content-Type: text/html; charset=UTF-8

[root@ma-1 111.com]# curl -x192.168.176.135:80 111.com/admin/index.php -I
HTTP/1.1 403 Forbidden
Date: Mon, 25 Dec 2017 10:28:56 GMT
Server: Apache/2.4.29 (Unix) PHP/5.6.30
Content-Type: text/html; charset=iso-8859-1
前面访问控制是目录,它还能是一个文件。
<Directory /data/wwwroot/ www.123.com > //在那个目录下
<FilesMatch "admin.php(.*)">
//对于那些文件
Order deny,allow
Deny from all
Allow from 127.0.0.1
</FilesMatch>
</Directory>
关于Apache的访问限制: 

禁止PHP解析

如果网站有漏洞,万一有人在网站上上传一些木马文件,就会存储在网站的目录里,如果被解析就完蛋 
比如,如果黑客上传一个info.php, 同时我们也没有在apache里去设置禁止解析用户上传的文件,那么黑客很有可能会在浏览器里看到我们的配置信息
我们只需要限制这些上传的木马文件即可,限制的2种方法: 
不允许上传,但这是不合适的,所有用户都上传不了了 
即使上传后,也不允许进行任何操作,不允许解析
禁止PHP解析算是一个安全选项。
禁止PHP解析的核心配置文件:
<Directory /data/wwwroot/ www.123.com/upload > //选择目录
php_admin_flag engine off //禁止解析PHP
</Directory>
禁止解析PHP的结果是在网页上直接显示源代码。
对111.com/upload目录做禁止PHP解析。 
编辑虚拟配置文件:
[root@ma-1 ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

<Directory /data/wwwroot/111.com/upload>
php_admin_flag engine off
</Directory>
保存退出检查配置文件语法并重新加载配置文件:
[root@ma-1 ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK

[root@ma-1 ~]# /usr/local/apache2.4/bin/apachectl graceful
当然,禁止解析PHP和访问控制一起使用,效果更好:
编辑配置文件:
<Directory /data/wwwroot/111.com/upload>
php_admin_flag engine off
<FilesMatch (.*)\.php(.*)>
Order allow,deny
deny from all
</FilesMatch>
</Directory>
保存退出重新加载
参考博客:

限制user_agent

user_agent(用户代理):是指浏览器(搜索引擎)的信息包括硬件平台、系统软件、应用软件和用户个人偏好。 
当黑客用CC攻击你的服务器时,查看下日志发现user_agent是一致的,而且一秒钟出现多次user_agent,这样就必须限制user_agent
配置文件:
<IfModule mod_rewrite.c> //使用rewrite模块
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR] //定义user_agent条件,OR表示两条件之间是或者的意思,NC表示忽略大小写
RewriteCond %{HTTP_USER_AGENT} .* baidu.com .* [NC] //定义user_agent条件
RewriteRule .* - [F] // 规则 [F] 表示forbidden(403)
</IfModule>
编辑虚拟配置文件:
[root@ma-1 ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} .* baidu.com .* [NC]
RewriteRule .* - [F]
</IfModule>
保存退出检查配置文件语法并重新加载配置文件:
[root@ma-1 ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK

[root@ma-1 ~]# /usr/local/apache2.4/bin/apachectl graceful
测试:
[root@ma-1 111.com]# curl -x127.0.0.1:80 'http://111.com/123.php' -IHTTP/1.1 403 Forbidden
Date: Tue, 26 Dec 2017 11:41:06 GMT
Server: Apache/2.4.29 (Unix) PHP/5.6.30
Content-Type: text/html; charset=iso-8859-1
指定一个user_agent测试:
[root@ma-1 111.com]# curl -A "shuailinux" -x127.0.0.1:80 'http://111.com/123.php' -I
HTTP/1.1 200 OK
Date: Tue, 26 Dec 2017 11:42:18 GMT
Server: Apache/2.4.29 (Unix) PHP/5.6.30
X-Powered-By: PHP/5.6.30
Content-Type: text/html; charset=UTF-8
命令:curl 
选项: 
-A 指定user_agent。 
如:
[root@ma-1 111.com]# curl -A "shuailinux" -x127.0.0.1:80
-e 指定referer,指定引用地址 
如:
[root@ma-1 ~]# curl -e "http://111.com/123.txt" -x127.0.0.1:80 111.com/logo.png -I
-x 在给定的端口上使用HTTP代理 
如:
[root@ma-1 111.com]# curl -x127.0.0.1:80 'http://111.com/123.php'
-I 查看状态码 
如:
[root@ma-1 111.com]# curl -x127.0.0.1:80 'http://111.com/123.php' -I

PHP的相关配置

查看PHP配置文件的位置
[root@ma-1 111.com]# /usr/local/php/bin/php -i
或者用phpinfo函数去找(通过浏览器访问)(推荐)
[root@ma-1 111.com]# vim index.php

<?php
phpinfo();
?>
如果配置文件没有加载就去源码包配置文件里复制配置文件
[root@abc php-5.6.30]# cp /usr/local/src/php-5.6.30/php.ini-development /usr/local/php/etc/php.ini

重新加载配置文件
[root@abc php-5.6.30]# /usr/local/apache2.4/bin/apachectl graceful

这里配置文件有两个(一个是开发的,一个是生产环境的)
修改PHP配置文件:
vim /usr/local/php/etc/php.ini
危险函数:(还包含phpinfo,phpinfo会将你所有的信息都展现出来,就很危险)
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
对于危险函数,我们可以把它禁掉。 
禁掉函数: 
搜索 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
这时测试: 
将你的错误信息打印出来了。 
让他不打印错误信息:
display_errors =On(打印错误信息)
display_errors =Off(不打印错误信息)
定义时区
搜索 date.timezone 定义时区 (如果不定义有时候会有一些告警信息) 
可以定义到上海,或者重庆
date.timezone = Asia/Chongqing
配置错误日志
log_errors是定义错误日志是否开启,log_errors = On就是打开
错误日志记录 
error_log定义路径
error_log = /tmp/php_errors.log
定义错误级别: 
error_reporting(最好定义松一点,否则日志只会记录笔记严重错误)
error_reporting =E_ALL & ~E_NOTICE(生产环境中最好定义这个)
测试:
[root@ma-1 111.com]# curl -A "a" -x127.0.0.1:80 http://111.com/index.php
[root@ma-1 111.com]# ls -l /tmp/php_errors.log
-rw-r--r--. 1 daemon daemon 135 12月 26 21:49 /tmp/php_errors.log
查看错误日志:
[root@ma-1 111.com]# cat /tmp/php_errors.log
[26-Dec-2017 13:49:41 UTC] PHP Warning: phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2
写 /tmp/php_errors.log文件的是httpd.如果错误日志没有生成,检查一下定义错误日志所在的目录到底有没有写权限,而且写文件的人是Apache。 
为了保险,可以先把文件创建好,然后该文件权限为777
安全相关的open_bashdir
一个服务器上跑2个网站,假如一个网站被黑了,另外一个肯定不会幸免于难,如果有open_basedir ,另外一个网站就不一定会被黑 
open_basedir的作用是将网站限定在指定目录里,就算该站点被黑,黑客也只能在该目录下有所作为,不能左右其他目录。 
A网站和B网站分别在AB两个目录里,A网站被黑了,黑客没有权限进入B目录,如果只有一个网站,那就很有必要做安全选项,因为其他目录没有权限进入
open_basedir =/data/wwwroot/111.com:/tmp/ (目录建用:来连接)
要写上tmp,因为tmp是个临时文件存放点,如果连自己的临时文件都写不了,比如上传一个图片,会临时把图片放到tmp下。如果限制了,就不能上传图片了
如果在php.ini这配置文件做设定,网站就只能访问这个目录下的文件。你无论跑多少个网站的文件都要放在这个文件下,就跟没限制一样。 
这时在Apache虚拟配置文件中做限制才是好方法。要限制就对每个虚拟主机配置文件做各自的限制。
打开虚拟主机配置文件:
[root@ma-1 111.com]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf


<VirtualHost *:80>
DocumentRoot "/data/wwwroot/ abc.com "

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

ServerName abc.com
ServerAlias www.abc.com www.123.com
ErrorLog "logs/ abc.com-error_log "
CustomLog "logs/ abc.com-access_log " common
</VirtualHost>
参考博客: 

PHP动态扩展模块

当有业务需求要用到php在编译安装时没有安装的模块,可以使用动态扩展的方式来安装所需要的模块。
现在介绍一下redis的安装,redis是一个nosql,在LAMP架构下一般把它当做缓存来使用。
要安装redis模块就要先下载redis这个包
下载地址: 
改名为phpredis-develop.zip:
[root@ma-1 src]# mv develop phpredis-develop.zip
解压这个包:
[root@ma-1 src]# unzip phpredis-develop.zip
到phpredis-develo目录下进行编译安装:
[root@ma-1 src]# cd phpredis-develop
[root@ma-1 phpredis-develop]# ls
arrays.markdown ISSUE_TEMPLATE.md redis_array_impl.h
cluster_library.c liblzf redis.c
cluster_library.h library.c redis_cluster.c
cluster.markdown library.h redis_cluster.h
common.h mkdeb-apache2.sh redis_commands.c
config.m4 mkdeb.sh redis_commands.h
config.w32 package.xml redis_session.c
COPYING php_redis.h redis_session.h
crc16.h README.markdown rpm
CREDITS redis_array.c serialize.list
debian redis_array.h tests
debian.control redis_array_impl.c
编译安装是要有configure文件的,这个没有,就要先生成configure文件: 
生成configure文件:
[root@ma-1 phpredis-develop]# /usr/local/php/bin/phpize
Configuring for:
PHP Api Version: 20131106
Zend Module Api No: 20131226
Zend Extension Api No: 220131226
[root@ma-1 phpredis-develop]# ls
acinclude.m4 crc16.h README.markdown
aclocal.m4 CREDITS redis_array.c
arrays.markdown debian redis_array.h
autom4te.cache debian.control redis_array_impl.c
build install-sh redis_array_impl.h
cluster_library.c ISSUE_TEMPLATE.md redis.c
cluster_library.h liblzf redis_cluster.c
cluster.markdown library.c redis_cluster.h
common.h library.h redis_commands.c
config.guess ltmain.sh redis_commands.h
config.h.in Makefile.global redis_session.c
config.m4 missing redis_session.h
config.sub mkdeb-apache2.sh rpm
configure mkdeb.sh run-tests.php
configure.in mkinstalldirs serialize.list
config.w32 package.xml tests
COPYING php_redis.h
编译:
[root@ma-1 phpredis-develop]# ./configure --with-php-config=/usr/local/php/bin/php-config

[root@ma-1 phpredis-develop]# echo $?
0
make:
[root@ma-1 phpredis-develop]# make
[root@ma-1 phpredis-develop]# echo $?
0
make install:
[root@ma-1 phpredis-develop]# make install
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-zts-20131226/
[root@ma-1 phpredis-develop]# echo $?
0
查看有没有生成redis.so文件:
[root@ma-1 phpredis-develop]# ls /usr/local/php/lib/php/extensions/no-debug-zts-20131226/
opcache.so redis.so
这个时候PHP还是不支持的
[root@ma-1 phpredis-develop]# /usr/local/php/bin/php -m |grep redis
[root@ma-1 phpredis-develop]#
通过编辑配置文件在PHP中加载redis
先找扩展模块的目录路径:
[root@ma-1 phpredis-develop]# /usr/local/php/bin/php -i |grep -i extension_dir
extension_dir => /usr/local/php/lib/php/extensions/no-debug-zts-20131226 => /usr/local/php/lib/php/extensions/no-debug-zts-20131226
sqlite3.extension_dir => no value => no value
发现在/usr/local/php/lib/php/extensions/no-debug-zts-20131226
这个extension_dir是可以自定义路径的,不过一般不会去定义它,安装的扩展模块会默认放在个目录下
编辑php.ini:
[root@ma-1 phpredis-develop]# vim /usr/local/php/etc/php.ini
将redis.so文件加入进去
;extension=php_xmlrpc.dll
;extension=php_xsl.dll
extension=redis.so
保存退出
这时就加载了:
[root@ma-1 phpredis-develop]# /usr/local/php/bin/php -m |grep redis
redis
问题1: 
生成configure文件时出现:
[root@ma-1 phpredis-develop]# /usr/local/php/bin/phpize
Configuring for:
PHP Api Version: 20131106
Zend Module Api No: 20131226
Zend Extension Api No: 220131226
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.
少了autoconf这个包 
安装:
[root@ma-1 phpredis-develop]# yum install -y autoconf
安装完了之后再生成文件。
有些第三方扩展模块是要通过下载源码包来安装,有些模块是PHP源码包中自带的(在ext目录下)。
[root@ma-1 php-5.6.30]# cd ext/
[root@ma-1 ext]# ls
bcmath ftp mysqli pgsql standard
bz2 gd mysqlnd phar sybase_ct
calendar gettext oci8 posix sysvmsg
com_dotnet gmp odbc pspell sysvsem
ctype hash opcache readline sysvshm
curl iconv openssl recode tidy
date imap pcntl reflection tokenizer
dba interbase pcre session wddx
dom intl pdo shmop xml
enchant json pdo_dblib simplexml xmlreader
ereg ldap pdo_firebird skeleton xmlrpc
exif libxml pdo_mysql snmp xmlwriter
ext_skel mbstring pdo_oci soap xsl
ext_skel_win32.php mcrypt pdo_odbc sockets zip
fileinfo mssql pdo_pgsql spl zlib
filter mysql pdo_sqlite sqlite3
如果想安装里面的模块,直接进入模块目录下,执行phpize进行生成configure文件。
例如我现在要安装zip模块:
进入zip目录:
[root@ma-1 ext]# cd zip/
[root@ma-1 zip]# ls
config.m4 CREDITS lib php_zip.c tests zip_stream.c
config.w32 examples LICENSE_libzip php_zip.h TODO
生成configure文件:
[root@ma-1 zip]# /usr/local/php/bin/phpize
Configuring for:
PHP Api Version: 20131106
Zend Module Api No: 20131226
Zend Extension Api No: 220131226
编译安装:
[root@ma-1 zip]# ./configure --with-php-config=/usr/local/php/bin/php-config
[root@ma-1 zip]# echo $?
0
make:
[root@ma-1 zip]# make
[root@ma-1 zip]# echo $?
0
make install:
[root@ma-1 zip]# make install
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-zts-20131226/
查看有没有生成redis.so文件
[root@ma-1 zip]# ls /usr/local/php/lib/php/extensions/no-debug-zts-20131226/
opcache.so redis.so zip.so
这个时候PHP还是不支持的
[root@ma-1 zip]# /usr/local/php/bin/php -m |grep zip
[root@ma-1 zip]#
编辑php.ini:
[root@ma-1 phpredis-develop]# vim /usr/local/php/etc/php.ini
将zip.so文件加入进去
;extension=php_xsl.dll
extension=redis.so
extension=zip.so
保存退出
这时就加载了:
[root@ma-1 zip]# /usr/local/php/bin/php -m |grep zip
zip
扩展 
apache rewrite 出现死循环  http://ask.apelearn.com/question/1043  
php错误日志级别参考  http://ask.apelearn.com/question/6973  
php开启短标签  http://ask.apelearn.com/question/120  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值