我应该以某种方式保护我的$ _FILE用户输入?

时间:2011-02-05 17:22:31

标签: php

我想让我的网站防黑客,所以这就是我做的原因:

Text: mysql_real_escape_string($myVar);
Number: (int)$myVar;

我应该使用类似于$myVar = $_FILE['myFile'];提供的文件数组吗?

2 个答案:

答案 0 :(得分:1)

清理文件名非常重要。

您可能还想要涵盖一些问题,例如,* nix中不允许Windows中允许的所有字符,反之亦然。文件名也可能包含相对路径,可能会覆盖其他未上载的文件。

此上传功能取自here

function Upload($source, $destination, $chmod = null)
{
    $result = array();
    $destination = self::Path($destination);

    if ((is_dir($destination) === true) && (array_key_exists($source, $_FILES) === true))
    {
        if (count($_FILES[$source], COUNT_RECURSIVE) == 5)
        {
            foreach ($_FILES[$source] as $key => $value)
            {
                $_FILES[$source][$key] = array($value);
            }
        }

        foreach (array_map('basename', $_FILES[$source]['name']) as $key => $value)
        {
            $result[$value] = false;

            if ($_FILES[$source]['error'][$key] == UPLOAD_ERR_OK)
            {
                $file = ph()->Text->Slug($value, '_', '.');

                if (file_exists($destination . $file) === true)
                {
                    $file = substr_replace($file, '_' . md5_file($_FILES[$source]['tmp_name'][$key]), strrpos($value, '.'), 0);
                }

                if (move_uploaded_file($_FILES[$source]['tmp_name'][$key], $destination . $file) === true)
                {
                    if (self::Chmod($destination . $file, $chmod) === true)
                    {
                        $result[$value] = $destination . $file;
                    }
                }
            }
        }
    }

    return $result;
}

重要的部分是:

1)确保该文件不包含任何相对路径。

2)ph()->Text->Slug(),这确保文件名中只允许使用.0-9a-zA-Z,所有其他字符都被下划线替换(_)

3)md5_file(),如果已存在同名的另一个文件,则将其添加到文件名中

了解其explained here

的效果如何

答案 1 :(得分:0)

取决于用例。例如,如果将文件名保存到DB,则应将其作为字符串进行转义。此外,您应该防止上传和执行PHP脚本。