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文本操作类
Nov 25 PHP
PHP 文件上传全攻略
Apr 28 PHP
php数据库备份还原类分享
Mar 20 PHP
yii的CURD操作实例详解
Dec 04 PHP
php+mysql实现用户注册登陆的方法
Jan 03 PHP
php递归删除指定文件夹的方法小结
Apr 20 PHP
thinkphp,onethink和thinkox中验证码不显示的解决方法分析
Jun 06 PHP
PHP给前端返回一个JSON对象的实例讲解
May 31 PHP
lnmp安装多版本PHP共存的方法详解
Aug 02 PHP
php获取用户真实IP和防刷机制的实例代码
Nov 28 PHP
Yii Framework框架使用PHPExcel组件的方法示例
Jul 24 PHP
php实现商城购物车的思路和源码分析
Jul 23 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
php执行sql语句的写法
2009/03/10 PHP
支持中文字母数字、自定义字体php验证码代码
2012/02/27 PHP
php解决约瑟夫环示例
2014/04/09 PHP
PHP封装CURL扩展类实例
2015/07/28 PHP
Yii中的cookie的发送和读取
2016/07/27 PHP
Linux服务器下PHPMailer发送邮件失败的问题解决
2017/03/04 PHP
PHP实现的超长文本分页显示功能示例
2018/06/04 PHP
Laravel框架文件上传功能实现方法示例
2019/04/16 PHP
laravel中数据显示方法(默认值和下拉option默认选中)
2019/10/11 PHP
通过javascript的匿名函数来分析几段简单有趣的代码
2010/06/29 Javascript
使用AngularJS实现可伸缩的页面切换的方法
2015/06/19 Javascript
JavaScript中的原型继承基础学习教程
2016/05/06 Javascript
浅析ES6的八进制与二进制整数字面量
2016/08/30 Javascript
微信小程序 在线支付功能的实现
2017/03/14 Javascript
详解nodejs微信公众号开发——1.接入微信公众号
2017/04/10 NodeJs
浅谈Koa服务限流方法实践
2017/10/23 Javascript
js中split()方法得到的数组长度问题
2018/07/19 Javascript
Vue组件创建和传值的方法
2018/08/17 Javascript
Vue 实现点击空白处隐藏某节点的三种方式(指令、普通、遮罩)
2019/10/23 Javascript
Python学习笔记(二)基础语法
2014/06/06 Python
Python类的定义、继承及类对象使用方法简明教程
2015/05/08 Python
Python遍历pandas数据方法总结
2018/02/09 Python
Python实现基于C/S架构的聊天室功能详解
2018/07/07 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
2018/12/19 Python
在Python中字典根据多项规则排序的方法
2019/01/21 Python
python函数调用,循环,列表复制实例
2020/05/03 Python
使用python实现下载我们想听的歌曲,速度超快
2020/07/09 Python
h5封装下拉刷新
2020/08/25 HTML / CSS
eHarmony英国:全球领先的认真恋爱约会平台之一
2020/11/16 全球购物
如何开启linux的ssh服务
2013/06/03 面试题
给排水工程师岗位职责
2013/11/21 职场文书
员工拓展培训方案
2014/02/15 职场文书
小学少先队工作总结2015
2015/05/26 职场文书
仙境之桥观后感
2015/06/16 职场文书
2016年优秀团员事迹材料
2016/02/25 职场文书
pandas:get_dummies()与pd.factorize()的用法及区别说明
2021/05/21 Python