- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
Ruby On Rails 框架包含一些功能,可让您轻松构建公开网络服务 API 的服务器应用程序。例如, Controller 执行以下操作:
respond_to :html, :json, :xml
def show
@thing = Thing.find(params[:id])
respond_with @thing
end
...将为两个网络浏览器处理“显示”操作,返回 HTML,并且还将项目“@thing”呈现为 JSON 或 XML 以用于指定此数据格式的请求。
在此特定示例中,基于 GET 的“显示”操作不涉及任何特殊安全措施。现在考虑与上述类似的情况,但对于诸如“创建”或“更新”之类的操作 - 由(模拟)PUT 或(实际)POST 请求激活的事物。现在 CSRF 保护开始发挥作用。
遗憾的是,Rails 似乎只设计用于处理来自同一域网页中执行的 JavaScript 代码的“API 调用”(用于非 HTML 格式响应),适用于任何可能为 Web 浏览器提供 HTML 内容的 Controller 客户端,其中 CSRF 保护是强制性的。 JavaScript 代码可以查找 Rails 包含的神奇“元”标记,读取 CSRF token 并将其提交回 XHR 调用,在服务器上调用基于 POST 的操作或类似操作。
但是外部调用者呢?如果我们有 Rails 支持一个网站,但我们想制作一个与同一个头端对话的原生 iOS 或 Android 应用程序怎么办?该应用程序将进行服务调用 - 很好,Rails 使这很容易 - 但任何修改服务器上数据的尝试都会失败,因为我们没有 CSRF token 。 我们不能绕过 CSRF 保护,因为相同的 Controller 代码可以处理网络浏览器和“纯 API”客户端。
所有与 Rails 和 API 调用的 CSRF 问题相关的答案似乎都假定您将针对此类情况使用不同的 Controller 。但那是愚蠢的——如果它只对网页中的 JavaScript 代码有用,那么所有“让你的应用程序更容易公开为服务”的东西有什么意义,除非你在绕过 CSRF 的特殊 Controller 中复制一堆代码允许非网络客户端?这种额外的 Controller 只会增加攻击面。
有谁知道推荐的“正确”模式来处理 Rails 应用程序中的 CSRF 保护,这些应用程序的操作可能会被两种网络浏览器或非网络浏览器客户端(如 native iOS 或 Android 应用程序)“调用”?像“respond_with(...)”这样的内置东西不会做任何有用的事情,比如总是生成一个 JSON/XML 对象,其中包含 CSRF token 作为无所不在的字段。我能想到的最好的办法就是自己做,例如将“@thing”渲染为:
{
csrf: "abcdef...7890",
object: { ...JSON representation of @thing... }
}
...但这看起来有点像 hack,需要做很多工作,而且它似乎通过在每个请求上宣布最新的 token 来绕过 world+dog 的 CSRF。 一定有更好的方法:-)
最佳答案
嗯,docs 说
Turn on request forgery protection. Bear in mind that only non-GET, HTML/JavaScript requests are checked.
建议对 JSON 和 XML 回复的请求已经不会进行 csrf 检查,我想这就是您的目标?它实际上不是那样工作的吗?
你也可以覆盖 verify_authenticity_token在您的 Controller 中具有用于何时实际执行验证的自定义逻辑;这是一个非常简单的方法,调用其他实际工作方法来进行验证并在未验证时做出响应,因此您可以重写以仅在某些情况下进行验证检查,如果这是您需要的话。或者不覆盖,只需基于相同的想法编写您自己的 before_filter,并调用您自己的 before 过滤器——查看源代码,这几乎就是所有 protect_from_forgery
所做的,添加 verify_authenticity_token
作为 before_filter。不过,做这些事情中的任何一件在未来可能会也可能不会向前兼容。
啊,我看到了 note you linked to宣布对“所有 非 GET 请求”进行 CSRF 保护,所以我猜说它仅适用于 HTML 请求的文档已经过时了——但这让我想到,这是什么原因改变? (该公告没有准确记录漏洞的性质,我也没有去寻找差异)。您当然可以成功地以某种方式取消它并使 XML/JSON 请求不再检查 CSRF——但是您是否会重新引入 3.0.4 打算修补的任何漏洞,这对您的应用程序重要吗?我不知道。
关于ruby-on-rails - Rails 应用程序中的 CSRF 服务于 HTML 并为其他客户端(例如 iOS)公开 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11868713/
我是 C 语言新手,我编写了这个 C 程序,让用户输入一年中的某一天,作为返回,程序将输出月份以及该月的哪一天。该程序运行良好,但我现在想简化该程序。我知道我需要一个循环,但我不知道如何去做。这是程序
我一直在努力找出我的代码有什么问题。这个想法是创建一个小的画图程序,并有红色、绿色、蓝色和清除按钮。我有我能想到的一切让它工作,但无法弄清楚代码有什么问题。程序打开,然后立即关闭。 import ja
我想安装screen,但是接下来我应该做什么? $ brew search screen imgur-screenshot screen
我有一个在服务器端工作的 UDP 套接字应用程序。为了测试服务器端,我编写了一个简单的 python 客户端程序,它发送消息“hello world how are you”。服务器随后应接收消息,将
我有一个 shell 脚本,它运行一个 Python 程序来预处理一些数据,然后运行一个 R 程序来执行一些长时间运行的任务。我正在学习使用 Docker 并且我一直在运行 FROM r-base:l
在 Linux 中。我有一个 c 程序,它读取一个 2048 字节的文本文件作为输入。我想从 Python 脚本启动 c 程序。我希望 Python 脚本将文本字符串作为参数传递给 c 程序,而不是将
对于一个类,我被要求编写一个 VHDL 程序,该程序接受两个整数输入 A 和 B,并用 A+B 替换 A,用 A-B 替换 B。我编写了以下程序和测试平台。它完成了实现和行为语法检查,但它不会模拟。尽
module Algorithm where import System.Random import Data.Maybe import Data.List type Atom = String ty
我想找到两个以上数字的最小公倍数 求给定N个数的最小公倍数的C++程序 最佳答案 int lcm(int a, int b) { return (a/gcd(a,b))*b; } 对于gcd,请查看
这个程序有错误。谁能解决这个问题? Error is :TempRecord already defines a member called 'this' with the same paramete
当我运行下面的程序时,我在 str1 和 str2 中得到了垃圾值。所以 #include #include #include using namespace std; int main() {
这是我的作业: 一对刚出生的兔子(一公一母)被放在田里。兔子在一个月大时可以交配,因此在第二个月的月底,每对兔子都会生出两对新兔子,然后死去。 注:在第0个月,有0对兔子。第 1 个月,有 1 对兔子
我编写了一个程序,通过对字母使用 switch 命令将十进制字符串转换为十六进制,但是如果我使用 char,该程序无法正常工作!没有 switch 我无法处理 9 以上的数字。我希望你能理解我,因为我
我是 C++ 新手(虽然我有一些 C 语言经验)和 MySQL,我正在尝试制作一个从 MySQL 读取数据库的程序,我一直在关注这个 tutorial但当我尝试“构建”解决方案时出现错误。 (我正在使
仍然是一个初学者,只是尝试使用 swift 中的一些基本函数。 有人能告诉我这段代码有什么问题吗? import UIKit var guessInt: Int var randomNum = arc
我正在用 C++11 编写一个函数,它采用 constant1 + constant2 形式的表达式并将它们折叠起来。 constant1 和 constant2 存储在 std::string 中,
我用 C++ 编写了这段代码,使用运算符重载对 2 个矩阵进行加法和乘法运算。当我执行代码时,它会在第 57 行和第 59 行产生错误,非法结构操作(两行都出现相同的错误)。请解释我的错误。提前致谢:
我是 C++ 的初学者,我想编写一个简单的程序来交换字符串中的两个字符。 例如;我们输入这个字符串:“EXAMPLE”,我们给它交换这两个字符:“E”和“A”,输出应该类似于“AXEMPLA”。 我在
我需要以下代码的帮助: 声明 3 个 double 类型变量,每个代表三角形的三个边中的一个。 提示用户为第一面输入一个值,然后 将用户的输入设置为您创建的代表三角形第一条边的变量。 将最后 2 个步
我是新来的,如果问题不好请见谅 任务:将给定矩阵旋转180度 输入: 1 4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 输出: 16 15 14 13 12 11
我是一名优秀的程序员,十分优秀!