php源码暴露,PHP安全-源码暴露(⼆)
源码暴露
你的WEB服务器必须要能够读取你的源确并执⾏它,这就意味着任意⼈所写的代码被服务器运⾏时,它同样可以读取你的源码。在⼀个共享主机上,最⼤的风险是由于WEB服务器是共享的,因此其它开发者所写的PHP代码可以读取任意⽂件。
header('Content-Type: text/plain');
readfile($_GET['file']);
>
通过在你的源码所在的主机上运⾏上⾯脚本,攻击者可以通过把file的值指定为完整的路径和⽂件名来使WEB服务器读取并显⽰任何⽂件。例如,假定该脚本命名为file.php,位于主机上,只要通过访问下⾯链接即可使⽂件/path/to/source.php的内容暴露:
当然,要使这段简单的代码起作⽤,攻击者必须确切地知道你的源码的位置,但是攻击者可以写出更复杂的脚本,通过它可以⽅便在浏览整个⽂件系统。关于此类脚本,请看本章后⾯部分的⽰例。
对该问题没有完美的解决⽅案。正如第五章所述,你必须考虑所有你的源码都是公开的,甚⾄是保存在WEB主⽬录之外的代码也是如此。
最好的办法是把所有敏感数据保存在数据库中。虽然这使⼀些代码的编写多了⼀层复杂性,但这是防⽌你的敏感数据暴露的最好⽅法。很不幸的是,还有⼀个问题。如何保存你的数据库访问密码?
请看保存在⽹站主⽬录之外⼀个名为db.inc的⽂件:
$db_user = 'myuser';
$db_pass = 'mypass';
$db_host = 'localhost';
$db = mysql_connect($db_host, $db_user,
$db_pass);
>
如果该⽂件的路径是已知的(或被猜中),就存在着你的服务器上的另外⼀个⽤户访问该⽂件的可能,就
会获取数据库访问权限,这样你保存在数据库中的所有数据就会暴露。
解决该问题的最好⽅案是把你的数据库访问权限以下⾯的格式保存在⼀个只有系统管理员权限才能读取的⽂件中:
表格网站php源码SetEnv DB_USER "myuser"
SetEnv DB_PASS "mypass"
SetEnv是⼀个Apache的指令,上⾯⽂件的意思是建⽴两个分别代表你的数据库⽤户名及密码的Apache环境变量。当然,该技巧的关键是只有系统管理员才能读取该⽂件。如果你⽆法登录成为系统管理员,你就可以限制该⽂件只能由你⾃已进⾏读取,这样的保护⽅式与上⾯的⽅式类似。
$ chmod f
$ f
-rw------- 1 chris chris 48 May 21 12:34
这就有效地防⽌了恶意脚本访问你的数据中权限,因此对于数据库中保存的敏感数据来说,不会有危及安全的重⼤风险。
为使该⽂件⽣效,你就需要能够通过PHP访问其中的数据。要达到这个⽬的,需要在f中写上如下的包含句:
Include "/path/f"
需要注意该语句需要插⼊在VirtualHost区域内,否则其它⽤户就能取得相应的内容。
由于Apache的⽗进程以系统管理员⾝份运⾏(需要绑定在80端⼝),它能够读取该配置⽂件,但处理服务器请求的⼦进程(运⾏PHP脚本)不能读取该⽂件。
你可以通过$_SERVER超级全局数组去访问这两个变量,这样在db.inc中,只要通过引⽤$_SERVER变量即可,⽽不是在其中写明数据库的权限:
$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内容暴露的原因。
当然,你可以使⽤本技巧保护任何信息(不只是数据库访问权限),但我发现把⼤多数数据保存在数据库更为⽅便,特别是由于该技巧需要得到你的主机提供商的协助。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论