栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > PHP > php开源框架 > destoon

destoon编辑器会自动加<em></em>解决方案

destoon 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

destoon编辑器会自动加<em></em>解决方案

  今天有个朋友和我说dt的编辑器上传图片会出现图片路径打不开,会自动加入<em></em>这个代码,我一看还真实,先开始以为是编辑器问题,之后找dt函数库才明白,原来解析 include\safe_func.php 里涉及转义 html 特殊字符(dhtmlspecialchars)和防止 js 脚本注入(dsafe)的函数。这两个函数主要用于富文本之类的内容转义和替换。


    富文本内容在存储进入数据库之前需要对一些 html 特殊字符做处理,并且要能够防止 js 脚本注入。在进入正文之前需要对几个概念做一下定义解释。


  转义字符是很多程序语言、数据格式和通信协议的形式文法的一部分。对于一个给定的字母表,一个转义字符的目的是开始一个字符序列,使得转义字符开头的该字符序列具有不同于该字符序列单独出现时的语义。因此转义字符开头的字符序列被叫做转义序列。

  

  在 HTML 中,某些字符是预留的。在 HTML 中不能使用小于号(<)和大于号(>),这是因为浏览器会误认为它们是标签。如果希望正确地显示预留字符,我们必须在 HTML 源代码中使用字符实体(character entities)。


   

如需显示小于号,我们必须这样写:&lt; 或 &#60;。这其实就是 html 的转义字符,xml 等标记语言转义字符由 & 加上字符或数字,末尾加上分号。其他脚本语言,如 php,js,java 都是反斜杠 \ 标记转义字符。

当富文本内容为不可信来源时,就需要对其中的一些内容做处理。

function dsafe($string, $type = 1) {
    if(is_array($string)) {
        return array_map('dsafe', $string);
    } else {
        if($type) {
            $string = str_replace('<em></em>', '', $string);
            $string = preg_replace("/\<\!\-\-([\s\S]*?)\-\-\>/", "", $string);
            $string = preg_replace("/\/\*([\s\S]*?)\*\//", "", $string);
            $string = preg_replace("/&#([a-z0-9]{1,})/i", "<em></em>&#\\1", $string);
            $match = array("/s[\s]*c[\s]*r[\s]*i[\s]*p[\s]*t/i","/d[\s]*a[\s]*t[\s]*a[\s]*\:/i","/b[\s]*a[\s]*s[\s]*e/i","/e[\\\]*x[\\\]*p[\\\]*r[\\\]*e[\\\]*s[\\\]*s[\\\]*i[\\\]*o[\\\]*n/i","/i[\\\]*m[\\\]*p[\\\]*o[\\\]*r[\\\]*t/i","/on([a-z]{2,})([\(|\=|\s]+)/i","/about/i","/frame/i","/link/i","/meta/i","/textarea/i","/eval/i","/alert/i","//confirm/i/i","/prompt/i","/cookie/i","/document/i","/newline/i","/colon/i","/<style/i","/\\\x/i");
            $replace = array("s<em></em>cript","da<em></em>ta:","ba<em></em>se","ex<em></em>pression","im<em></em>port","o<em></em>n\\1\\2","a<em></em>bout","f<em></em>rame","l<em></em>ink","me<em></em>ta","text<em></em>area","e<em></em>val","a<em></em>lert","/con<em></em>firm/i","prom<em></em>pt","coo<em></em>kie","docu<em></em>ment","new<em></em>line","co<em></em>lon","<sty1e","\<em></em>x");
            return str_replace(array('isShowa<em></em>bout', 'co<em></em>ntrols'), array('isShowAbout', 'controls'), preg_replace($match, $replace, $string));
        } else {
            return str_replace(array('<em></em>', '<sty1e'), array('', '<style'), $string);
        }
    }
}


array_map 实现字符串数组的替换处理,主要替换方法就是 str_replace 和 preg_replace。前者直接匹配字符串并替换,后者是通过正则表达式匹配内容并替换。

当 type 等于 1(默认)时,可以从最后的一组替换看出,是要将一些设计到 js 脚本内容部分给破坏掉,这样就可以使得即使注入 js 脚本也不会执行。


function dhtmlspecialchars($string) {
    if(is_array($string)) {
        return array_map('dhtmlspecialchars', $string);
    } else {
        $string = htmlspecialchars($string, ENT_QUOTES, DT_CHARSET == 'GBK' ? 'GB2312' : 'UTF-8');
        return str_replace('&amp;', '&', $string);
    }
}


Destoon 对富文本输出内容控制及其严格。

$conten = nl2br(dsubstr(trim(strip_tags($content)), $length, '...'));


所以想要解决自动加<em></em>,就要进行注释,把以下代码覆盖到/include/safe_func.php 下:


<?php
defined('IN_DESTOON') or exit('Access Denied');
function dhtmlspecialchars($string) {
	if(is_array($string)) {
		return array_map('dhtmlspecialchars', $string);
	} else {
		$string = htmlspecialchars($string, ENT_QUOTES, DT_CHARSET == 'GBK' ? 'GB2312' : 'UTF-8');
		return str_replace('&amp;', '&', $string);
	}
}

