如何防止PHP,csrf,xsrf中的表单重放/中间人攻击

Chr*_*ris 11 php forms security csrf

我有一个Web表单,我正在使用PHP.我知道表格可以被操纵(我相信它被称为重播攻击或中间人攻击).所以我想使用一些真实性令牌作为隐藏字段.

我所知道的威胁可能性是:

  • 攻击者劫持了合法用户的形式(我相信这是中间人攻击)
  • 合法用户本身就是攻击者:他获取表单,读取令牌但使用它发送危险数据(我相信这是重播攻击)

在我提出问题之前,如果我到目前为止所说的任何内容都不正确,请纠正我,因为也许我的理解是有缺陷的.

现在问题:

  • 生成此令牌的最佳做法是什么,以便没有它的表单被拒绝(例如,salting?).
  • 人们做了什么来确保令牌没有被重播.

基于评论的新小问题:

  • 会话劫持与中间人攻击相同吗?

psy*_*tik 5

您在标题中提到了CSRF,但在您的问题中没有真正涵盖它.

您可以在线详细阅读它,但CSRF基本上是一种攻击,允许合法用户在不知不觉中提交到网站.例如,如果SO没有防范此类攻击,我可以制作一个表单,当您点击我的这个糟糕形式时,会导致您的SO个人资料信息被更改,期待其他事情发生("赢得一百万美元!点击这里!!").此表单将使用您的浏览器cookie来使用SO对您进行身份验证,并使其显示为您合法地向您的个人资料提交更新.

为了防止这种情况,你真的想做几件事:

  • 确保GET不会导致更新(例如,不要使用GET上的查询参数向用户的配置文件发布新的状态更新)
  • 确保所有POST都附带一个隐藏字段,该字段允许您验证表单是由您的服务生成的,而不是由其他人生成的,并且它是针对目标用户的.因此,每次向服务器发送表单的html时,必须由服务器生成此隐藏字段,并且对于该会话的该用户应该是唯一的.

第二项的替代方法是检查引荐来源始终是您的站点或您期望POST的站点.我不鼓励这种情况用于非HTTPS站点,因为某些浏览器/网络硬件会删除引用者,并且引用者存在并不总是可靠的.

  • 推荐者可以被欺骗,iirc (2认同)