我目前正在使用PHP,只是一个初学者,但主要对PHP的安全问题感兴趣。我想知道的是“客户端从服务器的PHP文件中看到了什么”。
所以说你有1张包含所有PHP代码的表。您包含该文件,然后调用要使用的功能。客户从表中看到了什么。它只是被调用的函数,只是输出还是别的什么?
我感兴趣的原因是因为我想知道客户是否有可能看到真正被执行的内容。因此,不仅结果而且来自功能本身的内容,例如正在执行的代码。
把一个含糊不清的故事放在一起。我对您作为服务器客户端的看法感兴趣。
提前致谢!
PS:对不起如果我发布了一个重复的问题。但我找不到任何与我的问题类似的内容
答案 0 :(得分:5)
考虑到PHP是服务器端,不应该从内部工作中向客户端公开任何内容。仅输出(除非您的服务器配置错误且不解析PHP文件)。为了解决这个问题,大多数人只会在文档根目录中有一个index.php
文件,include
是文件根目录之外的PHP文件(引导程序文件)。这种方式即使文件没有被PHP解析,唯一可访问的内容就是包含require __DIR__ . '/../bootstrap.php';
的文件。
但是,当您启用error reporting(您应该经常这样做)时,可能会泄漏信息和您已启用display errors。
泄露信息的示例可能如下所示:
致命错误:在/path/to/Template/stream/stream.phtml:20中带有消息'Eeeeeeeek'的未捕获异常'异常'堆栈跟踪:#0 / path / to / PitchBlade / src / PitchBlade / Mvc / View /View.php(179):require()#1 /path/to/PitchBlade/src/PitchBlade/Mvc/View/View.php(196):PitchBlade / Mvc / View / View-> render('stream / stream.p ...')
/path/to/View/Stream/Stream.php(46):PitchBlade / Mvc / View / View-> renderPage('stream / stream.p ...')
等
您可以通过在代码深处“伪造”异常来找到自己:
<?php throw new \Exception('Eeeeeeeek'); ?>
如果显示整个堆栈跟踪,则会显示大量信息。
另一个常见的缺陷是通过更改扩展名来重命名PHP文件(用于备份或其他目的)。例如。将index.php
重命名为index.php.bak
。现在默认情况下,PHP不再解析文件,可以从客户端按原样读取。
还要注意(某些?)webservers向客户端公开一些信息(即webserver类型,有时使用的是版本和php版本)。根据网络服务器的不同,这可以通过expose_php
directive和您使用网络服务器的指令进行更改。对于apache,您可以将以下内容添加到服务器配置中,以防止使用所使用的Web服务器(ServerTokens Prod
和ServerSignature Off
)。虽然人们通常仍然可以使用fingerprinting technique来获取至少部分信息。
我能想到的最后一件事是用户(或可能的攻击者)通过附加以下查询字符串之一来尝试不同的PHP“复活节彩蛋”:
?=PHPE9568F36-D428-11d2-A769-00AA001ACF42
?=PHPE9568F35-D428-11d2-A769-00AA001ACF42
?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000
?=PHPE9568F34-D428-11d2-A769-00AA001ACF42
但是当禁用php_expose
时,IIRC也无法做到这一点。
答案 1 :(得分:1)
在正常情况下,客户端无法监视php代码。您可以通过右键单击网页和“检查元素”在例如chrome中进行测试。 客户端可以看到可以使用php代码设置的cookie。为了确保它不会用于错误的目的,您可以使用哈希函数来加密您使用cookie设置的信息。
示例:
$pass = hash("ripemd160",$pass);
setcookie('password',"$pass",time()+3600);
希望它有所帮助!
PS:哈希函数不是真正可靠的,因为有太多方法可以解密它们。虽然这不是保护密码的好方法(正如PeeHaa所说),对于电子邮件来说这是相当可观的。