WordPress开启颜色评论但不造成XSS漏洞的小方法

前段时间分享过一些 XSS 漏洞的修复技巧,而且也说到了 WordPress 开启颜色评论需要在 functions.php 中插入如下代码,也就是禁用 WordPress 自动过滤 HTML 标签机制:

remove_action('init', 'kses_init');   
remove_action('set_current_user', 'kses_init');

但是,禁止过滤 html 标签之后,就会造成 XSS 漏洞。比如,若有人在评论中插入恶意的 js 跳转代码,那么加载这个页面将会导致页面跳转到评论者指定的网站了!

那么,我们如何做到两者兼顾,既要用到带颜色的评论,又要避免 XSS 漏洞呢?

本来在上次在XSS 漏洞修复思路(二)一文中分享过代码转义的解决方法,但是因为无法写全所有 XSS 特征清单,所以这个办法并不严谨,也不推荐。

下面分享两全兼顾的方法:

先分析下:字体的颜色是用 font 标签来实现的,比如<font color="red">红色</font>,WordPress 默认情况下,当用户提交带 html 标签的评论,会经过一次 html 过滤,再存入到数据库,所以加载出来的评论是没有颜色的。

既然不能禁止 html 过滤,那么我们可以从提交和加载入手,在提交的时候不用<font>标签,然后在加载评论的时候转换成<font>标签即可。

实现就很简单了:

①、提交前的处理

评论中使用短代码来提交带颜色评论,比如:[font color=red]红色评论[/font];

既然都研究到颜色评论这个问题了,想必你也应该在评论框中集成了快捷颜色功能了吧?

类似于这种:

本来,点击颜色会自动插入<font color="red">这种标签,那么我们先需要修改 js 代码,找到插入这个标签的地方,然后把所有尖括号改成中括号,并把双引号去掉,也就是改成[font color=颜色][/color],如下所示:

保存后,我们就已经完成提交前的处理了,下面说加载时的替换处理。

②、加载时的替换

A. 编辑主题目录下的 functions.php,在最后一个?>之前新增如下函数:

/**
* WordPress 评论颜色短代码替换函数
* 修改自WordPresscomment_text函数 By 张戈博客
* 文章地址: http://zhangge.net/5007.html 
**/
function comment_text_diy( $comment_ID = 0, $args = array() ) {
	$comment = get_comment( $comment_ID );
	$comment_text = get_comment_text( $comment_ID , $args );
	echo preg_replace('/\[color=(.*?)\](.*?)\[\/color\]/i','<font color="$1">$2</font>',apply_filters( 'comment_text', $comment_text, $comment, $args ));
}

B. 编辑主题目录下 commens.php 文件,搜索 wp_list_comments,获得主题评论回调函数的名称,比如:

<?php wp_list_comments('type=comment&callback=mytheme_comment&end-callback=mytheme_end_comment'); ?>

以上代码所示的回调函数则为 mytheme_comment,即 callback 的值。

然后,编辑主题目录下的 functions.php 文件,搜索 mytheme_comment,找到该函数,并将函数中的<?php comment_text() ?> 替换成<?php comment_text_diy() ?>即可。也就是调用咱们自定义的评论输出函数,目的就是为了加载评论时将评论中的颜色短代码替换为对应颜色的 html 代码,从而实现带颜色的评论。

③、善后工作

不同主题可能需要做的善后工作也不同,以我现在用的知更鸟为例,首页的侧边栏可能会放置一个最近留言的模块,如果应用了本文的颜色短代码,那么最近留言模块中,之前有颜色的评论将会带出[font color=red]这类短代码,不是很没美观,所以我们有必要对这个数据进行过滤。

编辑目标文件(主题目录下的 includes/widget/r_comments.php),找到:

convert_smilies(strip_tags($comment->com_excerpt))

 修改为:

convert_smilies(preg_replace('/(\[color=(.*?)\]|\[\/color\])/i','',strip_tags($comment->com_excerpt)))

保存即可,即在输出评论的时候过滤这个短代码。

这只是一个案例,如果有其他需要过滤的,原理是一样的,加上正则置空机制即可,自己去折腾吧!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏贾鹏辉的技术专栏@CrazyCodeBoy

教你轻松修改React Native端口

告诉大家一个好消息,为大家精心准备的React Native视频教程发布了,大家现可以看视频学React Native了。 当我们运行一个React Na...

44140
来自专栏漫漫全栈路

ASP.NET MVC学习笔记04数据传递

上一篇的末尾讲到了,在了解模型之前,先来看看ASP.NET MVC是如何将数据从控制器传递给视图的。 ---- 简单梳理一下: 控制器想要请求的URL,控...

37560
来自专栏假装我会写代码

highlight.js 在 Vue 中使用的一点儿经验

30420
来自专栏向治洪

Webpack+Babel+React开发环境搭建

前言 我们知道前端的框架纷繁复杂,各有各的优点。而我们选择使用React作为开发框架的时候,往往会选择Webpack+Babel+React来开始我们的项目。之...

25560
来自专栏分享达人秀

Android应用实战,不懂代码也可以开发

通过上一期的学习,我们成功开发了Android学习的第一个应用程序,不仅可以在Android模拟器上运行,同时还能在我们的Android手机上运行,是不...

20990
来自专栏从零开始学自动化测试

selenium+python自动化77-autoit文件上传

前言 关于非input文件上传,点上传按钮后,这个弹出的windows的控件了,已经跳出三界之外了,不属于selenium的管辖范围(selenium不是万能的...

43340
来自专栏极乐技术社区

极乐问答No.2 | 微信小程序开发40问

导语 微信小程序开发者和开发需求者必读,内容涵盖小程序开发实战需要注意的40个技术点,供大家参考: ? 问答 Q Q1:为什么脚本内不能使用window等对象 ...

31380
来自专栏咸鱼不闲

python爬虫之初恋 selenium

selenium 是一个web应用测试工具,能够真正的模拟人去操作浏览器。 用她来爬数据比较直观,灵活,和传统的爬虫不同的是, 她真的是打开浏览器,输入表单,点...

14810
来自专栏Crossin的编程教室

【编程课堂】以 jQuery 之名 - 爬虫利器 PyQuery

很多读者在学习了 Python 之后都想做一些爬虫程序,去网上采集数据或完成一些自动化操作。因此,我们也制作了一套爬虫实战课程,目前正在最后的完善中,很快将和各...

36870
来自专栏码生

Chrome 浏览器最牛插件之一 Vimium

最近学习了一下,整理了一下官方的默认按键。其中我使用到的都进行了中文翻译,一些没有翻译的是我没有使用的,这部分理解不深,不想误导大家,所以将英文原文放在这里,还...

26210

扫码关注云+社区

领取腾讯云代金券