解决UCHOME的违禁词失效问题

场景:

相信大家很多人都使用过uchome,uchome在屏蔽不良词语时有一整套方案,但是唯一没有考虑,违禁词文件太大造成uchome违禁词判断失效的问题。

如图:

解决UCHOME的违禁词失效问题_第1张图片

这是后台的添加不良词语界面,可以再这里按照格式进行增加,添加完成后会在data目录中生成一个data_censor.php文件

如图:

解决UCHOME的违禁词失效问题_第2张图片

这是data_censor.php的位置,打开它,你会看到

如图:

解决UCHOME的违禁词失效问题_第3张图片

是不是很多啊,这是使用博客功能发布一遍含有违禁词的文章试一试,是不是顺利发布通过了,这说明违禁词检测没有起到作用,打开error_reporting(E_ALL),程序会报这样的错误。

如图:

说明:data_censor.php中的字符串太长匹配无法执行。

咱们来分析一下uchome的源码,打开function_common.php,找到601行

//词语屏蔽
@include_once(S_ROOT.'./data/data_censor.php');
if($_SGLOBAL['censor']['banned'] && preg_match($_SGLOBAL['censor']['banned'], $string)) {
	showmessage('information_contains_the_shielding_text');
} else {
	$string = empty($_SGLOBAL['censor']['filter']) ? $string :
	@preg_replace($_SGLOBAL['censor']['filter']['find'], $_SGLOBAL['censor']['filter']['replace'], $string);
}

将其修改为:

@include_once(S_ROOT.'./data/data_censor.php');
//分段屏蔽
$offset = 2;
$censorLen = strlen($_SGLOBAL['censor']['banned']);
$loopnum = ceil($censorLen/10000);
if($_SGLOBAL['censor']['banned']) {
	for ($i=0; $i<=$loopnum; $i++) {
		$pattern = mb_substr($_SGLOBAL['censor']['banned'], $offset, 10000);
		if ($i<$loopnum) {
			$pos = strrpos($pattern, "|");
			$pattern = '/('.mb_substr($_SGLOBAL['censor']['banned'], $offset, $pos).')/i';
		} else {
			$pattern = '/('.$pattern;
		}
		if (preg_match($pattern, $string)) {
			showmessage('information_contains_the_shielding_text');
			break;
		}
		$offset += $pos + 1;
	}
} else {
	$string = empty($_SGLOBAL['censor']['filter']) ? $string :
	@preg_replace($_SGLOBAL['censor']['filter']['find'], $_SGLOBAL['censor']['filter']['replace'], $string);
}

再发表博客试一试,会出现一下提示,如图:

这说明,过滤功能已经起作用了。

你可能感兴趣的:(PHP,正则,uchome,preg_match)