我需要能夠安全地在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
我假設出現了錯誤的編碼/解碼過程...
好的,好點。這解決了消毒問題。任何想法爲什麼特殊字符如★會顯示爲%u2605。我想我可以在顯示前使用PHP解碼,但我擔心這會讓用戶偷偷進入< and > – makeee 2010-07-03 01:33:52
這可能是因爲瀏覽器在將POST數據發送到服務器之前對其進行了編碼。你應該用PHP解碼它,*然後*轉義'<' and '>',最後做一個MySQL轉義並將其存儲在數據庫中。檢索時,您只需顯示文本。 – casablanca 2010-07-03 01:55:00