将 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 传递给视图模型时保持安全的主要内容,如果未能解决你的问题,请参考以下文章
将 knockoutjs 视图模型传递给多个 ajax 调用