假设我们有以下PHP脚本
if(isset($_GET['adr'])) {
$adr = $_GET['adr'];
include $adr.".txt";
}
我想加载非文本文件,为此我使用mysite.com/?adr=g:/file.asd%00
URL,另一方面我们都知道PHP中的所有字符串必须以NULL字节(即%00)终止。但是当我请求这个URL时,Apache服务器告诉我:
警告:include():无法在G:\ Program Files \ EasyPHP-12.1 \ www \ index中打开'g:/file.asd'以包含(include_path ='。; C:\ php \ pear')。第16行的PHP
任何人都可以告诉我为什么这不起作用? 感谢
答案 0 :(得分:1)
暂不考虑基于用户输入include
文件的大量安全隐患而不进行验证,这就是我要做的事情:
if( strpos($adr,".") === false) $adr .= ".txt";
基本上,如果还没有文件扩展名(或者至少看起来像是文件扩展名的东西),这只会附加.txt
答案 1 :(得分:0)
我对网址中使用NULL字节一无所知。
创建URL和传递参数时,您应该使用urlencode函数,如下所示:
$x = 'ysite.com/?adr='.urlencode('g:/file.asd');
您应该确保文件g:/file.asd.txt
存在
额外问题 - 您确定已保存文件吗?在警告中有Failed opening 'g:/file.asd' for inclusion
,并且在您的代码中包含g:/file.asd.txt
文件。
当然,您只能在本地主机上执行此操作。如果你在实时服务器上进行操作,那么简单,不要因为任何人都可以快速显示所有文件系统数据并做任何他们想做的事情。