首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保护API免受CSRF攻击?

保护API免受CSRF攻击?
EN

Stack Overflow用户
提问于 2014-08-03 22:53:35
回答 1查看 165关注 0票数 1

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

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

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

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

EN

回答 1

Stack Overflow用户

发布于 2014-08-04 23:08:22

您将需要使用Synchronizer Token。我不认为我能比OWASP说得更好:

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

当Web应用程序形成请求时(通过生成一个链接或表单,当用户提交或单击时,该链接或表单会导致请求),应用程序应该包含一个具有通用名称的隐藏输入参数,比如"CSRFToken“。此令牌的值必须是随机生成的,这样攻击者就无法猜到它。考虑利用Java应用程序的java.security.SecureRandom类来生成足够长的随机令牌。可选的生成算法包括使用256位BASE64编码的散列。选择此生成算法的开发人员必须确保在用于生成随机令牌的散列数据中存在随机性和唯一性。

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25105875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档