一、配置防盗链
二、访问控制Directory
三、访问控制FilesMatch
四、限定某个目录禁止解析php
五、限制user_agent
六、php相关配置
七、php扩展模块装安
八、扩展
一、配置防盗链
盗链,全称是盗取链接,假如我们的网站有很多好看的图片,别人可以查看我们网站图片的链接,然后应用在他的网站上,这样的话,去访问他的网站,实际上消耗的是我们的流量(因为实际链接在我们这里),这样我们就不得不去配置防盗链,使得别人不能复制我们图片的链接。
例如:
防盗链的作用是,我们网站的图片,只能通过我们自己的网站去访问,其他网站借用不行。
意思是我们的网站,被用户上传了很多图片,而用户又在他自己的网站上加上了我们网站图片的链接,就直接能访问了。
这样可以节省他网站的带宽。
A:如果网站不允许用户上传图片,那么就不需要配置防盗链了
1.在虚拟主机配置文件/usr/local/apache2/conf/extra/httpd-vhosts.conf中添加配置
<Directory /data/wwwroot/111.com>
SetEnvIfNoCase Referer "http://111.com" local_ref //设置referer白名单
SetEnvIfNoCase Referer "http://aaa.com" local_ref
#SetEnvIfNoCase Referer "^$" local_ref //空referer
<filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif)"> //这些访问不设置白名单,做防盗链
Order Allow,Deny //定义防盗链控制顺序
Allow from env=local_ref
</filesmatch>
</Directory>
2. 测试配置文件及重载
3. 浏览器验证
3.1 空referer上面我们注释掉了,所以打开是403,错误
3.2 取消配置文件中空referer的注释,空referer设为白名单,可以访问
3.3 我们把图片链接添加到博客上,通过博客访问(结果:不能访问)
3.4 把博客的访问referer添加到白名单,可以访问
4. 命令行里验证
//curl -e参数 模拟refer 为http://www.baidu.com,refer必须以http://开头
二、访问控制Directory
有时候为了安全需要,要对网站的某些目录限制访问的来源IP。可以通过对目录的控制来实现。
1.修改虚拟主机配置文件/usr/local/apache2/conf/extra/httpd-vhosts.conf
[root@Linux01 ~]# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
//增加如下内容
<Directory /data/wwwroot/111.com/admin/> //admin 后台
Order deny,allow //Order确定执行顺序,整个语句都会执行一遍,与iptables的执行过程不同 //如果先deny,后allow,则会先执行deny的操作,再执行允许的动作。后面的动作会覆盖前面的操作 //如果先allow,后deny all,则最后的结果会是deny
Deny from all
Allow from 127.0.0.1 //只允许127.0.0.1通过
</Directory>
2. 创建后台admin目录,并在目录下创建1.php文件
3. 测试配置文件及重载
4. 验证
4.1 命令行验证
4.2 浏览器访问
因为111.com解析地址为192.168.239.135,是不被允许通过的IP,所以也是访问不了的
三、访问控制FilesMatch
访问控制除了可以对整个目录进行控制,还可以针对具体的页面进行控制。
如限制111.com下的admin.php后带任意字符的页面。
1.修改虚拟主机配置文件/usr/local/apache2/conf/extra/httpd-vhosts.conf
[root@Linux01 ~]# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
//添加filesmatch段的内容
//filesmath不区分大小写,(.*)是正则,表示任意字符
2. 测试配置文件及重载
3. 验证
3.1 浏览器验证
3.2 命令行验证
四、限定某个目录禁止解析php
有些目录是存放静态文件的目录,如图片目录,本身不需要允许php的解析。如果没有注意,允许了php解析,而且又开放了该目录的文件上传权限。很可能被别有用心的人利用上传木马,导致服务器被攻破。除了开发人员在程序开发过程中要注意安全的设计,也可以通过apache限制某些目录的php解析。
1.修改虚拟主机配置文件/usr/local/apache2/conf/extra/httpd-vhosts.conf
[root@Linux01 ~]# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
//添加
<Directory /data/wwwroot/111.com/upload> //添加此段内容限制upload目录的php解析权限
php_admin_flag engine off
<FilesMatch (.*)\.php(.*)> //这部分是禁止访问PHP源代码。如果只是禁止解析,可不加
Order allow,deny
Deny from all
</FilesMatch>
</Directory>
2. 测试配置文件及重载
3. 创建upload目录,并在目录下写入一个php文件(复制也行)
4.验证
4.1 浏览器验证
4.2 命令行验证
4.3 注释掉限制PHP源代码部分.
结果:
浏览器访问情况下,也仅仅是限制php解析,不过会把php源代码下载下来:
5.总结,最好禁止访问PHP源代码。
五、限制user_agent
有时候网站可能会遭受CC攻击,这可以通过限制user_agent来减小攻击压力。
CC攻击(Distributed HTTP flood,分布式HTTP洪水攻击)
CC攻击是DDoS攻击的一种类型,使用代理服务器向受害服务器发送大量貌似合法的请求(通常使用HTTP GET)。CC(Challenge Collapsar,挑战黑洞)根据其工具命名,攻击者创造性地使用代理机制,利用众多广泛可用的免费代理服务器发动DDoS攻击。许多免费代理服务器支持匿名模式,这使追踪变得非常困难。
1.修改虚拟主机配置文件/usr/local/apache2/conf/extra/httpd-vhosts.conf
[root@Linux01 ~]# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
//增加以下配置,限制curl,baidu.com代理的访问
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC]
RewriteRule .* - [F]
</IfModule>
2. 测试配置文件及重载
3. 验证
//以curl代理访问,403错误被禁止,说明限制成功
//baidu.com的代理也被限制,403禁止访问
//以不受限代理访问,可以正常访问;
-A 自定义指定user_agent;
-e 指定referer
六、php相关配置
1.查看php配置文件:
[root@Linux01 111.com]# /usr/local/php/bin/php -i | grep -i "loaded configuration file"
通过-i选项查出来的配置文件有时候可能不准。最准确的是在网站根目录下建立一个phpinfo()函数的页面来查看。
以111.com为例:
1.1 //新建该页面
1.2 从浏览器访问
可以看到正确的php配置文件所在路径。
2. 设置时区参数(date.timezone)
进入配置文件:
[root@Linux01 111.com]# vim /usr/local/php/etc/php.ini
//时区需要定义,修改时区为亚洲/上海
3. 禁用特殊函数
进入配置文件:
[root@Linux01 111.com]# vim /usr/local/php/etc/php.ini
//将不常用特殊函数添加到此处进行限制,可以被一些木马利用。生产场景phpinfo()函数也会被禁用,避免泄露信息
禁用后不能访问,用浏览器访问会显示错误信息(但是会把页面路径显示出来,不安全):
4. 显示错误信息
进入配置文件:
[root@Linux01 111.com]# vim /usr/local/php/etc/php.ini
//修改为on会显示错误信息,改为Off,浏览器上会显示白页,命令行下显示200状态码,但是没有任何输出:
5.生产环境中不应显示错误信息在页面上。但是如果仅显示白页,就无法追踪错误。所以可以配置错误日志来记录相应的错误。
进入配置文件:
[root@Linux01 111.com]# vim /usr/local/php/etc/php.ini
//开启错误日志记录功能
//设置错误日志保存的位置
//定义日志级别,可以定义日志信息的内容。级别高,只会记录级别高的事件,如果级别低,记录的事件就会比较多。 //默认会记录所有的错误,但是不会记录通知和一般性的警告。
..
再访问111.com/index.php
/tmp下已经生成php_errors.log
查看错误错误日志,错误日志文件中已生成日志记录:
[root@Linux01 php-5.6.32]# cat /tmp/php_errors.log
6.open_basedir隔离虚拟主机目录。 它的作用就是把php限定在指定的目录下面,不让它去别的目录读写文件
6.1 可以php.ini进行全局配置。但是无法细化。所以不推荐。
6.1.1 [root@Linux01 php-5.6.32]# vim /usr/local/php/etc/php.ini
6.1.2 重载
6.1.3 测试(错误代码500)
6.1.4 查看错误日志信息
[root@Linux01 php-5.6.32]# cat /tmp/php_errors.log
//访问页面并不在允许的目录下
6.1.5 把目录更改过来
6.1.6 重载、测试
6.2 也可以在虚拟主机配置文件/usr/local/apache2/conf/extra/httpd-vhosts.conf针对每个虚拟主机来设置隔离。推荐此种方式。
注:在虚拟主机里配置 open_basedir ,如果这个虚拟主机站点目录被攻入,那么这个站点下的其他文件或目录同样有被破坏的风险。如果有多个站点,由于open_basedir 的目录不同,那么其他站点还是安全的。
6.2.1 [root@Linux01 php-5.6.32]# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
6.2.2 重载、测试
七、php扩展模块安装
有时候php安装编译完成后,这时候发现缺少了一个模块,但又不想重新编译php模块,可以使用扩展模块编译。
1.查看模块
[root@Linux01 111.com]# /usr/local/php/bin/php -m
以redis包为例
1.下载redis软件包
2.解压软件包
3.切换到phpredis-develop目录.
[root@Linux01 src]# cd phpredis-develop/
4.编译
//生成配置文件,比较特殊,默认的包没有.configure文件,需要用phpize生成
[root@Linux01 phpredis-develop]# ./configure --with-php-config=/usr/local/php/bin/php-config
//编译安装
[root@Linux01 phpredis-develop]# make && make install
//编译完成后,根据提示,可以看到共享的扩展已经安装到了 /usr/local/php/lib/php/extensions/no-debug-zts-20131226/目录
5.配置加载扩展模块
5.1 [root@Linux01 phpredis-develop]# ls /usr/local/php/lib/php/extensions/no-debug-zts-20131226/
查看这个目录,我们需要的redis模块已经有了,但是是.so文件,拓展模块不支持
5.2 usr/local/php/bin/php -i |grep extension_dir //查看扩展模块存放目录,我 们可以在php.ini中去自定义该路径
5.3 //编译php.ini
[root@Linux01 phpredis-develop]# vim /usr/local/php/etc/php.ini
//在文件最后添加(或者找到类似的配置,加在后面) extension = redis.so
5.4 重载、验证
[root@Linux01 phpredis-develop]# /usr/local/php/bin/php -m | grep redis //拓展模块安装成功
八、扩展
扩展
几种限制ip的方法 http://ask.apelearn.com/question/6519
apache 自定义header http://ask.apelearn.com/question/830
apache的keepalive和keepalivetimeout http://ask.apelearn.com/question/556
apache开启压缩 http://ask.apelearn.com/question/5528
apache2.2到2.4配置文件变更 http://ask.apelearn.com/question/7292
apache options参数 http://www.365mini.com/page/apache-options-directive.htm
apache禁止trace或track防止xss http://ask.apelearn.com/question/1045
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
php开启短标签 http://ask.apelearn.com/question/120
php.ini详解 http://legolas.blog.51cto.com/2682485/493917