function dsafe($string, $type = 1) {
	if(is_array($string)) {
		return array_map('dsafe', $string);
	} else {
		if($type) {
			//$string = str_replace('<em></em>', '', $string);
			$string = preg_replace("/\<\!\-\-([\s\S]*?)\-\-\>/", "", $string);
			$string = preg_replace("/\/\*([\s\S]*?)\*\//", "", $string);
			//$string = preg_replace("/&#([a-z0-9]{1,})/i", "<em></em>&#\\1", $string);
			$match = array("/s[\s]*c[\s]*r[\s]*i[\s]*p[\s]*t/i","/d[\s]*a[\s]*t[\s]*a[\s]*\:/i","/b[\s]*a[\s]*s[\s]*e/i","/e[\\\]*x[\\\]*p[\\\]*r[\\\]*e[\\\]*s[\\\]*s[\\\]*i[\\\]*o[\\\]*n/i","/i[\\\]*m[\\\]*p[\\\]*o[\\\]*r[\\\]*t/i","/on([a-z]{2,})([\(|\=|\s]+)/i","/about/i","/frame/i","/link/i","/meta/i","/textarea/i","/eval/i","/alert/i","//confirm/i/i","/prompt/i","/cookie/i","/document/i","/newline/i","/colon/i","/<style/i","/\\\x/i");
			$replace = array("s<em></em>cript","da<em></em>ta:","ba<em></em>se","ex<em></em>pression","im<em></em>port","o<em></em>n\\1\\2","a<em></em>bout","f<em></em>rame","l<em></em>ink","me<em></em>ta","text<em></em>area","e<em></em>val","a<em></em>lert","/con<em></em>firm/i","prom<em></em>pt","coo<em></em>kie","docu<em></em>ment","new<em></em>line","co<em></em>lon","<sty1e","\<em></em>x");
			return str_replace(array('isShowa<em></em>bout', 'co<em></em>ntrols'), array('isShowAbout', 'controls'), preg_replace($match, $replace, $string));
		} else {
			//return str_replace(array('<em></em>', '<sty1e'), array('', '<style'), $string);
			return str_replace(array('', '<sty1e'), array('', '<style'), $string);
		}
	}
}

function strip_sql($string, $type = 1) {
	if(is_array($string)) {
		return array_map('strip_sql', $string);
	} else {
		if($type) {
			$string = preg_replace("/\/\*([\s\S]*?)\*\//", "", $string);
			$string = preg_replace("/0x([a-f0-9]{2,})/i", '0&#120;\\1', $string);
			$string = preg_replace_callback("/(select|update|replace|delete|drop)([\s\S]*?)(".DT_PRE."|from)/i", 'strip_wd', $string);
			$string = preg_replace_callback("/(load_file|substring|substr|reverse|trim|space|left|right|mid|lpad|concat|concat_ws|make_set|ascii|bin|oct|hex|ord|char|conv)([^a-z]?)\(/i", 'strip_wd', $string);
			$string = preg_replace_callback("/(union|where|having|outfile|dumpfile|".DT_PRE.")/i", 'strip_wd', $string);
			return $string;
		} else {
			return str_replace(array('&#95;','&#100;','&#101;','&#103;','&#105;','&#109;','&#110;','&#112;','&#114;','&#115;','&#116;','&#118;','&#120;'), array('_','d','e','g','i','m','n','p','r','s','t','v','x'), $string);
		}
	}
}

function strip_wd($m) {
	if(is_array($m) && isset($m[1])) {
		$wd = substr($m[1], 0, -1).'&#'.ord(strtolower(substr($m[1], -1))).';';
		if(isset($m[3])) return $wd.$m[2].$m[3];
		if(isset($m[2])) return $wd.$m[2].'(';
		return $wd;
	}
	return '';
}

function strip_uri($uri) {
	if(strpos($uri, '%') !== false) {
		while($uri != urldecode($uri)) {
			$uri = urldecode($uri);
		}
	}
	if(strpos($uri, '<') !== false || strpos($uri, "'") !== false || strpos($uri, '"') !== false || strpos($uri, '0x') !== false) {
		//dhttp(403, 0);
		//dalert('HTTP 403 Forbidden - Bad URL', DT_PATH);
		$uri = urldecode($uri);
	}
}

function strip_kw($kw, $max = 0) {
  $kw = dhtmlspecialchars(trim(urldecode($kw)));
	if($kw) {
		if(strpos($kw, '%') !== false) return '';
		$kw = str_replace(array("'", '&'), array('', ''), $kw);
		$max = intval($max);
		if($max > 0 && strlen($kw) > $max) $kw = dsubstr($kw, $max);
	}
	return $kw;
}

function strip_key($array) {
	foreach($array as $k=>$v) {
		if(!preg_match("/^[a-z0-9_\-]{1,64}$/i", $k)) {
			
		}
		if(is_array($v)) strip_key($v);
	}
}

function strip_str($string) {
	return str_replace(array('\\','"', "'"), array('', '', ''), $string);
}
?>


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/804545.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号