2012-04-26 43 views
0

我通過jQuery獲取JSON格式的一些數據,然後我需要將它顯示給用戶,但是它容易受到XSS攻擊。我在這裏有什麼選擇,我應該在將數據放入數據庫之前去掉字符嗎?我正在使用的框架(Kohana)有一個漂亮的功能HTML::Chars();,但因爲我用javascript顯示數據,所以我無法在那裏使用它。XSS向用戶顯示json時

一個選項似乎是通過數組元素被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)); 
    } 
} 

我的解決辦法,到目前爲止是這樣的,之前我回聲出$最新的I通過陣列走,並應用抗XSS功能,但我不知道它有多優化:

array_walk($latest, function(&$latest){ 
    foreach ($latest as &$key){ 
     $key = HTML::chars($key); 
    } 
}); 
+0

如何是易受XSS攻擊? – 2012-04-26 10:47:26

+0

如果我輸入JavaScript,它會執行它。例如:我在body字段中輸入'',它會在頁面上發出警報 – sed 2012-04-26 10:52:11

+0

哦,我明白你的意思了,讓我給你寫信回答 – 2012-04-26 10:53:55

回答

1

我建議你像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; 
} 
0

存儲在數據庫中之前,您應該調用mysql_real_escape_string,用htmlspecialchars是可選的。你的問題是你不想只顯示HTML給用戶,所以htmlspecialchars將無法正常工作,因爲它編碼的東西,如<a>&lt;a&gt;,所以它是不適合,如果你打算在用戶頁面上使用HTML你將不得不把它重新變成可用的html,所以它會是多餘的)。

在這種情況下,沒有簡單的答案 - 它取決於你處理的是什麼樣的html?如果它是純粹的表象<em><p><strong>你應該嚴格解析html服務器端,並檢查它只有這些東西,並拒絕或刪除任何危險的東西,如<script>。這是更復雜的,但因爲你也必須疲倦於像onClick =「do something bad」這樣的元素屬性中的javascript。

綜上所述,淨化你發送的HTML用PHP JSON之前,這個擁有最好的代表:http://htmlpurifier.org/

+0

不需要'mysql_real_escape_string();'因爲它可以防止SQLInjection,因爲我使用的是NoSQL,所以不可能在我的網站上執行sql注入。 – sed 2012-04-26 11:12:43