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 相关文章推荐
用cookies来跟踪识别用户
Oct 09 PHP
实用函数4
Nov 08 PHP
PHP备份/还原MySQL数据库的代码
Jan 06 PHP
开源php中文分词系统SCWS安装和使用实例
Apr 11 PHP
PHP微框架Dispatch简介
Jun 12 PHP
php对数组内元素进行随机调换的方法
May 12 PHP
Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
Mar 21 PHP
PHP实现动态执行代码的方法
Mar 25 PHP
php parse_str() 函数的定义和用法
May 23 PHP
Centos 6.5下PHP 5.3安装ffmpeg扩展的步骤详解
Mar 02 PHP
微信公众号实现扫码获取微信用户信息(网页授权)
Apr 09 PHP
laravel 框架实现无限级分类的方法示例
Oct 31 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脚本的10个技巧(3)
2006/10/09 PHP
php 远程图片保存到本地的函数类
2008/12/08 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
JavaScript中的一些定位属性[图解]
2010/07/14 Javascript
JavaScript中把数字转换为字符串的程序代码
2013/06/19 Javascript
Javascript实现禁止输入中文或英文的例子
2014/12/09 Javascript
javascript版2048小游戏
2015/03/18 Javascript
基于jquery实现一个滚动的分步注册向导-附源码
2015/08/26 Javascript
新入门node.js必须要知道的概念(必看篇)
2016/08/10 Javascript
js实现table添加行tr、删除行tr、清空行tr的简单实例
2016/10/15 Javascript
js 打开新页面在屏幕中间的实现方法
2016/11/02 Javascript
Node.js的特点详解
2017/02/03 Javascript
Node.js与Sails redis组件的使用教程
2017/02/14 Javascript
JS实现本地存储信息的方法(基于localStorage与userData)
2017/02/18 Javascript
weebox弹出窗口不居中显示的解决方法
2017/11/27 Javascript
vue组件中使用props传递数据的实例详解
2018/04/08 Javascript
node.js自动上传ftp的脚本分享
2018/06/16 Javascript
解决使用bootstrap的dropdown部件时报错:error:Bootstrap dropdown require Popper.js问题
2018/08/30 Javascript
vue 实现v-for循环回来的数据动态绑定id
2019/11/07 Javascript
Vue两个版本的区别和使用方法(更深层次了解)
2020/02/16 Javascript
jQuery实现鼠标拖拽登录框移动效果
2020/09/13 jQuery
[46:10]2014 DOTA2国际邀请赛中国区预选赛 CnB VS HGT
2014/05/21 DOTA
[01:28:43]2014 DOTA2华西杯精英邀请赛5 24 DK VS CIS
2014/05/25 DOTA
python支持断点续传的多线程下载示例
2014/01/16 Python
Python计算三维矢量幅度的方法
2015/06/15 Python
基于python的Tkinter实现一个简易计算器
2015/12/31 Python
python3实现ftp服务功能(客户端)
2017/03/24 Python
对Python正则匹配IP、Url、Mail的方法详解
2018/12/25 Python
调试Django时打印SQL语句的日志代码实例
2019/09/12 Python
python面向对象之类属性和类方法案例分析
2019/12/30 Python
Django的CVB实例详解
2020/02/10 Python
医院总经理岗位职责
2014/02/04 职场文书
乔布斯斯坦福大学演讲稿
2014/05/23 职场文书
7个你应该知道的JS原生错误类型
2021/04/29 Javascript
mysql中varchar类型的日期进行比较、排序等操作的实现
2021/11/17 MySQL
介绍一下28个JS常用数组方法
2022/05/06 Javascript