2012-08-26 58 views
0

有没有办法将文件从其他网站上传到我的网站?防止跨站点文件上传到我的服务器上?

我有一个窗体,在客户端和服务器端提交表单后,需要半大型视频文件并使用令牌进行身份验证。但是,由于我们可能同时有300人上传文件,因此我们不希望一些跨站点黑客尝试上传不经过的文件。

问题与他们甚至试图它是当文件开始上传时,它占用我们的内存资源(对吧?)和带宽。

解决方案我正在寻找的是有apache或iptables或文件正在发送到php脚本,不允许上传,只要它看到它不是从网站的上传页面。

这可能吗?

回答

1

该解决方案将使用表单标记来确保表单仅通过服务器提交。为此,创建一个带有随机值的表单令牌,将其放置在会话中以及隐藏的表单字段中。发布表单时,请根据会话检查此隐藏字段的值。如果表单令牌存在并且匹配会话允许上传,否则不会。

你上传表单页面

PHP代码:

$token = md5 (uniqid (rand(), true)); 
$_SESSION[“token”] = $token; 

HTML代码:

<form> 
<input type="file" /> 
<input type=”hidden” name=”token” value=”<?php echo $token;?>”> 
</form> 

您提交$_SESSION["token"]每次用户请求上传页面上传新文件时都会被覆盖。所以你不必担心它的价值被重置。

+0

我已经完成了。这里的问题虽然是一个人从一个隐藏的输入复制他的令牌,并绕过我的上传者的最大文件大小,他将最终占用服务器的资源上传文件将失败。如果他们这样做了,例如打开了10个标签供上传,由于资源限制,它可能会使服务器崩溃。也许我的问题不清楚?或者你认为,如果是这种情况,就让他们的文件失败,因为他们不可能同时上传那么多文件。 – Darius

+0

我认为有可能有邪恶的节目,允许有人选择100个大文件,并尝试同时上传它们。这可能会伤害我们的资源,对吗?或者他们的连接速度会非常缓慢,以至于他们会计时或上传速度不会对我们的资源造成太大影响。 – Darius

+1

他会如何做到这一点,假设我登录到您的应用程序,上传表单有随机值说:“asfjh23878afhfjh2834724asfh”,这个值也在服务器会话中。虽然我提交表格之前,PHP会检查这个隐藏字段是否与会话值匹配。这里有两种情况1.我更改隐藏字段的值 - >因为这不会匹配会话用户将不被允许上传文件。第二,如果来自另一个网站,我尝试发布表单上传文件 - >我不会有有效的令牌来做到这一点。每次刷新页面时都会随机生成不同的表单令牌。 – WatsMyName