2010-07-03 94 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

相关问题