jQuery を介して JSON 形式のデータを取得しており、それをユーザーに表示する必要がありますが、XSS 攻撃に対して脆弱です。ここでのオプションは何ですか? データをデータベースに入れる前に文字を削除する必要がありますか? 私が使用しているフレームワーク(Kohana)には気の利いた機能HTML::Chars();
がありますが、javascriptでデータを表示しているため、そこでは使用できません。
1つのオプションは、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);
}
});