PHP表单引用安全性

时间:2012-03-05 19:16:18

标签: php html forms security

  

可能重复:
  How to know where a form came from?

我今天正在浏览这些论坛,但我找不到足够好的答案来回答我的问题。

除非来自我的域引用,否则如何停止提交到我的服务器的表单。我已经意识到,如果有人直接复制我的表单HTML并将其粘贴到他们自己的平台上,那么表单中的数据将解析我的文件并执行表单在我的网站上设置的内容。

如何防止这种情况发生?我正在考虑检查推荐人是否来自我的域名,但是根据我的研究,这不会阻止这种情况发生。那我怎么能阻止这种情况发生呢?

4 个答案:

答案 0 :(得分:3)

REFERER很容易被欺骗但很容易被检查,因此作为防御的主要障碍并不是太糟糕。对于更复杂的预防,您可以在加载具有相关表单的页面时生成令牌,将其存储在用户会话中,将其保存在表单的隐藏字段中,并在提交表单时对其进行检查值。如果有人想要,也可以规避这一点,因此,根据您的具体情况,HTTPS将是最后的手段。

答案 1 :(得分:3)

您可能会尝试防范两种类型的攻击。<​​/ p>

第三方欺骗用户在您的网站上执行操作

这是Alice登录Bob的网站,然后访问攻击者的网站,攻击者网站导致Alice的浏览器(例如)向Bob的网站发送“转账”请求。

这是CSRF attack,标准defence在隐藏字段中包含也存在于用户会话中的令牌。

攻击者无法将令牌放入其表单中,因此如果令牌匹配,您就知道该表单在您的网站上。

用户修改表单中的数据以提交他们真正不应该的数据

例如,Alice在提交编辑请求之前更改了评论的POST_ID,从而编辑了其他人的帖子,或者可能更改了所订购商品的价格。

对此的辩护是验证输入。如果有编辑请求,请确保登录用户有权编辑帖子。如果订单进来,那么只关注商品ID和数量,您可以从您的数据库中获取价格。等

答案 2 :(得分:0)

你不能依赖推荐人!它可以被禁用。

但是你可以在隐藏的输入字段中使用你编写的token和b)进入用户的会话。 在目标脚本中,您只需检查它们是否相同!

答案 3 :(得分:0)

您正在尝试确保当POST进入您的应用程序时,它来自您的服务器的FORM而不是其他地方。这称为跨站请求伪造(CSRF)攻击。

检查引荐来源是有问题的。首先,HTTP规范明确允许客户端不发送引用字符串(出于各种隐私原因)。因此,您的一些客户可能不会包含它。其次,引用者字符串可以被欺骗,具有足够技能的攻击者可以使它们看起来像是为了成功进行CSRF攻击。

使用CSRF验证令牌是一种更强大的方法,是抵御CSRF攻击的首选方法。您可以在OWASP CSRF Cheat Sheet上了解原因。

我还要指出,你没有理由不能同时做到这两点。通常需要防御深度(DiD)策略,以便攻击者需要击败多个独立的防御来执行成功的攻击。您可以实现弱引用者检查方法(如果客户提供引用者,请确保它在执行请求之前应该是什么;如果引用者不存在,则继续进行,就像它存在并且正确一样)以及CSRF验证令牌。这样,如果客户端提供它,同时仍然使用更强的验证令牌方法,则检查引用的信息。