English 中文(简体)
CSRF攻击是否适用于APIs?
原标题:Do CSRF attacks apply to API s?

我在写一个Django Restful API 来支持一个iOS应用程序, 每当我写出处理 POST 请求的方法时, 我总是跑到Django s CSRF 保护处。

我的理解是,由iOS管理的 cookie 不为应用程序所共享, 这意味着我的会话 cookie 是安全的, 没有其它应用程序可以骑在它们上。 这是真的吗? 如果是这样的话, 我可以将我所有的 API 功能标记为 CSRF 豁免吗?

最佳回答

这不是CSRF保护的目的。 CSRF保护的目的是为了防止将数据直接张贴到您的网站,换句话说,客户必须实际通过核准的path 发布,即查看表格页面,填写表格,提交数据。

API基本上排除了CSRF,因为其全部目的一般是allow 3缔约方实体访问和操作您网站上的数据(CSRF中的“交叉站点”)。所以,是的,我认为,一般来说,任何API观点都应该豁免CSRF。然而,你应该仍然遵循最佳做法,并保护每一个API-端点,这些端点实际上以某种认证形式(如OAuth)发生变化。

问题回答

CSRF 攻击依赖于将所有请求默示发送到特定域的 cookie 。 如果您的 API 端点不允许基于 cookie 的认证, 您应该表现良好 。

即使您确实使用基于 cookie 的认证, 您的 cookie 也是安全的, 因为 < href=" https:// stackoverflow.com/ questions/36719199/ does- nshttpcookies storageage-persist- across- apps" > iOS 应用程序并不共享 cookies 。 但是, 除非您有意通过要求异常用户代理头来屏蔽网络浏览器, 否则, 另一方可以建立一个基于浏览器的应用程序, 使用您的 API, 如果您的 API 支持基于 cookie 的认证, 并且不应用 CSRF 保护, 则该应用程序将易受 CSRF 攻击 。

若您还使用自己的 API 支持网站, 则使用该软件。

在这种情况下,你仍然需要某种形式的CSRF保护,以防止有人将请求嵌入其他网站,对经认证的用户账户产生驾车影响。

铬似乎默认地拒绝交叉来源的 PST 请求( 其他浏览器可能不那么严格), 但允许交叉来源请求, 所以您必须保证您的 API 中的任何请求不会产生副作用 。

目前接受的答案(2012年5月)大部分是正确的,但使用会话验证时除外。同样值得一提的是COSRS 的作用。

简单的设想是您访问 foo.com , 网站执行 JavaScript, 请求 AJAX 以 DELETE 为基础的 DELETE 请求 < code> api.com/user/ 123 , 最终代表您删除用户。 现在,由于 CORS, 这并不总是可能的 -- 浏览器将防止 < code> foo.com 请求 < code> api.com 除非 < code> api.com 明确白色列表 < code> < foo.com 。

这也假设您正在对您的 API 使用 < em> session 认证 而非 < em> tooken 认证 。 在基于会话的认证中,任何登录到 < code> api. com 的用户都可以在仍然登录时执行请求。 如果您有基于象征性的认证( 每项请求都必须用包含验证符号的 HTTP < code> Authorization 信头来撰写), 那么您是安全的。 基于会话的认证会通过 cookie 暗中发送验证符号 。

略为糟糕的情景是,如果您信任的 CORS 域名中有一个域名被破坏 — — 假设您有一个表格, 它不会净化 JavaScript, 用户也可以通过该表格将 JUS 输入您的网站。 如果您使用会话验证, 访问该页面的认证用户将会看到 JavaScript 运行并提出 API 请求。 如果您使用会话验证 API, 这可能会是灾难性的, 并且是一个非常真实的可能性 。

根据DRF文件, API很容易受到CSRF攻击,只要服务器使用经认证的会话(而不是每次询问密码)

解决办法是

  1. Ensure that the safe HTTP operations, such as GET, HEAD and OPTIONS cannot be used to alter any server-side state.
  2. Ensure that any unsafe HTTP operations, such as POST, PUT, PATCH and DELETE, always require a valid CSRF token.




相关问题
Can Django models use MySQL functions?

Is there a way to force Django models to pass a field to a MySQL function every time the model data is read or loaded? To clarify what I mean in SQL, I want the Django model to produce something like ...

An enterprise scheduler for python (like quartz)

I am looking for an enterprise tasks scheduler for python, like quartz is for Java. Requirements: Persistent: if the process restarts or the machine restarts, then all the jobs must stay there and ...

How to remove unique, then duplicate dictionaries in a list?

Given the following list that contains some duplicate and some unique dictionaries, what is the best method to remove unique dictionaries first, then reduce the duplicate dictionaries to single ...

What is suggested seed value to use with random.seed()?

Simple enough question: I m using python random module to generate random integers. I want to know what is the suggested value to use with the random.seed() function? Currently I am letting this ...

How can I make the PyDev editor selectively ignore errors?

I m using PyDev under Eclipse to write some Jython code. I ve got numerous instances where I need to do something like this: import com.work.project.component.client.Interface.ISubInterface as ...

How do I profile `paster serve` s startup time?

Python s paster serve app.ini is taking longer than I would like to be ready for the first request. I know how to profile requests with middleware, but how do I profile the initialization time? I ...

Pragmatically adding give-aways/freebies to an online store

Our business currently has an online store and recently we ve been offering free specials to our customers. Right now, we simply display the special and give the buyer a notice stating we will add the ...

Converting Dictionary to List? [duplicate]

I m trying to convert a Python dictionary into a Python list, in order to perform some calculations. #My dictionary dict = {} dict[ Capital ]="London" dict[ Food ]="Fish&Chips" dict[ 2012 ]="...

热门标签