Dav*_*ogo 1 javascript security yui json
我正在为教师和学生建立材料交换网站.这些材料是保密的,因为它是我们的,我们不希望其他教师窃取它.另一方面,它没有个人或敏感信息,因此安全性不是一个大问题.如果你偷我的语法练习,我不会起诉你.我在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."
}),
Run Code Online (Sandbox Code Playgroud)
所述控制器解析由组装JSON字符串YAHOO.si.factory.Method和计算出它必须调用add_exercise_tree_node的instructors_model,并通过2个参数.该add_exercise_tree_node方法对数据库执行脏工作,并希望返回成功消息.如果是,则在客户端显示成功消息,并更新树以包括新节点.
我的问题是,我是否在这个纯文本查询字符串中泄露了太多关于服务器的信息?这是一个帖子,所以它不会出现在URL中,但当然它在Firebug控制台之类的东西中是完全可见的.
这个问题背后的问题当然是你的安全专家在MVC框架中建议如何分配Ajax的责任?我希望只有一个控制器负责处理Ajax请求的可管理性,所以我最终在客户端稍微复杂(并且不安全?)重载.你对此有何建议?
我在评论中的主张是你在MVC范例中击败了RESTful架构的目的,主要是关注"所有AJAX调用转到一个控制器".因此,让我们把它拆成可用的东西,然后重建我们对原因/方法的理解.
REST只是意味着REpresentational State Transfer,但这并不是我们说REST或RESTful时的意思.我们的意思是我们打算每个URL表示一种资源,我们使用动词来表示我们对每个请求做了什么.所以"GET","POST","PUT"等都有目的,我们用这个目的决定我们如何与个人资源互动.
所以让我们把它放到透视中,让我们用它做点什么; 考虑一个HR应用程序(这是人们采用的那些简单的应用程序之一).我们有人和部门.部门有ID,名称和经理(谁是人).人们有一个ID,一个名字,一个经理(在我们的系统中可能是-1表示没有经理,或者是一个人的ID)和一个电话号码.
当我们HTTP HTTP GET http://server.domain/app/Person时,我们得到一个所有人的目录,它给我们他们的名字和ID.
[ {Name: "Cole Brand", ID: 1}, {Name: "user341180", ID: 2} ]
Run Code Online (Sandbox Code Playgroud)
当我们HTTP HTTP GET http://server.domain/app/Person/1时,我们得到了
{ Name: "Cole Brand", ID: 1, Manager: -1, "Phone Number": "222-555-1234" }
Run Code Online (Sandbox Code Playgroud)
当我们HTTP HTTP GET http://server.domain/app/Person/2时,我们得到了
{ Name: "user341180", ID: 2, Manager: 1, "Phone Number": "222-555-6789" }
Run Code Online (Sandbox Code Playgroud)
只是为了完整起见,一系列部门:
HTTP GET http://server.domain/app/Department/
{ Name: "HR", Manager: 1 }
Run Code Online (Sandbox Code Playgroud)
显然,我的例子有点干,因为例如,员工肯定在一个部门工作,但我没有通过他们的个人资料与他们联系.当然数据库会跟踪它,但我们在这里没有.这是一个简单的例子.
因此,您可以从中看到没有返回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)
Run Code Online (Sandbox Code Playgroud)
当我们HTTP HTTP GET http://server.domain/app/Person/2时,我们现在得到了
{ Name: "user341180", ID: 2, Manager: -1, "Phone Number": "222-555-0089" }
Run Code Online (Sandbox Code Playgroud)
看看我们如何使用HTTP POST来更新记录?这就是我们使用RESTful方法的方式,我们使用动词来表示动作.
那么我们还可以用什么来与服务器进行通信?如果我们想让RESTful方法返回网页和数据,但是对于GET,该怎么办?我们可以使用一个HTTP头,确定,我们正在做一个数据呼叫,因此默认情况下我们对HTTP GET请求(也许一个X标头?)HTTP://server.domain/app/Person/1我们得到一个网页.如果你想要一个例子(提供网页的休息响应),请检查我们现在所在的页面.https://stackoverflow.com/questions/11061912/< - 实际上是由MVC restful原则提供的(但我不认为他们通过这种方法提供JSON,因为这不是他们的系统设置方式).
所以我可能会争分夺秒,我只想回顾一下REST,以及我们今天如何使用它来实现MVC目的.让我们再看看它的一部分,我们做的部分http://server.domain/app/Person
在MVC术语中,这意味着我们的应用程序中有一个Person控制器.对Person控制器发出的任何请求将首先根据其动词类型进行路由,然后根据其他任何附加参数进行路由.例如,提交此答案会发布帖子https://stackoverflow.com/questions/11061912/answer/submit.因此,控制器知道它希望收到"帖子ID"(因此它知道答案所属的父母),"回答"告诉它我正在添加一个答案,并"提交"所以它知道我是什么这样做.如果我正在编辑它将是一个编辑提交而不是回答/提交.
好吧,所以我觉得我让事情搞得一团糟,我不知道你是否在节点和一般情况下阅读了关于MVC的答案:模型如何与视图相关联?但让我澄清一下:Controller是一个路由设备,用于获取输入,将其发送到适当的模型,然后呈现一些视图(HTML,JSON,XML,纯文本等).请注意,渲染视图不是必需的(还记得我的糟糕的API在HTTP POST上没有返回任何内容吗?).
所以现在我们在早些时候的回复中找到了我想要得到的东西,我仍然不够清楚.当你从"适当的资源"(在这篇文章/问题/的情况下)移动方法时,你会打破一个URL根是一个资源的想法.哦,我已经搞砸了这一切,不是吗?
在REST原则中,每个URL根是一个资源.您可以从该资源执行操作,例如基于某些数据渲染某个视图,或者您可以使用某个动词添加/修改数据,或者如果这是您的风格,您可以制作烙饼.但是所有Person将始终位于http://server.domain/app/Person,而不是"某些人命令位于http://server.domain/app/Person,而某些人命令位于http:// server.域/ app /部门 "因为那时你只是将你的手臂放在空中然后去"我怎么知道在哪里找人行动?!?!"
简而言之,这就是为什么你不想在一个控制器(渲染视图)上放置一些访问数据的方法,以及为同一资源类型访问另一个控制器(JSON)上的数据的一些方法.
现在我把所有的braindump放到了一个帖子里,哪些部分我模糊了?随意编辑文章并插入一些**what do you mean here?**或**you seem to be jumping around on this point a lot**或任何你认为合适的.