1

我正在为教师和学生开发一个材料交换网站。该材料是机密的,因为它是我们的,我们不希望其他教官窃取它。另一方面,它没有个人或敏感信息,因此安全性不是一个大问题。如果你偷了我的语法练习,我不会起诉你。我在 Codeigniter 框架中使用 Ion Auth,对此我很满意。我使用 YUI 2.8 来显示可编辑的数据表和可编辑的树。基于 Codeigniter MVC 框架,我有一个控制器来处理 Ajax 请求。当我通过 YUI Connection 类发布请求时,我传递了一个称为data唯一参数的序列化对象,该参数来自通过将配置对象传递给客户端组装的 JSON 对象,YAHOO.si.factory.Method如下所示:

addTreeNode: new YAHOO.si.factory.Method({
    className: "instructors_model",
    methodName: "add_exercise_tree_node",
    key: "id",
    mode: "child",
    fields: ['n0', 'n1','n2', 'n3'],
    params: [{
        key: "nodeData",
        name: "nodeData",
        type: "text",
        direction: "IN",
        value: "34"
    },{
        key: "name",
        name: "name",
        type: "text",
        direction: "IN",
        value: "Grammar"
    }],
    success: "You have successfully added a node to the tree."      
}),

控制器解析由 组装的 JSON 字符串,YAHOO.si.factory.Method并确定它必须调用add_exercise_tree_nodeinstructors_model传递 2 个参数。该add_exercise_tree_node方法在数据库上执行脏工作,并希望返回成功消息。如果是这样,则在客户端显示成功消息,并更新树以包含新节点。

我的问题是,我是否在这个纯文本查询字符串中泄露了太多关于服务器的信息?这是一个帖子,因此它不会出现在 URL 中,但当然它在诸如 Firebug 控制台之类的东西中是完全可见的。

当然,这个问题背后的问题是,对于在 MVC 框架中分配 Ajax 的责任,你们那里的安全专家有什么建议?我希望只有一个控制器负责处理 Ajax 请求的可管理性,所以我最终在客户端出现了一个稍微复杂(而且不安全?)的重载。您对此有何建议?

4

1 回答 1

6

我在评论中的主张是,您违背了 MVC 范式中 RESTful 架构的目的,主要是关注“所有 AJAX 调用都转到一个控制器”。所以让我们把它分解成可用的东西,然后重建我们对为什么/如何的理解。

REST 只是表示代表性状态传输,但这不是我们所说的 REST 或 RESTful的意思。我们的意思是我们希望每个 URL 代表一种资源,并且我们使用动词来指示我们对每个请求所做的事情。所以“GET”、“POST”、“PUT”等都有一个目的,我们使用这个目的来决定我们如何与各个资源进行交互。

所以让我们把它放在眼里,让我们做点什么;考虑一个 HR 应用程序(这是人们采用的那些简单的应用程序之一)。我们有人员和部门。部门有一个 ID、一个名称和一个经理(他是一个人)。人们有一个 ID、一个姓名、一个经理(在我们的系统中可能是 -1 表示没有经理,或一个人的 ID)和一个电话号码。

当我们 HTTP GET http://server.domain/app/Person时,我们会得到一个所有人的目录,其中包含他们的姓名和 ID。

[ {Name: "Cole Brand", ID: 1}, {Name: "user341180", ID: 2} ]

当我们 HTTP GET http://server.domain/app/Person/1我们得到

{ Name: "Cole Brand", ID: 1, Manager: -1, "Phone Number": "222-555-1234" }

当我们 HTTP GET http://server.domain/app/Person/2我们得到

{ Name: "user341180", ID: 2, Manager: 1, "Phone Number": "222-555-6789" }

为了完整起见,列出部门列表:

HTTP GET http://server.domain/app/Department/

{ Name: "HR", Manager: 1 }

现在显然,我的示例有点枯燥,因为例如,员工肯定在一个部门工作,但我没有通过他们的个人资料将他们与该部门相关联。数据库肯定会跟踪它,但我们这里没有。这是一个简单的例子。

