我需要能够安全地在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