如何避免在帖子数据中放置文件名?

时间:2014-04-28 14:17:43

标签: php html forms security

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

基本上,代码会读取一些文件并编写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>';
    }

?>

2 个答案:

答案 0 :(得分:4)

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

因此,您不希望用户知道/使用您的文件名。不是将名称写入页面,而是生成与正在编辑的文件关联的长且随机的标记。然后当帖子回来时,查找令牌并知道正在编辑的文件。如果您找回了您无法识别的令牌,则可以删除该请求。从HTML方面来看,用户看到的所有内容都是不透明的令牌。文件名永远不会离开您的服务器。

现在我们已经解决了这个问题,请回到第一段,确保检查了所有这些框。这里可能存在比文件名更糟糕的问题。

答案 1 :(得分:0)

客户端安全/验证必须始终建立在强大的服务器端等价物之上。如果你不能兼顾两者,那么只有后者是强制性的。

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

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

...真正的问题是您提供对完整硬盘的写访问权限。它相当于以表格形式存储SQL查询。