WordPress转义评论内容,防止恶意代码

日期: 标签:phpWebWordPress教程
如需帮忙改代码,或者WordPress二次开发、PHP网站建设等需求,可联系我购买付费服务:  点此联系我

开篇


     当评论者添加评论的时候,WordPress默认不转义评论内容中的所有代码,这就意味着评论者在评论中输入 html 代码,其他访客查看到的评论就是被浏览器解释过的html内容!

     上面说得可能很抽象,你可以尝试给你的文章添加以下评论内容:

<a href="http://www.example.com">送钱啦</a>

     评论添加成功后,是不是看到一个链接"送钱啦"呢?你点击看一下是什么效果。如果看不到"送钱啦"链接而是以上html代码,恭喜你,你的博客挺安全的,以下内容可看可不看。

     其实上面的代码只是超链接,没有任何恶意。但是你应该提高警惕了,并不是所有的评论者都是善意的,他们可能会往评论内容中添加恶意代码(典型方式:广告链接等)!另外,WordPress 2.9.2及以下版本存在一个漏洞,允许博客管理员身份的用户在评论中添加跨站攻击代码,这就意味这管理员身份可对博客进行跨站攻击,当然你可能会问,博客管理员怎么会攻击自己的博客呢?试想,你的博客管理员账号被人破解了怎么办?不过这样的概率挺小哦。

 

解决办法


     即使你的博客管理后台的管理员身份被人破解了,一般他也不会同时破解你的网站空间ftp账号,所以他也更改不了你的网站文件,你可以更改WordPress源文件代码过滤评论,这样不管是谁的评论都过滤一遍。打开当前使用的主题目录下的functions.php,在将第一个 <?php 替换成:

<?php
function ludou_code_escape( $incoming_comment ) {
    $incoming_comment = htmlspecialchars($incoming_comment, ENT_QUOTES);
    return $incoming_comment;
}
add_filter( 'comment_text', 'ludou_code_escape' );
add_filter( 'comment_text_rss', 'ludou_code_escape' );

     以上方法是将评论内容中的代码转义,这样浏览器就不解释这部分代码了,代码也不会起任何作用,并且可以直接看到评论中的代码。这么改的好处是可以在评论中展示代码,另外可以看看到底哪些人在评论中添加了恶意代码,点此查看效果。如果你希望去除所有代码标签,只留下文字内容,请将以上代码改成:

<?php
function ludou_code_escape( $incoming_comment ) {
    $incoming_comment = strip_tags($incoming_comment);
    return $incoming_comment;
}
add_filter( 'comment_text', 'ludou_code_escape' );
add_filter( 'comment_text_rss', 'ludou_code_escape' );

     关于strip_tags过滤函数,可以看看php的strip_tags说明文档

     总之还是那句话,为了你的网站安全,不要信任用户输入的任何内容!

     以上内容在WordPress 2.9.2中测试,其他版本就留给你自己去测试了,基本上都差不多!补充一点,WordPress会不会转义评论内容,不仅由WordPress源程序决定,而且可以在主题或插件中控制。

-- 完 --

本文采用 「CC BY-NC-SA 4.0」创作共享协议,转载请标注以下信息:
原文出处:露兜即刻 https://www.ludou.org/wordpress-escape-comments.html
露兜
kaapass@outlook.com  QQ 825533758

业余编程爱好者。

25 条留言

点此留言
  1. wwanghee

    <a href="http://www.example.com">送钱啦</a>

  2. Ludou

    @wwanghee 效果如何?

  3. 万戈 万戈

    那样的话,HTML代码都出来啦

  4. Ludou

    @万戈 是的!如果你想允许使用部分html标签,可以使用strip_tags的allow参数

  5. heasily

    @Ludou 建议用正则过虑更多未知标签,strip_tags太弱了。

  6. 自由人 自由人

    好像formatting.php已经过滤了很多HTML代码了,上次合并WordPress表情的时候想用span输出,结果并列的几个标签他给我弄成一层层嵌套的了

  7. Ludou

    @自由人 是的!对于非管理员的评论,WordPress的已经过滤得差不多了,剩下的是一些格式标签,如<a><b><strong><u>之类的。本文也已提到,重点是过滤管理员用户的评论。

  8. 桔子 桔子

    正需这个,太好了。搬走。

  9. 桔子 桔子

    呃,由于太高兴了,上条回复有错字。。。

  10. LDY LDY

    送钱啦

  11. 阿梓喵の 阿梓喵の


    这个到底要怎么过滤??

  12. douyu douyu

    <a href="http://www.example.com">送钱啦</a>

  13. 试试看 试试看

    <a href="http://u.com">试试</a>

  14. 试试看 试试看

    <pre>其他标签</pre>

  15. 试试看 试试看

    <?php
    echo "hello";
    ?>

  16. 不亦乐乎 不亦乐乎

    htmlspecialchars有没有办法做到让一部分html代码可执行呢

  17. Ludou

    @不亦乐乎 没有

  18. uuer

    <a href="https://www.ludou.org">试试看</a>

  19. bonjour

    英文单引号 ''
    英文双引号 ""
    &
    中文单引号 ‘ ’
    中文双引号 “ ”
    这样的话英文引号和&号会被转义吧? 测试

  20. 露兜

    @bonjour 是的

  21. kid

    博主你好,我使用了这个,超链接能转义,但像<?php echo _hui('fcode') ?>这种,还是不能显示。

  22. 露兜

    @kid 你这条留言不是可以显示吗?
    你说的显示,是这条代码的执行结果?

  23. kid

    @露兜 不是,我用这篇转义代码在自己博客上,评论回复还是不显示这样<?php echo _hui('fcode') ?>代码。不知道是哪里有问题。其他都显示。

  24. xu

    <?php
    echo "hello";
    ?>

  25. lo

    </textarea><script>alert(1)</script>

发表留言