2010-07-03 90 views
0

我需要能夠安全地在DOM中顯示用戶輸入的文本,我目前使用下面的JS來做到這一點(它限制接受什麼字符)。清理用戶輸入顯示並允許所有字符?

但是,現在我想允許所有字符。我怎樣才能接受所有的角色,但是要對它們進行編碼,以便用戶不能執行腳本或做任何不好的事情。

function displayUserInput() { 
    var status = $('#text_input').val(); 
    status = stripName(status); 
    $.ajax({ type: 'POST', url: "api.php?status="+escape(status), success: function(data){ 
      // success 
    }}); 
} 

function stripName(name) { 
    var new_name = new String(name); 
    new_name = new_name.replace(/[^a-zA-Z0-9:\(\/\)\s\.,!~-]/g, ''); 
    return new_name; 
} 

在PHP端的我的用戶輸入的文本保存到數據庫之前,使用下面的代碼:

$status_message = $_REQUEST['status']; 
    $status_message = preg_replace("/[^a-zA-Z0-9:\(\/\)\s\.,!~-]/", "", $status_message); 
    $status_message = mysql_real_escape_string($status_message); 

看來,我目前的方法進行消毒輸入很好,但我想接受完整的字符集。此外,我看到了一些問題,比如一個用戶輸入的文本塊被顯示爲:

u0627u0644u0644u0647 u0627u0643u0628u0631u0645u0646 u0627u0645u0631u064Au0643u0627 

我假設出現了錯誤的編碼/解碼過程...

回答

2

爲了使數據可安全地在頁面上顯示,您只需要轉義<>,並分別用&lt;&gt;替換它們。當保存到數據庫時,MySQL像往常一樣轉義。我不明白你爲什麼需要現在所有的正則表達式。

+1

好的,好點。這解決了消毒問題。任何想法爲什麼特殊字符如★會顯示爲%u2605。我想我可以在顯示前使用PHP解碼,但我擔心這會讓用戶偷偷進入< and > – makeee 2010-07-03 01:33:52

+0

這可能是因爲瀏覽器在將POST數據發送到服務器之前對其進行了編碼。你應該用PHP解碼它,*然後*轉義'<' and '>',最後做一個MySQL轉義並將其存儲在數據庫中。檢索時,您只需顯示文本。 – casablanca 2010-07-03 01:55:00

1

我知道這個帖子已經過時並且不活躍,但我的理解是隻是轉義「<」和「>」是不夠的。它甚至不足以逃脫五個主要的HTML字符。詳情請參閱http://wonko.com/post/html-escaping

相關問題