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 相关文章推荐
Apache设置虚拟WEB
Oct 09 PHP
PHP 面向对象 final类与final方法
May 05 PHP
php xml 入门学习资料
Jan 01 PHP
数据库中排序的对比及使用条件详解
Feb 23 PHP
php多文件上传功能实现原理及代码
Apr 18 PHP
基于PHP读取TXT文件向数据库导入海量数据的方法
Apr 23 PHP
PHP中$_SERVER使用说明
Jul 05 PHP
PHP实现微信网页授权开发教程
Jan 19 PHP
详解PHP实现异步调用的4种方法
Mar 14 PHP
PHP+JQuery+Ajax实现分页方法详解
Aug 06 PHP
php生成无限栏目树
Mar 16 PHP
详解PHP中的外观模式facade pattern
Feb 05 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
二十行语句实现从Excel到mysql的转化
2006/10/09 PHP
PHP中的cookie
2006/11/26 PHP
PHP fopen 读取带中文URL地址的一点见解
2012/09/25 PHP
memcache命令启动参数中文解释
2014/01/13 PHP
Drupal7连接多个数据库及常见问题解决
2014/03/02 PHP
php+mysql数据库查询实例
2015/01/21 PHP
PHP接收json 并将接收数据插入数据库的实现代码
2015/12/01 PHP
PHP开发中AJAX技术的简单应用
2015/12/11 PHP
Linux基于php-fpm模式的lamp搭建phpmyadmin的方法
2018/10/25 PHP
php正则表达式使用方法整理集合
2020/01/31 PHP
YII2框架中添加自定义模块的方法实例分析
2020/03/18 PHP
(jQuery,mootools,dojo)使用适合自己的编程别名命名
2010/09/14 Javascript
jquery插件之信息弹出框showInfoDialog(成功/错误/警告/通知/背景遮罩)
2013/01/09 Javascript
JS取文本框中最小值的简单实例
2013/11/29 Javascript
javascript中的nextSibling使用陷(da)阱(keng)
2014/05/05 Javascript
jquery动态改变form属性提交表单
2014/06/03 Javascript
jQuery子窗体取得父窗体元素的方法
2015/05/11 Javascript
基于OL2实现百度地图ABCD marker的效果
2015/10/01 Javascript
Bootstrap下拉菜单效果实例代码分享
2016/06/30 Javascript
Vue.use源码分析
2017/04/22 Javascript
JS在if中的强制类型转换方式
2018/07/15 Javascript
vue router 源码概览案例分析
2018/10/09 Javascript
JavaScript常用工具函数库汇总
2020/09/17 Javascript
[13:40]TI3青蛙君全程回顾 DOTA2我们为梦想再战
2013/09/13 DOTA
用Python的SimPy库简化复杂的编程模型的介绍
2015/04/13 Python
Python实现列表转换成字典数据结构的方法
2016/03/11 Python
Python 3中的yield from语法详解
2017/01/18 Python
Python 中导入csv数据的三种方法
2018/11/01 Python
python 处理数字,把大于上限的数字置零实现方法
2019/01/28 Python
python实现二维数组的对角线遍历
2019/03/02 Python
python在新的图片窗口显示图片(图像)的方法
2019/07/11 Python
Python OpenCV去除字母后面的杂线操作
2020/07/05 Python
简历里的自我评价范文
2014/02/24 职场文书
供电工程专业求职信
2014/08/09 职场文书
Sql-Server数据库单表查询 4.3实验课
2021/04/05 SQL Server
python 批量压缩图片的脚本
2021/06/02 Python