0

我已经设法让我的文件上传脚本代码到我的服务器工作。这是一段非常愚蠢的代码,目前接受每个文件。这意味着,每个访问脚本的人都可以立即上传文件。

这是我当前的 PHP 代码,它将接收 POST 数据并处理请求:

<?php
$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir.basename($_FILES['userfile']['name']);

if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile))
{
    echo "OKAY";
}
else
{
    echo "NOT SO OKAY";
}
?>

为了防止世界其他地方将文件上传到我的服务器,我将在请求中发送一个 MD5-Hash 密钥,并且基本上只是在代码周围包装一个“if($key == $serverkey)”。

所以它应该是这样的:

<?php
if ($_POST['key'] == $serverkey)
{
    $uploaddir = '/var/www/uploads/';
    $uploadfile = $uploaddir.basename($_FILES['userfile']['name']);

    if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile))
    {
        echo "OKAY";
    }
    else
    {
        echo "NOT SO OKAY";
    }
}
else
{
    echo "WRONG KEY";
}
?>

我现在的问题是......如何以正确的方式将密钥附加到请求中,以便之后可以访问“$_POST ['key']”以及文件?我不希望密钥意外应用于文件数据。

该文件在 Qt 中附加了以下代码:

data.append(QString("--" + bound + "\r\n").toLatin1());
data.append("Content-Disposition: form-data; name=\"" + url + "\"\r\n\r\n");
data.append(scriptName + "\r\n");
data.append("--" + bound + "\r\n");
data.append("Content-Disposition: form-data; name=\"" + inputName + "\"; filename=\"" + inf.fileName() + "\"\r\n");
data.append("Content-Type: application/octet-stream\r\n\r\n");
if (!file.open(QIODevice::ReadOnly)) return;
data.append(file.readAll());
data.append("\r\n");
data.append("--" + bound + "--\r\n");

文件是否已经限制在边界内?

如果我只附加这样的另一行,PHP 会知道两者之间的区别:

data.append("&key=" + key);

我需要“&”吗?我在谷歌上找不到任何东西......要么有严格的文件上传,要么有一些值,比如通过 POST 发送的密钥,但绝不会在同一个请求中同时出现。感谢大家的帮助!

4

1 回答 1

1

根据要求,我的评论作为答案。

由于您正在检查$_POST,因此必须在您的请求中添加一个额外的 POST 参数。我认为,您还可以签$_GET入您的 PHP 脚本并附?key=md5stuff加到您的 URL。

于 2013-02-28T13:49:06.753 回答