兔源码网 - 专注DZ模版分享、DZ插件分享!

 找回密码
 立即注册

QQ登录

只需一步,快速开始

广告
温馨提示:本站所有DZ相关模板、插件、教程(包括DZ应用中心已下架插件、模板)皆为提供免费下载,无任何收费模式(不包括VIP版块非DZ资源,VIP版块需充值兔币购买会员组方可下载),用户仅需手动前往【申请下载权限】申请用户组下载权限即可,如本站没有您需要的插件或模板,请自行前往淘宝互站网送吗网等第三方站点搜索相关插件或模板进行低价格购买下载本站非常不建议用户浪费金钱前往DZ应用中心购买。

Discuz发布特殊字符帖子内容为空的临时解决方案

[复制链接]
tuyuanma 发表于 2017-4-6 09:50:58 | 显示全部楼层 |阅读模式
温馨提醒:禁止内容附带广告图片、二维码图片,否则将在不通知情况下永久禁言账号!
欢迎加入兔源码站长交流群,您的加入是我们前行的动力!

DZ站长建站交流群:493651246

[ 温馨提示:点击上方群文字,可快速加入QQ群 ]


最近发现了一个非常有意思的问题,那就是我们可以在几乎所有的基于Discuz的论坛中发布标题和帖子都为空的内容,这种情况在正常的运营过程中是不可能出现的,而且出现之后肯定是非常影响用户体验的。比如一整版都被刷成了空白,想想都要气炸了。说到这个问题,我们先来看一张图:

Discuz发布特殊字符帖子内容为空的临时解决方案

Discuz发布特殊字符帖子内容为空的临时解决方案

这张图很多人应该都看到过,没错,这就是从我的手机上截图下来的,在我印象中好像ios自带输入法都会有这种称之为emoji的表情,而且现在非常流行。这种表情其实也算是一种特殊符号,大家可以在基于Discuz的论坛中发布这样的内容,我们会发现内容是空白的(discuz默认是不允许发布空的内容的);通过我们的测试很多开源的程序发布诸如这类特殊符号的时候,最终显示出来的是空白;再比如输入

Discuz发布特殊字符帖子内容为空的临时解决方案

Discuz发布特殊字符帖子内容为空的临时解决方案 符号(欧元符号)也会是这样。


; E0 L; }# I' D1 k

大家都知道在discuz发布帖子的时候对应执行的脚本在source/module/forum/forum_post.php中,通过分析,我们可以追踪到我们输入的特殊字符在执行insert语句的时候依然不是空的,而插入到数据库中后就是空的了,当然显示出来也是空的了。

1 ^* V- q3 [+ ?- X9 K

实际上就是因为这些特殊字符的某些原因,造成这种字符的存储问题。实际上我们也会看到很多知名站点是支持emoji的,当然他们是做了处理的,实际上针对这点,在github上有很多开源的项目,如果愿意折腾可以让我们的项目也支持。当然除了emoji外,其实还有其他的一些特殊字符要处理。

8 h. D( q3 i8 v8 [+ }

于是有些人就会说,这么麻烦,还是不需要支持吧,我直接把这样的帖子给删除了。但手动删除显然不太好了,于是就有了这个临时的解决方案,其实对于我来说并不算解决方案,因为这并没有从根本上解决问题。它唯一做的事情就是自动删帖,但有人提出这样的需求还是照干吧。

! I5 B& X6 j. K7 N4 L

上面我已经说了,在执行insert的时候所对应的参数值还是不为空的,那么就是在存入数据库的时候变成了空的。于是就可以这样子,在执行内容insert脚本后面紧跟着做一个判断,再次查询刚刚插入的数据,然后判断对应的内容是否为空,如果为空执行删除这条记录的语句,然后反馈提示给用户说不能发布这样的内容。


0 p( ~1 S* F+ l: t, c9 D

通过查看discuz的源代码,我们可以在source/include/post/post_newreply.php中找到回帖开始执行insert的代码,就是在其中的newreply()方法,而相应的发布帖子对应的就是同目录下的post_newthread.php。以回帖为例,我们可以在newreply()执行的后面,也就是找到如下代码:

  1. <font color="rgb(85, 85, 85)">$modpost->attach_before_methods('newreply', $bfmethods);9 r2 S' p' E7 x: e
  2. $modpost->attach_after_methods('newreply', $afmethods);
    # h# `# n2 }) K9 i9 Q; A# Z* i
  3. $return = $modpost->newreply($params);% A6 [4 @  Q( O5 J# e
  4. $pid = $modpost->pid;</font>
复制代码
在这段代码后面加入以下代码
  1. //通过返回的pid获取插入的信息" x. v* n2 m! ]- d
  2. $databypid=C::t('forum_post')->fetch_by_pid_condition($tableid, $pid,'','message');9 g- o# s: B7 J5 Y
  3. //判断message是否为''; ]+ A$ @1 @  x. v: {
  4. if(empty($databypid['message'])){0 q5 g2 ]$ l; L' i. i% j& n
  5.     DB::delete('forum_post', array('pid' => $pid));//删除message为''时的整个记录
    : M5 b6 D5 Q% ?: G5 v# Y8 [/ ~
  6.     showmessage('不能输入特殊字符或表情!');//给用户提示/ ]( y4 C6 e1 f, I0 [2 b5 r
  7. }
复制代码
流程就是跟上面提到的一样,当然在发帖的中间,我们应该在判断中加入对标题的判断,也就是除了message这个字段外,还应该加入subject字段加进来一起做判断。这种其实是退一步的方式,因为至少付出了多余的两条sql操作,实际上如果我们确定了这些字符对应的范围,然后使用正则在执行insert前就可以过滤掉。

* n; [3 `$ h: x: o' ~

版权声明
1、转摘或引用本站内容资源须注明原网址,并标明本站网址(兔源码www.tuyuanma.com);
2、对于转摘或引用本站内容资源而引起的民事纠纷、行政处罚或其他损失,本站不承担责任;
3、对于不遵守本声明或其他违法、恶意使用本站内容者,本站保留其追究法律责任的权利。




自动排版 | 高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广告

兔源码网 ( 赣ICP备17001544号 公网安备36112102000036号 )

兔源码 QQ交流群:493651246  GMT+8, 2019-8-24 03:42
←站长统计工具 查看密码:tuyuanma

兔源码DZ模板下载 站长邮箱:tuyuanma@qq.com 站长QQ:3197813386 网站地图

© 2001-2013 本站内容皆来自互联网及用户分享,如需删除请提供软著或商标证书。

     
快速回复 返回顶部 返回列表