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

5
在HTML表单中,用户可以通过ajax上传文件并在提交时发送。脚本位于exampledomain.com/upload.php。
我希望避免这样一种情况,即有人制作自己的表单,将操作指向upload.php,并开始使用未经授权的文件来攻击我的服务器。
由于每个人都可以填写我的HTML表单,因此对上传进行登录/密码保护对我来说不是一个选项。有没有有效的方法来确保只有从我的网站上的HTML表单才会触发upload.php?
解决这个问题的一种方法是使用会话,但我不确定它与ajax的兼容性如何。您有什么建议吗?
5个回答

3
尽管跨站请求伪造通常被归类为通过其他网站攻击已经认证的用户帐户的攻击,但用于打击它的技术在某种程度上也适用于您,即使您的用户并没有像这样进行身份验证。
具体来说,如Jeff Atwood在这里的文章所述,每个表单都生成一个一次性唯一值(nonce),将有助于防止其他站点仅仅向您的服务器POST数据——如果您验证了与POST请求一起发送的nonce值是最近生成的值之一,则至少必须来自某些以某种方式“访问”过您的站点的人。
但是,这并不能阻止垃圾邮件发送者通过从您的站点中爬取nonce值来攻击您的站点,即假装是您的用户并使用您的实际表单。为此,您可能需要研究各种技术,如CAPTCHA、黑名单和其他验证。
个人认为,如果您不打算使用经过身份验证的用户(我指至少需要一个 CAPTCHA 和电子邮件地址验证才能注册的用户,然后要求他们在上传之前进行身份验证),那么我会说您几乎必须使用一个好的 CAPTCHA 系统,可能还要结合定期检查异常活动和对上传内容的抽样检查来应对不可避免的垃圾邮件和攻击。很遗憾,这就是为什么大多数流行的 Web 服务都需要这些检查的原因。
(顺便说一句,会话与 Ajax 配合得很好--只需确保在响应 Ajax 请求的页面中使用相同的会话处理代码即可。但是在没有经过身份验证的用户的情况下,据我所见,会话不会为您提供任何安全性。垃圾邮件机器人可以很好地处理会话。)

1
我想避免这样的情况:有人制作自己的表单,将操作指向upload.php并开始向我的服务器发送未经授权的文件。

那是不可能的。

如何只允许来自一个域名的PHP上传?

需要说明的是,上传的文件并非来自“域名”,而仅仅是来自用户的个人电脑。

只要您的网站具有无限制的注册功能,任何人都可以进行垃圾邮件攻击。您必须选择其他保护措施来防范这种虚构的威胁。


0

防范垃圾邮件的最佳方法是使用验证码(尝试使用reCAPTCHA)。其他可用于保护免受CLRF攻击的技术包括在隐藏表单中使用唯一代码,使用$_SERVER['']验证域名,但这些方法相对容易被对手破解。


0

在页面中添加一个 PHP 变量,作为密码使用,但不是静态值,而是使用每分钟更改的计算值。

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

然而,这仍然无法阻止通过您的网站进行垃圾邮件。


0
你还可以计算上传文件的大小(以Kbytes为单位),并将该整数附加到会话变量中,在登录后的下一个着陆页面上检查该变量!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接