关于is_uploaded_file()的,用于防止潜在的攻击者对原本不能通过脚本交互的文件进行非法管理。例如考虑这样一种情况:上传的文件可以立即通过公共网站仓库进行浏览。假如攻击者希望上传某个更有趣的文件,比如/etc/passwd,而不是让他熟读的课堂笔记。攻击者可能不会老老实实地导航到课程笔记文件,而直接在表单的文件上传域中键入/etc/passwd。
<?php
         copy($_FILES['classnotes']['tmp_name'], "/www/htdocs/classnotes/".basename($classnotes));
?>
其结果将是/etc/passwd文件被复制到可以公共访问的目录中。就这段话,一开始说是防止攻击者进行非法阅览,但又说攻击者希望上传某个文件而直接在表单文件上传域中键入/etc/passwd,不就自相矛盾了嘛?在上传域键入都只是上传啊。。怎么会变成可以阅览呢?

解决方案 »

  1.   

    是不是想说:攻击的人,想通过form来实现command line运行。那个函数可以帮你防止。
      

  2.   

    is_uploaded_file() 这个函数并没有什么用了现在,它的存在只是为了兼容PHP4。
    只有一种情况它可能派上用场:
    当文件上传失败时, $_FILES['classnotes']['tmp_name']的值为空,那么这时候还可以检测一下 $_FILES['classnotes']['tmp_name'] 是不是一个文件名,显然这会报false,那么你就可以停止移动一个不存在的文件了。
    不必纠结于书上这晦涩的论述,自己动手写些例子吧,就比如文件上传
      

  3.   

    它说的情况只在register_globals为On,并且copy时用了直接的变量而不是$_FILES时会有问题.所以说.还是看手册好:
    http://php.net/manual/en/function.is-uploaded-file.php
    看别人写的注释
      

  4.   

    仅就文字而言,描述上并没有问题!
    首先说明了 is_uploaded_file 函数的作用
    其次示例了一个不使用 is_uploaded_file 验证的非法入侵的例子我很怀疑你是否完成了小学学业从编程上讲,很遗憾作者的示例是错误的,不可实现的!
    1、表单的文件上传域是只读的,不能键入任何字符
    2、$_FILES['classnotes']['tmp_name'] 只在上传确实发生时才会有值
    3、$_FILES['classnotes']['tmp_name'] 只是上传文件在服务器上的临时文件名称,由 php 动态构造。并不是表单的文件上传域中的内容
      

  5.   

    那么这段代码:<?php
    ini_set('max_execution_time', '60'); ob_start('ob_gzhandler');




    if (is_uploaded_file($_FILES['fileaddress']['tmp_name'])) {
    echo 'File ' . $_FILES['fileaddress']['name'] . ' uploaded successfully.<br />';
    echo 'Displaying contents<br />';
    readfile($_FILES['fileaddress']['tmp_name']);
    }
    else {
    echo 'Possible file upload attack: ';
    echo "filename '" . $_FILES['fileaddress']['tmp_name'] . "'.<br />";
    }
    ?><html>
    <head>
    <title></title>
    </head>
    <body>
    <form action="index3.php" method="post" enctype="multipart/form-data">
    <input type="file" name="fileaddress" />
    <p><input type="submit" value="Submit!"/></p>
    </form>
    </body>
    </html>为什么运行会显示
    Notice: Undefined index: fileaddress in D:\Apache Group\Apache2\htdocs\PHPProject\index3.php on line 9
    Possible file upload attack: 
    Notice: Undefined index: fileaddress in D:\Apache Group\Apache2\htdocs\PHPProject\index3.php on line 16
    filename ''.
    后面是一个上传域和一个提交按钮。。
      

  6.   

    而且我在php.ini中upload_tmp_dir = ";D:\phpTmp\phpUploads",我的确也有这个文件夹的,为什么上传什么文件上去后在这个路径里都没有显示该文件的?
      

  7.   

    因为你第一次访问该页面时,并没有向其上传表单文件,因此没有$_FILES['fileaddress']这个变量。所以报错
    你需要加一个判断,是否用户有上传文件
    if( isset($_FILES['fileaddress'])  && is_uploaded_file($_FILES['fileaddress']['tmp_name']) 
    为什么上传什么文件上去后在这个路径里都没有显示该文件的?
    也许你知道tmp的是临时的缩写,顾名思义 upload_tmp_dir = ";D:\phpTmp\phpUploads" 就是上传文件临时保存到的目录。这个临时文件只会在处理本次页面请求时存在,当程序结束,文件也会被删除。所以你需要把它移动到某一个目录
      

  8.   

    若我将程序改成这样:<?php
    //ini_set('max_execution_time', '60'); //ob_start('ob_gzhandler');


    define("FILEREPOSITORY", "D:/phpFiles/");

    if (isset($_FILES['classnotes'])) {
    if (is_uploaded_file($_FILES['classnotes']['tmp_name'])) {

    if ($_FILES['classnotes']['type'] == "application/pdf") {
    echo 'File ' . $_FILES['classnotes']['tmp_name'] . ' uploaded successfully.<br />';
    echo 'Displaying contents<br />';
    readfile($_FILES['classnotes']['tmp_name']);

    $name = $_POST['name'];

    //$result = move_uploaded_file($_FILES['classnotes']['tmp_name'], FILEREPOSITORY."/$name.pdf");
    $result = copy($_FILES['classnotes']['tmp_name'], FILEREPOSITORY."/$name.pdf");

    if ($result !== false) {
    echo '<p>File successfully uploaded.</p>';
    }
    else {
    echo '<p>There was a problem uploading the file.</p>';
    }
    }
    else {
    echo '<p>Class notes must be uploaded in PDF format.</p>';
    }

    }
    else {
    echo 'Possible file upload attack: ';
    echo "filename '" . $_FILES['classnotes']['tmp_name'] . "'.<br />";
    }
    }
    else {
    echo "Never set!<br />";
    }
    ?><html>
    <head>
    <title></title>
    </head>
    <body>
    <form action="index3.php" method="post" enctype="multipart/form-data">
    Last Name:<br />
    <input type="text" name="name"/><br />

    Class Notes:<br />
    <input type="file" name="classnotes" /><br />

    <p><input type="submit" value="Submit!"/></p>
    </form>
    </body>
    </html>
    那么为什么上传提交后会没变化(即没有输出,而移动后的最终目标路径中也没有相应文件)?
      

  9.   

    没 有 输 出 ,那 么 可 能 是 你 的 程 序 发 生 了 致 命 错 误 。而 你 没 有 打 开 错 误 提 示 
    可 以 在 代 码 开 头 加 上 这 几 句 来 调 试
    ini_set('display_errors', 1);
    error_reporting( E_ALL | E_NOTICE);
    var_dump($_FILES);