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&amp;&amp;mysql)二
Oct 09 PHP
PHP中的cookie
Nov 26 PHP
PHP 实现explort() 功能的详解
Jun 20 PHP
PHP引用(&amp;)各种使用方法实例详解
Mar 20 PHP
php上传图片客户端和服务器端实现方法
Mar 30 PHP
[原创]ThinkPHP让../Public在模板不解析(直接输出)的方法
Oct 09 PHP
php数据访问之增删改查操作
May 09 PHP
php格式化json函数示例代码
May 12 PHP
PHP简单获取多个checkbox值的方法
Jun 13 PHP
浅谈PHP表单提交(POST&amp;GET&amp;URL编/解码)
Apr 03 PHP
laravel 操作数据库常用函数的返回值方法
Oct 11 PHP
浅谈如何提高PHP代码的质量
May 28 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 和 XML: 使用expat函数(三)
2006/10/09 PHP
php防注
2007/01/15 PHP
PHP学习之整理字符串
2011/04/17 PHP
支持中文的php加密解密类代码
2011/11/27 PHP
phpize的深入理解
2013/06/03 PHP
php strnatcmp()函数的用法总结
2013/11/27 PHP
Symfony2创建页面实例详解
2016/03/18 PHP
js中匿名函数的N种写法
2010/09/08 Javascript
Jquery中删除元素的实现代码
2011/12/29 Javascript
jquery中对于批量deferred的处理方法
2014/01/22 Javascript
js打造数组转json函数
2015/01/14 Javascript
jquery中map函数遍历数组用法实例
2015/05/18 Javascript
JavaScript+CSS实现仿天猫侧边网页菜单效果
2015/08/25 Javascript
JavaScript 实现的 zip 压缩和解压缩工具包Zip.js使用详解
2015/12/14 Javascript
JavaScript判断对象是否为数组
2015/12/22 Javascript
javascript下使用Promise封装FileReader
2016/02/19 Javascript
input输入密码变黑点密文的实现方法
2017/01/09 Javascript
jQuery实现验证码功能
2017/03/17 Javascript
JavaScript常见事件处理程序实例总结
2019/01/05 Javascript
Vue脚手架编写试卷页面功能
2020/03/17 Javascript
python统计一个文本中重复行数的方法
2014/11/19 Python
python中星号变量的几种特殊用法
2016/09/07 Python
PYTHON 中使用 GLOBAL引发的一系列问题
2016/10/12 Python
彻底理解Python list切片原理
2017/10/27 Python
Python在groupby分组后提取指定位置记录方法
2018/04/20 Python
Python 实现在文件中的每一行添加一个逗号
2018/04/29 Python
Python基于Tkinter模块实现的弹球小游戏
2018/12/27 Python
Python常用GUI框架原理解析汇总
2020/12/07 Python
使用html5 canvas创建太空游戏的示例
2014/05/08 HTML / CSS
委托书怎么写
2014/07/31 职场文书
党的群众路线教育实践活动个人整改方案
2014/09/21 职场文书
支行行长岗位职责
2015/02/15 职场文书
Nginx反向代理配置的全过程记录
2021/06/22 Servers
详解Java ES多节点任务的高效分发与收集实现
2021/06/30 Java/Android
为了顺利买到演唱会的票用Python制作了自动抢票的脚本
2021/10/16 Python
ubuntu如何搭建vsftpd服务器
2022/12/24 Servers