Php 如何避免在post数据中放入文件名?

Php 如何避免在post数据中放入文件名?,php,html,forms,security,Php,Html,Forms,Security,我写了下面的代码,我想知道是否有更好的方法来做我想做的事情 基本上,代码读取一些文件并编写HTML表单来编辑每个文件。我通过POST数据发送文件名,但这样做似乎有安全风险 有没有更好或正确的方法来做我正在做的事情 代码: 让用户编辑服务器端文件时,我们暂时忽略这一点。我假设您已经解决了所有的身份验证/授权/注入问题,剩下的唯一问题是文件名 因此,您不希望用户知道/篡改您的文件名。生成一个与正在编辑的文件关联的长随机标记,而不是将名称写入页面。然后,当帖子返回时,查找令牌,您就知道正在编辑哪个文件

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

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

有没有更好或正确的方法来做我正在做的事情

代码:


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

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


现在,我们已经排除了这个问题,回到第一段,确保选中了所有的复选框。这里可能存在比文件名更糟糕的问题。

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

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


现在,我们已经排除了这个问题,回到第一段,确保选中了所有的复选框。这里可能存在比文件名更糟糕的问题。

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

如果后端代码如下所示:

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

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

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

如果后端代码如下所示:

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

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

如果允许用户编辑您的文件,他是否值得信任?或者换句话来说:如果不受信任的用户已经可以在您的服务器上编辑文件,你没有比文件名泄露更糟糕的问题吗?事实上——我可能应该提到这一点——有一些措施可以防止人们编辑文件,除非他们在文件中存储了密码(作为河豚散列)。如果允许用户编辑你的文件,他不值得信任吗?或者换一种说法:如果一个不受信任的用户已经可以在你的服务器上编辑文件,难道你没有比文件名泄露更糟糕的问题吗?事实上——我可能应该提到这一点——有一些措施可以防止人们编辑文件,除非他们在文件中存储了密码(像河豚肉)。