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 多个submit提交表单 处理方法
Jul 07 PHP
Discuz 6.0+ 批量注册用户名
Sep 13 PHP
php array_search() 函数使用
Apr 13 PHP
用sql命令修改数据表中的一个字段为非空(not null)的语句
Jun 04 PHP
php使用异或实现的加密解密实例
Sep 04 PHP
Php无限级栏目分类读取的实现代码
Feb 19 PHP
thinkphp的URL路由规则与配置实例
Nov 26 PHP
php进行支付宝开发中return_url和notify_url的区别分析
Dec 22 PHP
PHP学习笔记(三):数据类型转换与常量介绍
Apr 17 PHP
php实现简单的上传进度条
Nov 17 PHP
php有效防止图片盗用、盗链的两种方法
Nov 01 PHP
php获取网站根目录物理路径的几种方法(推荐)
Mar 04 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
全国FM电台频率大全 - 28 甘肃省
2020/03/11 无线电
PHP更新购物车数量(表单部分/PHP处理部分)
2013/05/03 PHP
php检测useragent版本示例
2014/03/24 PHP
PHP预定义超全局数组变量小结
2018/08/20 PHP
基于Laravel 多个中间件的执行顺序详解
2019/10/21 PHP
Yii实现微信公众号场景二维码的方法实例
2020/08/30 PHP
Firefox getBoxObjectFor getBoundingClientRect联系
2008/10/26 Javascript
js 实现无缝滚动 兼容IE和FF
2009/07/15 Javascript
JavaScript日历实现代码
2010/09/12 Javascript
jQuery随便控制任意div隐藏的方法
2013/06/28 Javascript
div+css+js实现无缝滚动类似marquee无缝滚动兼容firefox
2013/08/29 Javascript
js文本框输入点回车触发确定兼容IE、FF等
2013/11/19 Javascript
jQuery简单实现提交数据出现loading进度条的方法
2016/03/29 Javascript
jQuery选择器基础入门教程
2016/05/10 Javascript
AngularJS教程 ng-style 指令简单示例
2016/08/03 Javascript
深入浅析JavaScript中的3DES
2016/08/24 Javascript
微信浏览器禁止页面下拉查看网址实例详解
2017/06/28 Javascript
Vue将页面导出为图片或者PDF
2020/08/17 Javascript
js实现GIF图片的分解和合成
2019/10/24 Javascript
python如何修改装饰器中参数
2018/03/20 Python
PyQt5每天必学之滑块控件QSlider
2018/04/20 Python
使用pycharm生成代码模板的实例
2018/05/23 Python
Python通过paramiko远程下载Linux服务器上的文件实例
2018/12/27 Python
Pytorch实现LSTM和GRU示例
2020/01/14 Python
浅谈Python中的字符串
2020/06/10 Python
Python可视化工具如何实现动态图表
2020/10/23 Python
css3打造一款漂亮的卡哇伊按钮
2013/03/20 HTML / CSS
Tomcat中怎么使用log4j输出所有的log
2016/07/07 面试题
厨房管理计划书
2014/04/27 职场文书
幼儿园见习报告
2014/10/30 职场文书
2015年度对口支援工作总结
2015/07/22 职场文书
交通安全教育心得体会
2016/01/15 职场文书
怎样写工作总结啊!
2019/06/18 职场文书
各类场合主持词开场白范文集锦
2019/08/16 职场文书
JMeter对MySQL数据库进行压力测试的实现步骤
2022/01/22 MySQL
win10系统计算机图标怎么调出来?win10调出计算机图标的方法
2022/08/14 数码科技