如何只允许从一个域上传PHP?

时间:2011-09-06 10:55:30

标签: php forms file-upload

在我写的HTML表单中,用户可以上传使用ajax在提交时发送的文件。该脚本位于exampledomain.com/upload.php。

我想避免出现这样一种情况,即有人会通过指向upload.php的行为制作自己的表单并开始使用未经授权的文件向我的服务器发送垃圾邮件。

每个人都可以填写我的HTML表单,因此上传的登录/密码保护对我来说不是一个选项。有没有什么有效的方法可以确保只从我网站上的HTML表单触发upload.php?

处理该问题的一种方法是使用会话,但我不确定它与ajax的工作情况有多好。有什么建议吗?

5 个答案:

答案 0 :(得分:3)

虽然Cross Site Request Forgery通常被归类为通过其他网站对已经过身份验证的用户帐户的攻击,但用于打击它的技术在某种程度上对您有用,即使如您所说,您的用户不是这样认证。

具体来说,如Jeff Atwood's article here中所述,为每个表单生成一个nonce(一次性唯一值)将有助于阻止其他站点简单地将数据发送到您的服务器 - 如果您验证发送的nonce值POST请求是您最近生成的请求,它必须至少来自以某种方式“访问”您网站的人。

但是,这不会阻止垃圾邮件发送者通过从您的网站抓取nonce值来攻击您的网站,即伪装成您的用户并使用您的实际表单。为此,您可能希望查看各种技术,如CAPTCHA,黑名单和其他验证。

就我个人而言,我认为如果您不打算使用经过身份验证的用户(我的意思是至少要求CAPTCHA加上电子邮件地址验证以供用户注册,然后要求他们在上传之前进行身份验证)然后我会说你几乎 使用一个好的CAPTCHA系统,可能结合定期检查异常活动,并对上传进行抽样以对抗不可避免的垃圾邮件和攻击。遗憾的是,大多数流行的Web服务需要进行这些检查是有原因的。

(顺便说一下,会话可以正常使用Ajax - 只需确保在响应Ajax请求的页面中使用相同的会话处理代码。但是如果没有经过身份验证的用户,会话将不会在安全方式,据我所知。一个spambot可以很好地处理会话。)

答案 1 :(得分:1)

  

我想避免出现这样一种情况,即有人会通过指向upload.php的行为制作自己的表单并开始使用未经授权的文件向我的服务器发送垃圾邮件。

那是不可能的。

  

如何只允许从一个域上传PHP?

为了通知您,上传的文件不是来自“域”,而是仅来自用户的PC。

只要您的网站上有无限制注册,任何人都可以发送垃圾邮件。你必须选择另一种保护来抵御这种想象中的威胁。

答案 2 :(得分:0)

防范垃圾邮件发送者的最佳方法是验证码(尝试重新计算)。要记住的其他技术是隐藏形式的唯一代码(有利于防止clrf攻击),使用$ _SERVER ['']验证域名,但相对容易反击

答案 3 :(得分:0)

将一个PHP变量添加到页面中以充当密码,而不是可以复制的静态值使用每分钟都会更改的计算值。

发送的计算值必须与upload.php文件中的计算值相匹配才能发送文件。

但这仍然不会阻止通过您的网站发送垃圾邮件。

答案 4 :(得分:0)

您还可以计算以Kbytes上传的文件的大小,并将该整数附加到会话变量,并在登录后在下一个登录页面中检查该变量!