PHP安全编程:共享主机的源码安全

主机上的源码暴露问题
服务器君一共花费了276.708 ms进行了5次数据库查询,努力地为您提供了这个页面。
试试阅读模式?希望听取您的建议

你的WEB服务器必须要能够读取你的源确并执行它,这就意味着任意人所写的代码被服务器运行时,它同样可以读取你的源码。在一个共享主机上,最大的风险是由于WEB服务器是共享的,因此其它开发者所写的PHP代码可以读取任意文件。

<?php

header('Content-Type: text/plain');
readfile($_GET['file']);

?>

通过在你的源码所在的主机上运行上面脚本,攻击者可以通过把file的值指定为完整的路径和文件名来使WEB服务器读取并显示任何文件。例如,假定该脚本命名为file.php,位于主机example.org上,只要通过访问下面链接即可使文件/path/to/source.php的内容暴露:

http://example.org/file.php?file=/path/to/source.php

当然,要使这段简单的代码起作用,攻击者必须确切地知道你的源码的位置,但是攻击者可以写出更复杂的脚本,通过它可以方便在浏览整个文件系统。关于此类脚本,请看后面部分的示例。

对该问题没有完美的解决方案。正如前面所述,你必须考虑所有你的源码都是公开的,甚至是保存在WEB主目录之外的代码也是如此。

最好的办法是把所有敏感数据保存在数据库中。虽然这使一些代码的编写多了一层复杂性,但这是防止你的敏感数据暴露的最好方法。很不幸的是,还有一个问题。如何保存你的数据库访问密码?

请看保存在网站主目录之外一个名为db.inc的文件:

<?php

$db_user = 'myuser';
$db_pass = 'mypass';
$db_host = 'localhost';

$db = mysql_connect($db_host, $db_user, $db_pass);

?>

如果该文件的路径是已知的(或被猜中),就存在着你的服务器上的另外一个用户访问该文件的可能,就会获取数据库访问权限,这样你保存在数据库中的所有数据就会暴露。

解决该问题的最好方案是把你的数据库访问权限以下面的格式保存在一个只有系统管理员权限才能读取的文件中:

SetEnv DB_USER "myuser"
SetEnv DB_PASS "mypass"

SetEnv是一个Apache的指令,上面文件的意思是建立两个分别代表你的数据库用户名及密码的Apache环境变量。当然,该技巧的关键是只有系统管理员才能读取该文件。如果你无法登录成为系统管理员,你就可以限制该文件只能由你自已进行读取,这样的保护方式与上面的方式类似。

$ chmod 600 db.conf
$ ls db.conf
-rw-------  1 chris chris 48 May 21 12:34 db.conf

这就有效地防止了恶意脚本访问你的数据中权限,因此对于数据库中保存的敏感数据来说,不会有危及安全的重大风险。

为使该文件生效,你就需要能够通过PHP访问其中的数据。要达到这个目的,需要在httpd.conf中写上如下的包含句:

include "/path/to/db.conf"

需要注意该语句需要插入在VirtualHost区域内,否则其它用户就能取得相应的内容。

由于Apache的父进程以系统管理员身份运行(需要绑定在80端口),它能够读取该配置文件,但处理服务器请求的子进程(运行PHP脚本)不能读取该文件。

你可以通过$_SERVER超级全局数组去访问这两个变量,这样在db.inc中,只要通过引用$_SERVER变量即可,而不是在其中写明数据库的权限:

<?php

$db_user = $_SERVER['DB_USER'];
$db_pass = $_SERVER['DB_PASS'];
$db_host = 'localhost';

$db = mysql_connect($db_host, $db_user, $db_pass);

?>

如果该文件被暴露,数据库访问权也不会泄露。这对于共享主机是一大安全性改进,同时对于独立主机也是一种深度防范手段。

注意在使用上述技巧时,数据库访问权限就位于$_SERVER超级公用数组中。这就需要同时限制普通访问者运行phpinfo()察看或其它任何导致$_SERVER内容暴露的原因。

