保护API免受CSRF的侵害?

时间:2014-08-03 14:53:35

标签: php ajax api csrf

我有一个PHP API,我的网站正在使用Ajax请求!

我可以使用该API执行的操作示例是(登录用户,更改密码,检索敏感数据)

那么简单,如何在使用此API时阻止CSRF?对我来说,理解它看起来有点复杂!

我使用HTTPS连接来执行这些操作..但我认为这不足以保证操作安全!

1 个答案:

答案 0 :(得分:2)

您需要使用Synchronizer Token。我认为我可以比OWASP做得更好:

  

为了促进透明但可见的" CSRF解决方案鼓励开发人员采用同步器令牌模式(http://www.corej2eepatterns.com/Design/PresoDesign.htm)。同步器令牌模式需要生成随机的挑战"与用户当前会话相关联的令牌。然后将这些挑战令牌插入与敏感服务器端操作相关联的HTML表单和链接中。当用户希望调用这些敏感操作时,HTTP请求应包含此质询令牌。然后,服务器应用程序负责验证此令牌的存在性和正确性。通过在每个请求中包含质询令牌,开发人员可以通过强大的控制来验证用户是否确实想要提交所需的请求。在与敏感业务功能相关联的HTTP请求中包含所需的安全令牌有助于缓解CSRF攻击,因为成功利用假设攻击者知道目标受害者会话的随机生成令牌。这类似于攻击者能够猜测目标受害者的会话标识符。以下概要描述了在请求中包含挑战令牌的一般方法。

     

当Web应用程序制定请求时(通过生成在用户提交或单击时导致请求的链接或表单),应用程序应包含一个隐藏的输入参数,其名称为" CSRFToken&# 34 ;.必须随机生成此令牌的值,以便攻击者无法猜到。考虑利用java.security.SecureRandom类为Java应用程序生成足够长的随机令牌。替代生成算法包括使用256位BASE64编码哈希。选择此生成算法的开发人员必须确保在散列的数据中使用随机性和唯一性来生成随机令牌。

<form action="/transfer.do" method="post"> <input type="hidden" name="CSRFToken" value="OWY4NmQwODE4ODRjN2Q2NTlhMmZlYWEwYzU1YWQwMTVhM2JmNGYxYjJiMGI4MjJjZDE1ZDZMGYwMGEwOA=="> … </form>

  

通常,开发人员只需为当前会话生成一次此令牌。在初始生成此令牌之后,该值将存储在会话中,并用于每个后续请求,直到会话到期为止。当最终用户发出请求时,与在会话中找到的令牌相比,服务器端组件必须验证请求中令牌的存在性和有效性。如果在请求中未找到令牌或提供的值与会话中的值不匹配,则应中止请求,重置令牌并将事件记录为正在进行的潜在CSRF攻击。

     

为了进一步增强此提议设计的安全性,请考虑随机化每个请求的CSRF令牌参数名称和/或值。实现此方法导致生成每请求令牌而不是每会话令牌。但请注意,这可能会导致可用性问题。例如,&#34; Back&#34;按钮浏览器功能经常受阻,因为前一页可能包含不再有效的令牌。与此上一页的交互将导致服务器上的CSRF误报安全事件。无论采用何种方法,都鼓励开发人员保护CSRF令牌的方式与保护经过身份验证的会话标识符的方式相同,例如使用SSLv3 / TLS。