[英]XSS when displaying json to users
我通過jQuery獲取JSON格式的一些數據,然后需要將其顯示給用戶,但是它容易受到XSS攻擊。 我在這里有什么選擇,在將數據放入數據庫之前應該去除字符嗎? 我正在使用的框架(Kohana)有一個漂亮的函數HTML::Chars();
,但由於我使用javascript顯示數據,因此無法在其中使用它。
一種選擇似乎是遍歷所有經過json編碼的數組元素,並應用HTML::Chars();
對此。 這是唯一的選擇嗎?如果可以,那么這樣做的最佳方式是什么?
例:
title, body
碼:
$(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並遍歷數組並應用anti-xss函數之前,我不知道它的最佳狀態:
array_walk($latest, function(&$latest){
foreach ($latest as &$key){
$key = HTML::chars($key);
}
});
我建議您像Drupal一樣做。
Drupal不過濾任何輸入。 如果要顯示此HTML代碼而不進行過濾,它將帶有XSS漏洞的文本存儲在數據庫中。
而是對輸出進行過濾。 您絕對應該在服務器端執行此操作。
您應該從Drupal使用的filter_xss()
函數啟發自己。
確保將其應用於您的每個條目。 如果可以,請在全局范圍內進行操作,如下所示:
// In the Model_Timeline class
public function Latest( $id ) {
// Get your array, and then
foreach ( $array as $entry ) {
// Filter each entry
// I use $util->filter_xss but use it how you implemented it
$entry = $util->filter_xss( $entry );
}
// And return the filtered array
return $array;
}
在將mysql_real_escape_string存儲在數據庫中之前,應先調用它,htmlspecialchars是可選的。 您的問題是,您不想只向用戶顯示html,因此htmlspecialchars不能工作,因為它會將<a>
編碼為<a>
因此,如果您打算在用戶頁面上使用html,則不合適(您必須將其重新變回可用的html,這樣就多余了)。
在這種情況下,沒有簡單的答案-這取決於您處理的是哪種html? 如果它只是像<em>
<p>
<strong>
,則應嚴格解析html服務器端,並檢查它僅包含這些內容,並拒絕或刪除任何危險的內容,例如<script>
。 不過,它更復雜,因為您還必須對元素屬性(例如onClick =“做不好的事情”)感到厭倦。
總而言之,在使用PHP發送JSON之前先對HTML進行清理,這是最好的代表: http : //htmlpurifier.org/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.