簡體   English   中英

向用戶顯示json時的XSS

[英]XSS when displaying json to users

我通過jQuery獲取JSON格式的一些數據,然后需要將其顯示給用戶,但是它容易受到XSS攻擊。 我在這里有什么選擇,在將數據放入數據庫之前應該去除字符嗎? 我正在使用的框架(Kohana)有一個漂亮的函數HTML::Chars(); ,但由於我使用javascript顯示數據,因此無法在其中使用它。

一種選擇似乎是遍歷所有經過json編碼的數組元素,並應用HTML::Chars(); 對此。 這是唯一的選擇嗎?如果可以,那么這樣做的最佳方式是什么?

例:

  1. 用戶輸入一些數據: title, body
  2. 數據存儲到數據庫中
  3. 然后其他用戶進入站點,數據數組從數據庫中獲取並導出為json格式
  4. 我的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並遍歷數組並應用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>編碼為&lt;a&gt; 因此,如果您打算在用戶頁面上使用html,則不合適(您必須將其重新變回可用的html,這樣就多余了)。

在這種情況下,沒有簡單的答案-這取決於您處理的是哪種html? 如果它只是像<em> <p> <strong> ,則應嚴格解析html服務器端,並檢查它僅包含這些內容,並拒絕或刪除任何危險的內容,例如<script> 不過,它更復雜,因為您還必須對元素屬性(例如onClick =“做不好的事情”)感到厭倦。

總而言之,在使用PHP發送JSON之前先對HTML進行清理,這是最好的代表: http : //htmlpurifier.org/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM