php:只允许来自指定域名的表单POST

时间:2015-01-22 16:26:00

标签: php

我有一个运行php脚本的页面,用于在发布表单时将用户订阅到新闻稿。 现在,我担心收到垃圾邮件,因为任何人都可以使用表单发布到我的页面。

有什么方法可以在PHP中使用条件,只允许来自某个域的传入提交? 如果域名不匹配,则使用else来回显错误消息。

我刚刚开始使用php,所以我很感激能得到的所有帮助。

谢谢。

2 个答案:

答案 0 :(得分:0)

您可以做的最接近的事情是设置一个仅限于您的域的cookie,然后在POST端检查该cookie。

setcookie('checkmydomain', 'something', 3600, '/', 'www.yourdomain.com');

然后你可以做

if(isset($_COOKIE['checkmydomain'])) { 
     //process the POST 
}

显然,失败仍然是微不足道的,但它会停止"简单"机器人提交数据

答案 1 :(得分:0)

一些想法而不是预期的完美答案:

不是从$ _POST数据中检查URI,而是将标记和哈希值的输入放入$ _POST,例如,一个帖子可以包含您网站/域所特有的哈希值 - 该脚本中的那个脚本时间,比如说 - 页面URL或一些标识符+ unix时间戳 - ,用河豚加密并保存为隐藏字段,以及在隐藏字段中获取纯文本详细信息 - 所以作为一个简短的例子:

1)网站向您发送带有SHA哈希的隐藏字段 散列由标识字符串(例如系统上的域帐号)以及来自该域的IP查找组成

$str = $identity.$ip

2)网站还会向您发送域名的纯文本详细信息,例如“$ _POST ['domain'] =”www.site.com“

3)在最后,阅读$_POST['domain']值并使用PHP从域中推断出IP地址

4)然后,使用站点IP地址和您已知的身份值 - 重新生成页面上的哈希值,如果它们与提供的哈希值完全相同,那么您可以信任(可能)来自给定的数据域。

5)继续....删除或发布...

这里有一些假设,你会从另一个域获得数据,这样饼干(cookies)就会变得棘手,并且你有一些身份信息可以为这些帖子的每个源域提供。

隐藏的表单数据很容易复制,但如果每次生成表单时它都是唯一且特定的,则不会。还要添加反垃圾邮件方法,例如名为“email”或“name”的text字段,并将它们留空,但要使用一些CSS display:none;。机器人会看到它们并且没有意识到它们是隐藏的并且能够完成它们,这表明它是一个非人类的读者。

注意:是客户端的IP地址一直在变化,但网站IP地址非常静态 - 大多数情况下并非所有情况都是如此。这些是我所指的不是浏览器IP的IP地址。

进一步编辑: 发送的哈希数据中的时间戳值可以放在例如date("D");而不是unix准确时间内,这样在24小时内提交表单并且不会跨越午夜就可以了。任何日期值都会随时间变化,并且可以在另一端轻松重建。