将 json 传递给视图模型时保持安全

Posted

技术标签:

【中文标题】将 json 传递给视图模型时保持安全【英文标题】:Staying secure when passing json to view model 【发布时间】:2012-07-26 12:07:56 【问题描述】:

我决定将 knockout.js 用于我的 Web 应用程序,但对安全性有些顾虑。

数据流向如下:

用户通过 url 请求控制器 控制器收集所需信息,以 json 字符串形式发送到视图 json 字符串保存到 dom 以允许我的 javascript 代码访问它 json 被加载到 $(document).ready 内的敲除视图模型中

我的问题是用户只需单击“查看源代码”即可清楚地查看 json 字符串 这让我很担心,因为我知道这很容易在客户端更改,但我不是 完全确定其中的含义。

这里有一些示例代码来说明我的观点。一、控制器:

 function view($id = null)
 
    //other processing...

    $data = array();
    $data['json'] = $this->get_profile_json($id);
    $this->load->view('profile_page',$data);
 

个人资料页面视图

<script type="text/javascript">
    window.profile_json = "<?php echo $json; ?>";
</script>
<script type="text/javascript" src="<?php echo site_url('assets/js/profile_page.js'); ?>"></script>
<!-- The profile page below... -->

个人资料页面 javascript

var vm = new ViewModel(profile_json); //load the json into view model
ko.applyBindings(vm);

现在我知道我可以通过之前从 javascript 代码中加载 json 来实现相同的目标 创建视图模型,例如使用$.getJSON

但是,在浏览器上安装了开发者工具扩展程序的人也可以看到(并且可能进行编辑?) 这个数据也是。这是一个特殊的问题,其中一些数据包含权限标志等内容 等等。

我的问题是,您如何确保传递给您的视图模型的数据不会被篡改?

【问题讨论】:

你永远无法避免这个问题。 这就是我的想法,但我希望我错了:) 【参考方案1】:

没有办法从客户端保证您的信息的安全。这就是为什么对信息进行服务器端检查总是很重要的原因,然后发回您对信息是否可用的响应。

对于某些安全检查,您应该使用以下内容:

1) Strip_tags($_POST['key'])
2) Check to see if the value is numeric (if its a number)
3) Check to see if it only has alphabet and numbers (if this is all that's allowed)
...and so on

要传递到后端的客户端信息总是可以被篡改,这就是为什么尽可能锁定它很重要,如果任何信息似乎无效,那么你应该立即抛出给客户一个错误并要求他们再试一次:)

假设后端数据是安全的,那么前端数据应该永远不会有问题。

希望这会有所帮助!

【讨论】:

我不确定这是否有助于我将 json 中的一些标志(如 LoggedIn: true)传递给视图模型。在这种情况下,如果登录,视图模型将启用 UI 中的某些元素。如果有人可以更改该值,那么它将破坏 UI... 当然,我总是在服务器端仔细检查诸如用户登录之类的事情,所以唯一的问题是黑客的用户界面损坏......可能不值得担心!跨度> 没错,只要他们不能通过传递无效数据来破坏后端,那么你就不管他们对他们的客户端(UI)做了什么,他们可以让它变得彩虹和pokadots,只有他们能看到,所以谁在乎:) 你提到@peacemaker的问题是为什么你经常在uris、查询字符串和变量中看到长的、看起来像乱码的字符串;为每个登录的会话提供一个伪随机标识符,以向服务器标识自己,使用 https 进行所有通信,您不必担心有人能够启用他们的部分 ui;服务器仍然不受他们的虚假查询的影响。

以上是关于将 json 传递给视图模型时保持安全的主要内容,如果未能解决你的问题,请参考以下文章

MVC 4如何将模型属性列表从视图传递给Action

将模型传递给 ASP.NET Core MVC 中的视图

如何将 MVC 模型传递给 UI 引导模式

将 knockoutjs 视图模型传递给多个 ajax 调用

在 MVC 5 中,如何将表对象数据作为列表传递给控制器​​视图模型?

Django - 将模型名称从 url 传递给视图