【问题标题】:Issue with NULL byte at URL [closed]URL处的NULL字节问题[关闭]
【发布时间】:2014-08-28 00:56:28
【问题描述】:

假设我们有以下 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')。 php 在第 16 行

谁能告诉我为什么这不起作用?
谢谢

【问题讨论】:

  • PHP 中的字符串是空终止的吗?从什么时候开始?
  • "我们都知道 PHP 中的所有字符串都必须以 NULL 字节结尾"。不,他们不是。摆脱%00
  • 问题不清楚(这应该做什么?你为什么希望它这样做?你到底想包含什么文件?)并且可能基于一个荒谬的前提.投票结束。
  • @deceze 我想包含g:/file.asd,但在服务器端代码中将.txt 附加到请求的文件中,但我想绕过它,并包含asd 文件
  • @ABFORCE 你不能这样做。 This bug was fixed in PHP 5.3。 (我认为这是相关的,但也许不是我不确定你到底想要做什么。)

标签: php apache url


【解决方案1】:

抛开include基于用户输入而未经验证的文件的巨大安全隐患,我会这样做:

if( strpos($adr,".") === false) $adr .= ".txt";

基本上,如果还没有文件扩展名(或者至少看起来可能是文件扩展名),这仅会附加.txt

【讨论】:

    【解决方案2】:

    我对在 url 中使用 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 文件。

    当然,您只能在本地主机上执行此操作。如果您在实时服务器上执行此操作,请不要这样做,因为任何人都可以快速显示所有文件系统数据并做任何他们想做的事情。

    【讨论】:

    • 呃,不...在启动 PHP 之前,服务器已经完成了。
    • @NiettheDarkAbsol 我的错,已经改了
    • 再一次,不会有任何区别。虽然 :/ do 通常在 URL 中具有含义,但它们在查询字符串中没有含义,因此不需要转义。
    • @NiettheDarkAbsol 但是如果使用这种方式,其他奇怪的字符也可能出现在 Url 中,这些可能需要 urlencoding
    猜你喜欢
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多