【问题标题】:How to avoid putting a file name in post data?如何避免在帖子数据中放置文件名?
【发布时间】:2014-04-28 14:17:42
【问题描述】:

我写了以下代码,我想知道是否有更好的方法来做我想做的事。

基本上,代码会读取一些文件并编写 HTML 表单来编辑每个文件。我通过 POST 数据发送文件名,但这样做似乎存在安全风险。

有没有更好或更合适的方法来做我正在做的事情?

代码:

<?php

    foreach (glob('*.html', GLOB_NOSORT) as $file) {
        echo '<form action="write.php">';
        echo '<textarea name="' . basename($file, '.html') . '" cols="80" rows="20">' . file_get_contents($file) . '</textarea>';
        echo '<input type="hidden" name="file" value="' . $file . '"><br><br>';
        echo '<input type="submit" value="Save Edit"><br><br>';
    }

?>

【问题讨论】:

  • 如果允许用户编辑你的文件,他不值得信任吗?
  • 或者换个说法:如果一个不受信任的用户已经可以在您的服务器上编辑文件,那么您的问题不是比文件名泄露更严重吗?
  • 实际上 - 我可能应该提到这一点 - 有一些措施可以防止人们编辑文件,除非他们将密码存储在文件中(作为河豚哈希)。

标签: php html forms security


【解决方案1】:

暂时让我们忽略您让用户编辑服务器端文件的情况。我只是假设您已经解决了所有的身份验证/授权/注入问题,而您唯一剩下的问题就是文件名。

因此,您不希望用户知道/胡乱使用您的文件名。与其将名称写入页面,不如生成一个与正在编辑的文件相关联的长而随机的令牌。然后当帖子回来时,查找令牌,您就知道正在编辑哪个文件。如果您取回您不认识的令牌,您可以放弃该请求。在 HTML 方面,用户看到的只是一个不透明的令牌。文件名永远不会离开您的服务器。

既然我们已经解决了这个问题,请返回第一段并确保您已选中所有这些框。这里可能存在比文件名更糟糕的问题。

【讨论】:

    【解决方案2】:

    客户端安全/验证必须始终建立在强大的服务器端等效项之上。如果两者都买不起,则只有后者是强制性的。

    如果您的后端代码如下所示:

    $fp = fopen($_POST['file'], 'w');
    fwrite($fp, $_POST[basename($_POST['file'], '.html')]);
    fclose($fp);
    

    ...真正的问题是您提供了对整个硬盘的写访问权限。这相当于将您的 SQL 查询存储在表单中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-09
      • 2018-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      • 2021-01-17
      相关资源
      最近更新 更多