所以你可以从这里看到没有返回 HTML。我们将回到这一点。

对于下一部分,请注意我一直在使用 HTTP GET。如果我们使用 HTTP POST 会怎样?这意味着无论我们通过什么,都会覆盖该数据。所以让我举一个简单的例子:

HTTP POST http://server.domain/app/Person/2

send this data in the post body { Manager: -1, "Phone Number": "222-555-0089" }
get nothing in response (we could return the object, but my API doesn't for whatever reason, call it a specification deficiency)

当我们 HTTP GET http://server.domain/app/Person/2我们现在得到

{ Name: "user341180", ID: 2, Manager: -1, "Phone Number": "222-555-0089" }

看看我们如何使用 HTTP POST 来更新记录?这就是我们使用 RESTful 方法的方式,我们使用动词来表示动作。

那么我们还能用什么来与服务器通信呢?如果我们想让 RESTful 方法既返回网页又返回数据,但使用 GET 怎么办?我们可以使用 HTTP HEADER(可能是 X-Header?)来指定我们正在进行数据调用,因此默认情况下我们向 HTTP GET http://server.domain/app/Person/1发出请求,然后我们得到一个网页。如果您想要一个示例(提供网页的休息响应),请查看我们现在所在的页面。https://stackoverflow.com/questions/11061912/<-- 实际上是由 MVC 宁静原则提供的(但我不认为他们通过这种方法提供 JSON,因为这不是他们的系统设置方式)。

所以我可能把你们都搞砸了,我只是想回顾一下 REST,以及我们今天如何将它用于 MVC 目的。让我们再看看其中的一部分,我们做http://server.domain/app/Person的部分

在 MVC 术语中,这意味着我们的应用程序中有一个 Person 控制器。对 Person 控制器发出的任何请求都将首先根据其动词类型进行路由,然后是任何其他参数。例如,提交此答案会发布到https://stackoverflow.com/questions/11061912/answer/submit. 所以控制器知道它期望收到“发布 ID”(所以它知道答案所属的父级),“答案”告诉它我正在添加一个答案,然后“提交”它知道我是什么正在做。如果我正在编辑,它将是编辑提交而不是回答/提交。

好的,所以我觉得我让事情变得混乱了,我不知道您是否阅读了我在节点和一般 MVC 上的回答:模型如何与视图相关联?但让我澄清一下:控制器是一个路由设备,用于接收输入,将其发送到适当的模型,然后呈现一些视图(HTML、JSON、XML、纯文本等)。请注意,不需要渲染视图(还记得我在 HTTP POST 上没有返回任何内容的糟糕 API 吗?)。

因此,现在我们谈到了我之前在回复中试图表达的观点,但我仍然不够清楚。当您从“适当的资源”(在这篇文章 /question/ 中)移动方法时,您打破了一个 URL 根是一个资源的想法。哦,我把这一切都搞砸了不是吗?

在 REST 原则中,每个 URL 根是一个资源。您可以从该资源中执行操作,例如根据一些数据呈现某个视图,或者您可以使用某个动词添加/修改数据,或者如果这是您的风格,您可以制作烙饼。但是所有 Person 将始终位于http://server.domain/app/Person,而不是“有些人命令在http://server.domain/app/Person上,有些人命令在http://server 上。 domain/app/Department ”,因为那样你就会举起双臂然后去“我怎么知道在哪里可以找到人们的行动?!?!”

简而言之,这就是为什么您不想在一个控制器上放置一些用于访问数据的方法(呈现视图)以及在另一个控制器(JSON)上为相同的资源类型放置一些用于访问数据的方法。


既然我已经把所有的脑残都放到了一个帖子中,我对哪些部分感到困惑?随意编辑帖子并插入一些**what do you mean here?****you seem to be jumping around on this point a lot**任何您认为合适的内容。

于 2012-06-16T11:20:01.673 回答