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)))
保存即可,即在输出评论的时候过滤这个短代码。
这只是一个案例,如果有其他需要过滤的,原理是一样的,加上正则置空机制即可,自己去折腾吧!
- merge语句导致的CPU使用率过高的优化(r7笔记第4天)
- 由dual导致的一个潜在的监控问题(r7笔记第3天)
- 剑指Offer——编程题的Java实现
- Python中if __name__ == "__main__": 的作用
- 每周算法练习——大数的乘法问题
- Java基础-25(01)图形用户界面编程GUI
- 每周算法练习——n皇后问题
- dg broker配置的问题及分析 (r7笔记第22天)
- 备库搭建中的一波三折(r7笔记第21天)
- Java基础-25(02)图形用户界面编程GUI
- 每周算法练习——最近对问题
- Java基础-25(03)图形用户界面编程GUI
- 数据结构和算法——用动态规划求解最短路径问题
- 备库报警邮件的分析案例(一) (r7笔记第14天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用tp框架和SQL语句查询数据表中的某字段包含某值
- Laravel框架中集成MongoDB和使用详解
- thinkphp5 模型实例化获得数据对象的教程
- 浅谈laravel框架sql中groupBy之后排序的问题
- php 比较获取两个数组相同和不同元素的例子(交集和差集)
- Laravel 5.5 异常处理 & 错误日志的解决
- Laravel 框架返回状态拦截代码
- PHP getID3类的使用方法学习笔记【附getID3源码下载】
- PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
- 浅谈laravel 5.6 安装 windows上使用composer的安装过程
- PhpStorm 如何优雅的调试Hyperf的方法步骤
- 在TP5数据库中四个字段实现无限分类的示例
- 详解Laravel设置多态关系模型别名的方式
- tp5修改(实现即点即改)
- 自定义Laravel (monolog)日志位置,并增加请求ID的实现