我通过 jQuery 获取一些 JSON 格式的数据,然后我需要将其显示给用户,但是它容易受到 XSS 攻击。我在这里有什么选择,我应该在将数据放入数据库之前去除字符吗?我正在使用的框架(Kohana)有一个漂亮的功能HTML::Chars();
,但由于我用 javascript 显示数据,所以我不能在那里使用它。
一种选择似乎是遍历每个被 json 编码的数组元素并应用于HTML::Chars();
它。它是唯一的选择吗,如果是这样,那么这样做的最佳方式是什么?
例子:
- 用户输入一些数据:
title, body
- 数据存储到数据库中
- 然后其他一些用户进入站点,从数据库中获取数据数组并导出为 json 格式
- 我的 jQuery 脚本正在获取 json 并将新元素附加到我的页面正文。
代码:
$(document).ready(function(){
$.ajax({
url: '/timeline/latest/1',
dataType: 'json',
success: function(data){
$.each(data, function(key, val) {
switch (val.type){
case 'post': // I have only made post so far
addPost(val);
break;
}
});
}
});
})
function addPost(val){
$('.content .timeline').prepend(val.title + '<br />' + val.body); // xss vulnerable
}
从数据库中获取数据
<?php
class Controller_Timeline extends Controller{
public function Action_Latest(){
$parentID = $this->request->param('id');
$modelTimeline = new Model_Timeline();
// Here I get latest entries, big array
$latest = $modelTimeline->Latest($parentID);
// Response it and encode with JSON
$this->response->body(json_encode($latest));
}
}
到目前为止,我的解决方案是这样的,在我回显 $latest 我遍历数组并应用反 xss 函数之前,我不知道它有多优化:
array_walk($latest, function(&$latest){
foreach ($latest as &$key){
$key = HTML::chars($key);
}
});