php inc文件使用的风险和注意事项


Posted in PHP onNovember 12, 2013

数据库使用中需要关注的主要问题之一是访问权限即用户名及密码的暴露。在编程中为了方便,一般都会用一个db.inc文件保存,如:

<?php
 $db_user = 'myuser';
$db_pass = 'mypass';
$db_host = '127.0.0.1';
 $db = mysql_connect($db_host, $db_user, $db_pass);
 ?>

用户名及密码都是敏感数据,是需要特别注意的。他们被写在源码中造成了风险,但这是一个无法避免的问题。如果不这么做,你的数据库就无法设置用户名和密码进行保护了。
如果你读过http.conf(Apache的配置文件)的默认版本的话,你会发现默认的文件类型是text/plain(普通文本)。这样,如果db.inc这样的文件被保存在网站根目录下时,就引发了风险。所有位于网站根目录下的资源都有相应的URL,由于Apache没有定义对.inc后缀的文件的处理方式类型,在对这一类文件进行访问时,会以普通文本的类型进行返回(默认类型),这样访问权限就被暴露在客户的浏览器上了。
为了进一步说明这个风险,考虑一下一个以/www为网站根目录的服务器,如果db.inc被保存在/www/inc,它有了一个自已的URLhttp://example.org/inc/db.inc(假设example.org是主机域名)。通过访问该URL就可以看到db.inc以文本方式显示的源文件。无论你把该文件保存在/www哪个子目录下,都无法避免访问权限暴露的风险。
对这个问题最好的解决方案是把它保存在网站根目录以外的包含目录中。你无需为了达到包含它们的目的而把它们放至在文件系统中的特定位置,所有只要做的只是保证Web服务器对其有读取权限。因此,把它们放在网站根目录下是没有必要的风险,只要包含文件还位于网站根目录下,任何减少风险的努力都是徒劳的。事实上,你只要把必须要通过URL访问的资源放置在网站根目录下即可。毕竟这是一个公共的目录。
前面的话题对于SQLite数据库也有用。把数据库保存在当前目录下是非常方便的,因为你只要调用文件名而无需指定路径。但是,把数据库保存在网站根目录下就代表着不必要的风险。如果你没有采用安全措施防止直接访问的话,你的数据库就危险了。
如果由于外部因素导致无法做到把所有包含文件放在网站根目录之外,你可以在Apache配置成拒绝对.inc资源的请求。
<Files ~ "\.inc$">
  Order allow,deny
  Deny from all
</Files>

如果只是因为要举个例子而这么写的话,可以理解,毕竟大家学到了一些手段,但这个例子未免生硬了一点。实际上只要把该文件更名为db.inc.php就可以了。就好象房子破了个洞而不去修补,却在外面去造一个更大的房子把破房子套起来一样。
后面你还可以看到另外一种防止数据库访问权限暴露的方法,该方法对于共享服务器环境(在该环境下尽管文件位于网站根目录之外,但依然存在暴露的风险)非常有效。
PHP 相关文章推荐
PHP中的cookie
Nov 26 PHP
MYSQL环境变量设置方法
Jan 15 PHP
PHP文件打开、关闭、写入的判断与执行代码
May 24 PHP
PHP版 汉字转码的实现详解
Jun 09 PHP
php网站地图生成类示例
Jan 13 PHP
php提示Failed to write session data错误的解决方法
Dec 17 PHP
php 使用array函数实现分页
Feb 13 PHP
ThinkPHP自定义函数解决模板标签加减运算的方法
Jul 03 PHP
ThinkPHP安装和设置
Jul 27 PHP
php实现在线通讯录功能(附源码)
May 13 PHP
PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
Sep 09 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
Oct 14 PHP
php防止SQL注入详解及防范
Nov 12 #PHP
php session劫持和防范的方法
Nov 12 #PHP
php后门URL的防范
Nov 12 #PHP
php打开远程文件的方法和风险及解决方法
Nov 12 #PHP
php使用exec shell命令注入的方法讲解
Nov 12 #PHP
PHP使用PHPMailer发送邮件的简单使用方法
Nov 12 #PHP
PHP迭代器的内部执行过程详解
Nov 12 #PHP
You might like
使用 php4 加速 web 传输
2006/10/09 PHP
php封装的连接Mysql类及用法分析
2015/12/10 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
2020/02/27 PHP
jquery ready函数源代码研究
2009/12/06 Javascript
js获取select默认选中的Option并不是当前选中值
2014/05/07 Javascript
JavaScript中使用arguments获得函数传参个数实例
2014/08/27 Javascript
跟我学习javascript的全局变量
2015/11/16 Javascript
jQuery.form插件的使用及跨域异步上传文件
2016/04/27 Javascript
在DWR中实现直接获取一个JAVA类的返回值的两种方法
2016/12/25 Javascript
浅谈angular2 组件的生命周期钩子
2017/08/12 Javascript
AngularJS中控制器函数的定义与使用方法示例
2017/10/10 Javascript
js监听html页面的上下滚动事件方法
2018/09/11 Javascript
JS Thunk 函数的含义和用法实例总结
2020/04/08 Javascript
vue 手机物理监听键+退出提示代码
2020/09/09 Javascript
探索node之事件循环的实现
2020/10/30 Javascript
全面解析Vue中的$nextTick
2020/12/24 Vue.js
[02:38]DOTA2 夜魇暗潮2020活动介绍官方视频
2020/11/04 DOTA
在Python的while循环中使用else以及循环嵌套的用法
2015/10/14 Python
详解设计模式中的工厂方法模式在Python程序中的运用
2016/03/02 Python
python实现单线程多任务非阻塞TCP服务端
2017/06/13 Python
Python3中详解fabfile的编写
2018/06/24 Python
对Python2与Python3中__bool__方法的差异详解
2018/11/01 Python
python实现微信小程序用户登录、模板推送
2019/08/28 Python
Python在OpenCV里实现极坐标变换功能
2019/09/02 Python
pytorch实现seq2seq时对loss进行mask的方式
2020/02/18 Python
python中np是做什么的
2020/07/21 Python
日本即尚网:JSHOPPERS.com(支持中文)
2019/12/03 全球购物
潘多拉珠宝俄罗斯官方网上商店:PANDORA俄罗斯
2020/09/22 全球购物
EJB3.1都有哪些改进
2012/11/17 面试题
写演讲稿要注意的六件事
2014/01/14 职场文书
大堂副理的岗位职责范文
2014/02/17 职场文书
《要下雨了》教学反思
2014/02/17 职场文书
十八大标语口号
2014/10/09 职场文书
市场部经理岗位职责
2015/02/02 职场文书
民间借贷被告代理词
2015/05/23 职场文书
springboot为异步任务规划自定义线程池的实现
2022/06/14 Java/Android