停止欺骗表单提交

时间:2012-02-08 23:05:28

标签: php forms security

我有一个关于停止欺骗表单提交的问题。如果使用$_SERVER['HTTP_REFERER'],我只允许提交来自我网站的表单?那会有帮助吗?!谢谢!

11 个答案:

答案 0 :(得分:5)

这会有所帮助,而且它很容易添加,但它不会阻止有针对性的攻击,毕竟你可以欺骗HTTP_REFERER标题。

要记住的一件事是客户端不需要发送HTTP_REFERER,因此如果缺少标头,您可能还是想要允许提交。如果无法做到这一点,那么检查HTTP_REFERER将无法帮助您。

搜索CAPTCHA “完全自动公共图灵测试以告诉计算机和人类”,这正是您真正想要的。

答案 1 :(得分:3)

让我们明确一点:技术上不可能来防止欺骗性的表单提交。用一句话总结:

  

如果您的浏览器可以执行此操作,则每个人都可以执行此操作。

答案 2 :(得分:2)

表单欺骗的主要问题是您无法控制客户端发送的内容。用户可以更改任何表单参数。因此,客户在表单提交时发送的所有内容都需要进行验证和验证。

这也意味着,您在表单中提供的参数越少,验证和验证所需的参数就越少。特别是,如果不是真的必要,则不需要将用户预设和不改变的参数(即隐藏的表格字段)嵌入到表格中。相反,您可以将它们存储在container in the session中,并且只能通过隐藏字段引用此容器。如果这不是一个选项,请确保您至少可以通过使用MAC唱出预设值来检测任何完整性缺陷。

另一个问题是,为成功提交表单需要发送的表单参数是可预测的,因此攻击者可以重复发送有效的表单提交。如果您需要一个不可预测的参数,该参数只能由您的服务器发布并在表单提交时进行验证,则可以验证是否已授予表单提交。

一种解决方案是使用在表单请求中生成的随机一次性令牌,并存储在会话中,并作为隐藏输入字段放入表单中。然后在表单提交时检查是否提供了令牌以及它是否等于存储在会话中的令牌;如果它们相等,则从会话中删除令牌并处理表单,否则您拒绝表单处理。

坦率地说,这种机制并不完美,因为您仍然可以先请求表单然后发送欺骗表单数据。在那里你可以使用额外的Captchas或其他阻止自动请求的机制。

最好的方法是使用上述所有措施的组合:

  • 在会话中使用足够随机的标识符创建表单容器;将该标识符作为表单中的隐藏输入字段,以标识表单提交上的表单容器
  • 将任何预设参数存储在表单容器中而不是表单
  • 如果无法从表单中排除预设参数,请使用MAC验证其值(使用每个表单容器键)
  • 如果有可疑的重复表单请求/表单提交,请考虑另外使用Captchas来阻止自动请求

此外,这些基于会话的表单容器也会阻止CSRF,因为攻击第三方的标识符无法预测。

答案 3 :(得分:0)

停止?没有限制?有可能。您的网站是否真的受到惊人数量的欺骗表单提交,或者您只是抢先一步?不要解决那里不存在的问题。

答案 4 :(得分:0)

推荐人很容易被欺骗。

你应该最好地验证表格,以便找出愚蠢的机器人,并可能使用服务器端验证码。

答案 5 :(得分:0)

Referer很容易被欺骗,所以任何想要欺骗表单提交的攻击者都可以欺骗Referer头。此外,我不认为Web浏览器需要发送Referer标头,因此它可能会从合法用户中排除表单帖子。

答案 6 :(得分:0)

尝试使用ReCaptcha等验证码。您不仅会阻止垃圾邮件发送垃圾邮件,而且您还可以“仅授权”使用您表单的人(至少在某种程度上 - 他们需要加载您的表单才能获取验证码然后发送响应)。

答案 7 :(得分:0)

欺骗HTTP标头非常简单,因此不应该用于需要严格安全性的事情。通常使用的一种技术是在表单上的隐藏输入中发送加密的cookie和匹配的加密令牌。 Cookie应该是仅限HTTP的Cookie。在表单提交上检查cookie中的值和隐藏输入的值是否匹配。这将有助于防止跨站点请求伪造,因为无法从其他站点成功地向您的站点发出请求,因为它们要么丢失cookie(对于MIM攻击)要么丢失隐藏的输入(欺骗形式)。当然,这取决于您确保您的网站是安全的,这样他们就无法嗅到令牌以找出要提供的内容。

以下是关于如何在ASP.NET MVC http://blog.stevensanderson.com/2008/09/01/prevent-cross-site-request-forgery-csrf-using-aspnet-mvcs-antiforgerytoken-helper/

中完成此操作的讨论

答案 8 :(得分:0)

如果没有“欺骗”的定义,那将是空话。

有十几种不同的“恶搞”,每种都有不同的保护。

最常见的解决方案是CAPTCHA。

答案 9 :(得分:0)

建议使用令牌。如果您使用任何流行的MVC架构,则无需担心因为需要考虑欺骗。但是如果你像我一样使用自定义MVC架构,那么令牌就是一种方法。在Database类中,对于每个CRUD(CREATE,READ,UPDATE AND DELETE)函数,检查令牌。例如 令牌可以通过md5生成。

public function save(){
if(isset($_SESSION['token']){
//proceed with saving
}else{
//kill it,
die;
}
}

或者,您可以轻松地将Web应用程序与此跨站点请求伪造保护工具包集成。查看here

答案 10 :(得分:-1)

没有真正的帮助。读这个: http://shiflett.org/articles/form-spoofing