【问题标题】:About the function used in this script [closed]关于此脚本中使用的函数 [关闭]
【发布时间】:2013-07-08 06:14:46
【问题描述】:

我正在制作一个脚本,用于将文件远程上传到我的服务器,这里是代码。顺便说一句,我从一个网站上拿了它。我没有发布站点名称,否则它可能会被视为垃圾邮件或其他内容。它关于将远程文件下载到我们的服务器。

<?php

if (isset($_POST['myupload']))    
{

    $links_list = $_POST['upload'];
    $incr = 0;
    $links = explode("\r\n",$links_list);

    define('BUFSIZ', 4095);

    for ( $incr == 0 ; $incr < count($links) ; $incr++ )
    {
        $url = $links[$incr];
        $rfile = fopen($url, 'r');
        $lfile = fopen(basename($url), 'wb');
        while(!feof($rfile))
            fwrite($lfile, fread($rfile, BUFSIZ), BUFSIZ);
        fclose($rfile);
        fclose($lfile);
    }
}
?> 

    <script type="text/javascript"></script>
</head>    
<body>
    <div id="upload_box">
        <form action="" method="post">   
            <textarea name="upload" cols=80 rows=20></textarea>
            <input type="submit" name="myupload" value="Upload Files">
        </form>

我想问一些关于这个脚本的事情。

  • $lfile = fopen(basename($url), 'wb')

  • fwrite($lfile, fread($rfile, BUFSIZ), BUFSIZ);

我知道我问的是一个愚蠢的问题,但希望你们能帮我解释一下。

【问题讨论】:

  • RTFM ;) fopen() 以及 fwrite()
  • 注意“for”循环通常应该assign $incr ($incr = 0),而不是test it ($incr == 0 )。代码仍然有效,因为 $incr also 在上面几行归零。然后,fopen 应该检查错误,以避免脚本崩溃。此外,您的代码是可以利用的。我可以使用它让你的服务器代表my发出HTTP调用可能上传远程可执行代码。请记住不要将其留给匿名用户使用。
  • @Iserni 别再吓我了:P Jk 伙计,是的,我知道伙计,任何人都可以通过这个上传页面在我的服务器上上传 shell。

标签: php curl


【解决方案1】:
$lfile = fopen(basename($url), 'wb')

fopen:打开文件并返回可用于读取/写入该文件的句柄的函数,具体取决于第二个参数(如下所述)。

basename:从文件名中去除路径,只留下名称部分的函数。例如:basename('http://foo.com/bar.txt') 将返回 bar.txt

'wb':这告诉 fopen 如何打开文件:w 表示打开它以写入,b 表示打开它以进行二进制访问,这意味着不要做任何时髦的行尾转换(仅在 Windows 上有用)。

$lfile:这是文件的句柄,稍后将用于写入。

fwrite($lfile, fread($rfile, BUFSIZ), BUFSIZ);

fwrite:将数据写入之前打开的文件句柄(本例中为$lfile

fread:从文件中读取数据。

BUFSIZ: 我假设这是一个在某处定义的常量。无论如何,第三个参数 fwrite 指定要写入文件的字节数,fread 的第二个参数指定要读取的字节数。在这种情况下,它们都是相同的。

这种操作有时称为缓冲或块复制。

拆开后看起来像这样:

$data = fread($rfile, BUFSIZ);
fwrite($lfile, $data, BUFSIZ);

希望有帮助!

【讨论】:

  • 您先生是个天才。你比我的教授解释得更好。大声笑想教我php先生=))Jk。非常感谢这样描述性的回答伙伴:) 是的,BUFSIZ 已被定义为 4095 Jus 说:D
  • 不客气 :) 接受将不胜感激!
  • 我要补充一点,fwrite($lfile, fread($rfile, BUFSIZ), BUFSIZ); 没有什么意义; read返回的缓冲区永远不会超过BUFSIZ,所以最好写成fwrite($lfile, fread($rfile, BUFSIZ));。除了更简单之外,这样如果不可能发生,额外的字节不会像现在一样丢失。
  • 完成。抱歉,不知道那个绿色勾号:P new to stackoverflow。而且我无法为您的答案+1,因为我缺乏一点声誉(顺便说一句:p 15)。
  • 没问题,谢谢先生 :)
【解决方案2】:
1st > $lfile = fopen(basename($url), 'wb') < what does this code do ?

这一行打开 $url 并返回该 url 的句柄。

Basename()

给定一个包含文件或目录路径的字符串,此函数将返回尾随名称组件。

 2nd > fwrite($lfile, fread($rfile, BUFSIZ), BUFSIZ); < and what about this code ?

这将为流$lfile写入流$rfile的内容,并且读/写的大小为4095定义define('BUFSIZ', 4095);

看看这部分

while(!feof($rfile))
  fwrite($lfile, fread($rfile, BUFSIZ), BUFSIZ);

这部分将读取BUFSIZ定义的部分数据,直到字符“文件结束”feof()函数。

因此您的代码将下载以表单形式发布的链接。这就是它的全部作用。

【讨论】:

    【解决方案3】:

    $lfile = fopen(basename($url), 'wb')

    使用提供的 url 的最后一段(通常是文件名)创建一个文件指针来写入二进制文件,并将文件指针/处理程序返回给名为 $lfile 的变量

    fwrite($lfile, fread($rfile, BUFSIZ), BUFSIZ);

    从文件指针/处理程序 $rfile 中读取 BUFSIZ 长字节并推送到 $lfile 指向的文件中。还写入 BUFSIZ 字节数

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-10
      • 1970-01-01
      • 1970-01-01
      • 2021-01-25
      • 2012-11-12
      • 2012-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多