0

我正在考虑为我的网站使用 nicedit (http://nicedit.com/)。

我假设 nicedit 只是使用按钮创建简单的 html,并且当用户保存它时会发送该 html。

  1. 推荐吗?有人还在研究它吗?
  2. 假设我稍后在我的站点中的某个地方显示此 HTML,由于用户能够植入恶意 javascript,这不是很危险吗?如果没有,nicedit 如何防止这种情况发生?
  3. 另外,当我稍后显示这个 HTML 时,它会受到我的 css 的影响吗?如果是这样,我该如何防止这种情况?

谢谢。

4

2 回答 2

0

这就是我使用它的魅力,它可以在进入数据库之前清除 nicedit 实例的内容

function cleanFromEditor($text) { 

    //try to decode html before we clean it then we submit to database
    $text = stripslashes(html_entity_decode($text));

    //clean out tags that we don't want in the text
    $text = strip_tags($text,'<p><div><strong><em><ul><ol><li><u><blockquote><br><sub><img><a><h1><h2><h3><span><b>');

    //conversion elements
    $conversion = array(
        '<br>'=>'<br />',
        '<b>'=>'<strong>',
        '</b>'=>'</strong>',
        '<i>'=>'<em>',
        '</i>'=>'</em>'
    );

    //clean up the old html with new
    foreach($conversion as $old=>$new){
        $text = str_replace($old, $new, $text);
    }   

    return htmlentities(mysql_real_escape_string($text));
} 
于 2011-12-31T05:53:56.680 回答
0
  1. 它似乎不再维护了。但我将它用于只需要一个简单/轻量级的所见即所得编辑器的目的。如果您正在寻找能够获得持续核心更新或附加功能的东西,我不会指望它。我终于崩溃了,写了很多我自己的功能,比如表格和 YouTube 视频。

  2. 是的,黑客可以使用它在您的站点上发布客户端和/或服务器漏洞。但这是任何编辑器都可能面临的威胁。您需要过滤两种方法的代码。

您需要通过清理您的帖子变量来防止 SQL 注入。我总是把它放在我的脚本的开头来清理它们并用$input['whateveryouarepassing']而不是调用它们$_POST['whateveryouarepassing']。编辑$mysqli->real_escape_string()部件以使用您的数据库对象。使用 MySQLi 或 PDO 和准备好的语句来帮助加强攻击。

$input = array();

if(isset($_POST)) {

    foreach ($_POST as $key => $value) {

        if (@get_magic_quotes_gpc()) {

            $key = stripslashes($key);

            $value = stripslashes($value);

        }

        $key = $mysqli->real_escape_string($key);

        $value = $mysqli->real_escape_string($value);

        $input[$key] = $value;

    }

}

然后我喜欢用这个函数来清理它,多年来我用各种清理坏代码的方法组合在一起。如果可以设置,请改用 HTML Purifier。如果没有,这就是这个坏男孩。用 调用它cleanHTML($input['whateveryouarepassing']);

function cleanHTML($string) {

    $string = preg_replace('#(&\#*\w+)[\x00-\x20]+;#u', "$1;", $string);

    $string = preg_replace('#(&\#x*)([0-9A-F]+);*#iu', "$1$2;", $string);

    $string = html_entity_decode($string, ENT_COMPAT, "UTF-8");

    $string = preg_replace('#(<[^>]+[\x00-\x20\"\'\/])(on|xmlns)[^>]*>#iUu', "$1>", $string);

    $string = preg_replace('#([a-z]*)[\x00-\x20\/]*=[\x00-\x20\/]*([\`\'\"]*)[\x00-\x20\/]*j[\x00-\x20]*a[\x00-\x20]*v[\x00-\x20]*a[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iUu', '$1=$2nojavascript...', $string);

    $string = preg_replace('#([a-z]*)[\x00-\x20\/]*=[\x00-\x20\/]*([\`\'\"]*)[\x00-\x20\/]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iUu', '$1=$2novbscript...', $string);

    $string = preg_replace('#([a-z]*)[\x00-\x20\/]*=[\x00-\x20\/]*([\`\'\"]*)[\x00-\x20\/]*-moz-binding[\x00-\x20]*:#Uu', '$1=$2nomozbinding...', $string);

    $string = preg_replace('#([a-z]*)[\x00-\x20\/]*=[\x00-\x20\/]*([\`\'\"]*)[\x00-\x20\/]*data[\x00-\x20]*:#Uu', '$1=$2nodata...', $string);

    $string = preg_replace('#(<[^>]+[\x00-\x20\"\'\/])style[^>]*>#iUu', "$1>", $string);

    $string = preg_replace('#</*\w+:\w[^>]*>#i', "", $string);

    $string = preg_replace('/^<\?php(.*)(\?>)?$/s', '$1', $string);

    $string = preg_replace('#</*(applet|meta|xml|blink|link|script|embed|object|frame|iframe|frameset|ilayer|layer|bgsound|title|base)[^>]*>#i', "", $string);

    return $string;

}
  1. HTML 在编辑和显示时会受到 CSS 的影响。如果这是一个问题,您将需要编写额外的 CSS 规则。如果问题是在编辑时移动到基于 iframe 的编辑器并防止 css 在 iframe 中显示 html 内容。

  2. 如果你想要另一个建议,elRTE 这些天是我的 goto 编辑器。一旦您了解了代码库和 API,就更高级一点,但完全值得。您将面临与任何编辑器相同的问题。除了编辑期间的 CSS,因为 elRTE 是基于框架的,您可以指定样式表。elRTE主页

编辑:假设您使用的是 PHP,我发布了这个。如果没有,请道歉。

于 2014-01-26T07:00:02.587 回答