当然,你可以使用本技巧保护任何信息(不只是数据库访问权限),但我发现把大多数数据保存在数据库更为方便,特别是由于该技巧需要得到你的主机提供商的协助。

延伸阅读

此文章所在专题列表如下:

  1. PHP安全编程:register_globals的安全性
  2. PHP安全编程:不要让不相关的人看到报错信息
  3. PHP安全编程:网站安全设计的一些原则
  4. PHP安全编程:可用性与数据跟踪
  5. PHP安全编程:过滤用户输入
  6. PHP安全编程:对输出要进行转义
  7. PHP安全编程:表单与数据安全
  8. PHP安全编程:从URL的语义进行攻击
  9. PHP安全编程:文件上传攻击的防御
  10. PHP安全编程:跨站脚本攻击的防御
  11. PHP安全编程:跨站请求伪造CSRF的防御
  12. PHP安全编程:关于表单欺骗提交
  13. PHP安全编程:HTTP请求欺骗
  14. PHP安全编程:不要暴露数据库访问权限
  15. PHP安全编程:防止SQL注入
  16. PHP安全编程:cookie暴露导致session被劫持
  17. PHP安全编程:session固定获取合法会话
  18. PHP安全编程:session劫持的防御
  19. PHP安全编程:防止源代码的暴露
  20. PHP安全编程:留心后门URL
  21. PHP安全编程:阻止文件名被操纵
  22. PHP安全编程:文件包含的代码注入攻击
  23. PHP安全编程:文件目录猜测漏洞
  24. PHP安全编程:打开远程文件的风险
  25. PHP安全编程:shell命令注入
  26. PHP安全编程:暴力破解攻击
  27. PHP安全编程:密码嗅探与重播攻击
  28. PHP安全编程:记住登录状态的安全做法
  29. PHP安全编程:共享主机的源码安全
  30. PHP安全编程:更优的会话数据安全
  31. PHP安全编程:会话数据注入
  32. PHP安全编程:主机文件目录浏览
  33. PHP安全编程:PHP的安全模式

本文地址:http://www.nowamagic.net/librarys/veda/detail/2077,欢迎访问原出处。

不打个分吗? 还木有人打分噢!

转载随意,但请带上本文地址:

http://www.nowamagic.net/librarys/veda/detail/2077

如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 加入收藏

大家都在看

阅读一百本计算机著作吧,少年

很多人觉得自己技术进步很慢,学习效率低,我觉得一个重要原因是看的书少了。多少是多呢?起码得看3、4、5、6米吧。给个具体的数量,那就100本书吧。很多人知识结构不好而且不系统,因为在特定领域有一个足够量的知识量+足够良好的知识结构,系统化以后就足以应对大量未曾遇到过的问题。

奉劝自学者:构建特定领域的知识结构体系的路径中再也没有比学习该专业的专业课程更好的了。如果我的知识结构体系足以囊括面试官的大部分甚至吞并他的知识结构体系的话,读到他言语中的一个词我们就已经知道他要表达什么,我们可以让他坐“上位”毕竟他是面试官,但是在知识结构体系以及心理上我们就居高临下。

所以,阅读一百本计算机著作吧,少年!

《高性能JavaScript》 Nicholas C. Zakas (作者), 赵泽欣 (合著者), 丁琛 (译者)

《高性能JavaScript》揭示的技术和策略能帮助你在开发过程中消除性能瓶颈。你将会了解如何提升各方面的性能,包括代码的加载、运行、DOM 交互、页面生存周期等。雅虎的前端工程师 Nicholas C. Zakas 和其他五位 JavaScript 专家介绍了页面代码加载的最佳方法和编程技巧,来帮助你编写更为高效和快速的代码。你还会了解到构建和部署文件到生产环境的最佳实践,以及有助于定位线上问题的工具。如果你使用 JavaScript 构建交互丰富的 Web 应用,那么 JavaScript 代码可能是造成你的Web应用速度变慢的主要原因。

更多计算机宝库...