我有一个解决方案(见下文),但它很笨拙而且很笨拙我想听听其他人如何解决这个问题。
这是一个简单的例子来说明问题:
想象一下,我有一个雄辩的User
模型,我正在整理一个“编辑用户”页面,该页面使用Knockout处理从值到DOM元素的绑定。
在我的本页控制器方法中,我正在执行以下操作:
public function getEditUser($id = null)
{
return View::make("account.edituser")
->with("user", User::find($id))
->with("groups", Group::all());
}
Group
模型适用于我的访问控制组。用户可以是零个或多个组的成员,并且以正常方式为Eloquent模型建立关系。
在模板中,我有一些元素(文本,选择,单选按钮等)设置了data-bind
属性,以将我的Knockout视图模型绑定到元素。
在页面的<script>
部分,我有以下内容:
var createUserViewModel = function (user, groups) {
return {
id: ko.observable(user.id),
name: ko.observable(user.name),
groups: ko.observableArray(user.groups),
// ...other attributes go here
// the list of available groups
availableGroups: ko.observableArray(groups)
};
};
// instantiate the view model
var viewModel = createUserViewModel(
// note that I'm using Smarty for my templating system. The
// lines below apply the json_encode method and disable the
// htmlspecialchars function which I have set up to encode
// all output by default
{$user|json_encode nofilter},
{$groups|json_encode nofilter}
);
ko.applyBindings(viewModel);
user
函数的createUserViewModel
参数将采用JSON编码,因此它将如下所示:{ id: 1234, name: "Joe Smith", groups: ['group1', 'group2'], ...}
这是一个简单的例子:我有几种表格可以输入比这更复杂的其他信息。
这有几个问题:
正如我所说,这很尴尬。对于较大的模型,由此产生的源难以阅读。
我怀疑这里有一个XSS漏洞,因为我通过json_encode
将数据直接回显到脚本元素的主体中。我无法利用这一点,但我认为其他人可以找到方法。
但我想不出另一种方法,它不会从根本上改变应用程序的工作方式(即使用AJAX调用来检索数据)。
有人可以分享更好的方法吗?
答案 0 :(得分:1)
Re(1)你需要查看非常有用的映射,它正是为此而设计的 - http://knockoutjs.com/documentation/plugins-mapping.html ...这将替换你的createUserViewModel函数,并且你不必手动转动JSON对象进入可观察的东西。
Re(2)我对安全性和XSS不够专业,无法给出权威的答案,但对我来说看起来还不错。只要在存储用户和组数据之前对其进行了清理,就可以将其作为JSON回显。如果您没有为用户输入文本框或其他输入,那么会影响这些数据,那么攻击者就无法注入恶意脚本。加上JSON编码本身是一个很好的消毒,因为任何JavaScript都会以字符串形式结束。所以,确定,给出:
Oauth2ClientContext
将打印出一些JSON,你可以立即尝试JSON.parse:
OAuth2RestTemplate.createRequest(URI uri, HttpMethod method)
然后再在脚本中对它进行任何操作。