作者归档:佐语

作者 佐语 简介

佐语小站,一个初学者的驿站,在这里停靠休息,看看风景,学学知识。

时刻警惕WordPress的恶意代码

近期在做Tomato计划的时候老是出现一个奇怪的事情,原本functions.php里面的东西删除之后老是反复出现,刚开始还没觉得有啥奇怪,以为是在复制的时候把原来的复制过来了,没往恶意代码那方面想。直到前天,自己在上传两个主题往测试站的时候,出现了主题有代码函数冲突的情况,仔细检查一下,原来删除的代码重复出现。这下子激起佐语的好奇心了。这怎么回事?结果昨天的一次搜索让佐语彻底明白,原来是感染了恶意代码了,而且还是流行很久的恶意代码。

网上有很多这段代码的解释,佐语就不一一贴出来了。具体可以看欲思博客的解释,很清晰。

欲思博客《小心WordPress主题functions.php包含的恶意代码》的原话是:

“这段代码是被加在在functions.php的?>后面的。如果发现了类似的多余函数,或者很多个?>那就要检查一下了。修改的时候记得把其他WordPress主题的functions.php设置为只读。这样才能不被感染。全部改完后再把权限修改回来。”

基本代码是这样的:

  1. function _checkactive_widgets
  2. function _get_allwidgets_cont
  3. function stripos
  4. function strripos
  5. function scandir
  6. function _getprepare_widget
  7. function __popular_posts
  8. add_action("admin_head""_checkactive_widgets");
  9. add_action(“init”, “_getprepare_widget”);
  10. _verify_isactivate_widgets
  11. _check_isactive_widget
  12. _get_allwidgetscont
  13. _prepare_widgets
  14. __popular_posts

经过检查,佐语的大部分主题都被感染了这个恶意代码,这个代码可以自动感染Theme文件夹中的所有functions.php文件,所以根据欲思的解决方法是把其他WordPress主题的functions.php设置为只读。这样才能不被感染。全部改完后再把权限修改回来。在这点上佐语也不知道怎么修改权限,干脆直接将所有主题(包括默认主题)全部删除,然后用FTP根据重新上传新的主题,使问题得以解决,简单粗暴直接明了

据大神们说这个恶意代码主要是感染functions.php文件,其他的就不得而知了。

恶意代码是怎么来的?嗯,这个真不知道,明月登楼博主在《WordPress站点恶意代码的分析和排查方法》中说到是:“给站点带来恶意代码的插件就占了 80%以上(有官网插件、网上流传的插件等等),其他的就是主题了(以破解版、盗版主题为主)。”

总体分析,佐语的主题恶意代码估计是在参考别人的主题时候感染的。毕竟有时候还是会下载到破解版的主题的。幸好发现及时,同时也让佐语得到警醒,必须时刻主题代码的安全。在这也提醒各位站长,网站安全不容忽视。

谈一谈Tomato计划

现在佐语来谈谈Tomato详细情况。

Step 1

由于佐语没有购买sahifa主题,实施Tomato计划的主题来源于网络。

sahifa计划实施的主题来源:

逍遥乐博主分享的sahifa430汉化版本

四亩地分享的sahifa5.6.11英文版本

WordPress大学的wpdx1.3版本

主题版本情况:

sahifa430汉化版本

优点:基本上全汉化,不懂英文可以上手操作。自带的首页page bulider可以无限布局,像操作小工具一样布局cms首页。

缺点:图片上传还是旧版式,操作有点不方便,其他设置功能没有新版本的多。

sahifa5.6.11英文版本

优点:新增加各种功能,同样是自带page bulider可以无限布局。

缺点:英文版本不太适应,需要做汉化处理,page bulider不在后台设置里面。需要在新建page里面设置,有些不方便。

Step 2

熟悉了解主题,了解主题佐语是从基本的设置开始的,每个人都有自己的习惯,佐语的习惯是先了解主题的后台设置,明确主题的后台有哪几项设置。设置完成后有哪几项效果产生,一般都是先设置看效果,结合主题的demo。

Step 3

1

修改sahifa主题,主要是修改主题的Css文件,将sahifa主题修改成合适自己的风格。毕竟风格很重要,每个网站都有自己的风格,风格独特的话很容易让访客记住自己的网站。

2

    为sahifa主题减负

国外的主题有个特点,比如社交网络图标我们是用不了的,谷歌字体我们样式用不了的。这些该删除的、屏蔽的必须删除屏蔽。

    移除东西:

  • 主题自带的支持文件、文档文件。
  • 主题升级提醒,插件安装提醒。
  • 字体fonts文件夹
  • Languages文件夹里面的默认语言(可以先翻译成中文后移除默认)
  • 移除一些用不上template文件(后期需要再添加回来)
  • 移除一些用不上的小工具(一般涉及国外的社交小工具都用不上)
  • 移除framework里面的plugins文件夹(插件不需要)
  • 移除一些背景设置图片,背景简单的颜色就够了,保留三个基本背景设置图片
  • 剔除后台设置中用不上的选项(计划中)

一系列的移除让原本7.4M的主题包缩减成2.16M,基本功能完全保留。

Step 4

    终极目标:

1、将sahifa后台剥离出来,主题的样式还是以430版本为主,将首页cms pagebulider放在后台设置,其他的设置项以5611版本为主。

2、将剥离出来的后台融入佐语的其他主题中。

Tomato计划进度

目前的Tomato计划已经进行到step 2啦。

嗯,基本上记录这些吧。

 

懂得释怀

 

你若抱怨,处处可抱怨;你若成长,事事可成长。

你若盛开,清风自来;你若精彩,天自安排。做个内心强大的人,过去,一笑而过;将来,安然以待。

愿你明朗坦荡真诚豁达,有得有失有坚持,能哭能笑能尽欢。

愿你一生努力一生被爱,想要的都拥有,得不到的都释怀。

 

节选自 人民日报【夜读】2019年1月21日《读懂这些故事,人生便无怨言》

细数魔改过的主题并启动Tomato计划

    自从迷上折腾主题之后,佐语一直致力于WordPress主题的制作学习,参考了不同的主题,一直以折腾出自己合适的、喜欢的主题为目标,现在总结一下佐语已经折腾过的各个主题吧。

 

1

之前一直作为主要主题的《Doracmon》主题,该主题以懿古今大佬的Nana主题为底板,自己调整CSS做改造,增加各种小工具、调整各个不同部位细节。这个也是佐语第一次接触WordPress的第一个免费主题。全面、简单合适自己。

2

以懿古今大佬的Three主题为底板改造的《Mont》主题,该主题是为佐语安全网站准备的。一开始佐语安全是使用网络上传播的大前端的DUX主题,后来想想,还是算了,毕竟不是正版,还是尊重一下版权,所以启用该主题。思来想去后面改用了Three主题,但是因为该主题的后台不理想,不是自己喜欢的类型,主题再次被弃用。转用nana,最后是自己在主题折腾过程中总结了许多的经验,决定将Three主题大改造,采用codestar framework进行后台改造。

3

《Zoyv》主题,提供给三颗菜豆网站使用。该主题的底板是PHPABC博主分享的主题,主题样式类似于简版的nana,或者说是git,或者是欲思,反正就是一个字,像。后台跟git、nana是一样的。改主题改了很多的地方,导航、悬浮栏、页脚、颜色、后台全部都改了一遍。后台改用了options framework,轻量。但是还是有点遗憾。

4

《Years》主题,该主题是用杨青青大神的《showtime》模板套的一个主题,这也是佐语制作主题第一步,先学习系统的主题改造。该主题没有后台,缺少后台的原因是没有看到喜欢的,一直想拥有一个可以自由布局的博客主题。在没有合适的后台之前,该主题估计不会再继续改下去。

5

目前正在测试的《Joyv》主题,该主题以老董博客分享的精简版twenty twelve为底板,做了各种改造。该主题也没有后台。

总结一下

作为一个工程人来说WordPress的学习制作挺难的,一开始是学习html5和Css知识,然后就是不停地测试,网上查资料,拆别人成熟的主题。有时候我会想,其实直接用别人的模板就可以了,何必去改来改去呢。有时间还不如多发点文章,但是后来想想,何必呢,折腾主题是初衷,一边折腾一边记录也是佐语小站诞生的使命。所以,还是走下去呗。其他的都无所谓了。

在折腾的过程中,佐语参考了大量的博主的主题,参照的,直接使用的,在这里还是要感谢各位大佬。

至此,佐语的1.0时代落幕。

开启2.0计划--《Tomato计划》

佐语后面两个主题都没有后台,这让我很神伤。之前在搜索主题的时候,佐语发现WordPress大学的主题后台有点与众不同,这个后台可以自由布局cms页面。后面在仔细研究之后,发现这个后台挺好的。符合我内心的需求。在网络上搜索一通之后,发现WordPress大学的主题后台是采用国外主题sahifa后台二开的,sahifa主题在主题森林里面非常的畅销。

在深思熟虑之后,佐语决定启动2.0计划--《Tomato计划》

1、研究并魔改sahifa并剥离改主题的后台,主题改名《Tomato》。

2、为《Joyv》主题、《Years》主题、《Doracmon》主题配置剥离后的后台。

3、《Doracmon》主题大修。

放开心扉

   

我们很容易把小事看得很重要,让自己的心难以负荷。然而过了一段时间,再回头看看自己曾经走过的路,才发现很多计较很久的事情,付出的心力是真的不值得,甚至可笑极了。

 

                                                                                                                                                                                      --不知出处

自适应Joyv主题

生命在于折腾,一直想弄个自用的主题,Joyv主题的诞生也许也是背负着使命来的吧。

Joyv的诞生

近期一直在学习主题制作,自从上次将杨青青的模板套成WordPress主题《Years》之后,佐语一直在寻思着是继续改造基于nana主题的doracmon还是重新制作一个主题,后面还是兴趣使然,想着全面学习主题制作,于是重新弄了全新的Joyv主题。

Joyv主题的基础框架是WordPress默认的twenty twelve。感谢老董的博客《汉化精简版TwentyTwelve》。

Joyv的主要内容

经过佐语十几天的努力,完成了Joyv主题的大部分内容并上线测试,现记录下各项内容:

  1. 更换导航菜单,深度学习导航菜单,完成自适应导航栏。
  2. 头部社交图标、搜索框的配置。
  3. 幻灯片配置,使用slick插件配置。
  4. 添加右下角悬浮导航栏配置。
  5. 增加最新文章、随机文章、最新评论、文字推荐、读者墙、三栏Tab工具等5个小工具。
  6. 增加页脚小工具区域。
  7. 列表的css样式更改。
  8. 各项其他调整项

以上是大概的内容。

WordPress新评论微信推送

WordPress设置完SMTP之后,新的评论会通过邮件形式直接推送到邮箱,让站长们知道自己网站的文章有新的评论。这时,站长们就可以处理新来的评论了,然而我们也不能时时刻刻关注着几时有邮件推送过来,这怎办呢?

有些站长使用的是用Server酱微信推送,这个佐语没有用过,不知道效果这么样。今天,佐语给大家介绍的是另外一个小窍门。

大家都知道,我们在设置SMTP邮箱的时候直接使用QQ邮箱,在有新的邮件来的时候,会有个新的推送信息发到QQ上面,如果我们没有上QQ而是想在微信上面接收呢?这是也是可以的。

微信绑定常用QQ,打开微信并搜索“QQ邮箱提醒”功能,启用该功能。这样的话,微信就能正常地接受QQ邮箱推送邮件信息了,只要大家在设置SMTP的时候用的是绑定微信的QQ就可以了。

如果说设置SMTP的时候用的是另外的邮箱怎么办呢?没事,启用另外的方案:

1、进入QQ邮箱页面,点击左侧其他邮箱按钮

2、输入设置SMTP的邮箱账号及密码

3、成功添加邮箱账号并收取所有的邮件,至此,目前的QQ邮箱可以收取其他的邮箱的邮件了。如果有新的邮件来的话,微信也可以接收到推送信息。

将以上的设置都完成后,不管是QQ还是微信都可以接收到新评论的邮件推送信息。

分享一栏三按钮小工具(小工具版本非html)

刚开始接触WordPress的时候就是从搜索主题模板安装开始的,那时候用的是懿古今的Nana主题,感觉挺好的,又是免费主题,所以就用了,并且用到现在。

懿古今大大的主题不仅免费还有很多自己折腾的教程心得,所以后面佐语在WordPress上的折腾大部分都是学着来的。

学了这么久,我也来分享一个小工具,这个小工具懿古今已经分享过HTML版本的了。佐语分享的是基于html改造的成品小工具,直接放在主题文件里面,需要的时候调用就可以了。

主要的前端样式见文章:一栏三按钮的小工具改造

小工具代码直接放在widget.php里面

  1. /*
  2. Widget Name:一栏三按钮小工具
  3. Description:根据懿古今一栏三按钮改造而成。
  4. Version:1.0
  5. Author:佐语
  6. Author URI:https://www.zuoyv.com
  7. */
  8. class threebtn extends WP_Widget {
  9.     function __construct() {
  10.         $widget_ops = array(
  11.             'classname' => 'threebtn',
  12.             'description' => __( '一个图片三个链接按钮' ),
  13.             'customize_selective_refresh' => true,
  14.         );
  15.         parent::__construct('threebtn', '佐语  一栏三按钮', $widget_ops);
  16.     }
  17.     function widget($args$instance) {
  18.         extract($args);
  19.         $title = apply_filters( 'widget_title', $instance['title'] );
  20.         echo $before_widget;
  21.         if ( ! emptyempty$title ) )
  22.         echo $before_title . $title . $after_title;
  23. ?>
  24. <div id="update_version">
  25.     <a href="<?php echo $instance['jpg_link']; ?>" target="_blank" rel="noopener">
  26.         <img title="<?php echo $instance['bg_name']; ?>" src="<?php echo $instance['bg_link']; ?>" alt="佐语天下" />
  27.     </a>
  28.     <a class="one_link" href="<?php echo $instance['one_link']; ?>" target="_blank" rel="noopener"><?php echo $instance['theone']; ?></a>
  29.     <a class="two_link" href="<?php echo $instance['two_link']; ?>" target="_blank" rel="noopener"><?php echo $instance['thetwo']; ?></a>
  30.     <a class="three_link" href="<?php echo $instance['three_link']; ?>" target="_blank" rel="noopener"><?php echo $instance['thethree']; ?></a>
  31. </div>
  32. <?php
  33.     echo $after_widget;
  34.     }
  35.     function update( $new_instance$old_instance ) {
  36.         if (!isset($new_instance['submit1'])) {
  37.             return false;
  38.         }
  39.             $instance = $old_instance;
  40.             $instance = array();
  41.             $instance['title'] = strip_tags$new_instance['title'] );
  42.             $instance['jpg_link'] = $new_instance['jpg_link'];
  43.             $instance['bg_name'] = $new_instance['bg_name'];
  44.             $instance['bg_link'] = $new_instance['bg_link'];
  45.             $instance['one_link'] = $new_instance['one_link'];
  46.             $instance['theone'] = $new_instance['theone'];
  47.             $instance['two_link'] = $new_instance['two_link'];
  48.             $instance['thetwo'] = $new_instance['thetwo'];
  49.             $instance['three_link'] = $new_instance['three_link'];
  50.             $instance['thethree'] = $new_instance['thethree'];
  51.             return $instance;
  52.         }
  53.     function form($instance) {
  54.         if ( isset( $instance[ 'title' ] ) ) {
  55.             $title = $instance[ 'title' ];
  56.         }
  57.         else {
  58.             $title = '一栏三按钮';
  59.         }
  60.         global $wpdb;
  61.         $jpg_link = $instance['jpg_link'];
  62.         $bg_name = $instance['bg_name'];
  63.         $bg_link = $instance['bg_link'];
  64.         $instance = wp_parse_args((array$instancearray('theone' => '按键一'));
  65.         $theone = $instance['theone'];
  66.         $instance = wp_parse_args((array$instancearray('one_link' => '输入链接地址'));
  67.         $one_link = $instance['one_link'];
  68.         $instance = wp_parse_args((array$instancearray('thetwo' => '按键二'));
  69.         $thetwo = $instance['thetwo'];
  70.         $instance = wp_parse_args((array$instancearray('two_link' => '输入链接地址'));
  71.         $two_link = $instance['two_link'];
  72.         $instance = wp_parse_args((array$instancearray('thethree' => '按键三'));
  73.         $thethree = $instance['thethree'];
  74.         $instance = wp_parse_args((array$instancearray('three_link' => '输入链接地址'));
  75.         $three_link = $instance['three_link'];
  76. ?>
  77.     <p>
  78.         <label for="<?php echo $this->get_field_id( 'title' ); ?>">标题:</label>
  79.         <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo $title; ?>" />
  80.     </p>
  81.     <p>
  82.         <label for="<?php echo $this->get_field_id('jpg_link'); ?>">栏目链接:</label>
  83.         <input class="widefat" id="<?php echo $this->get_field_id( 'jpg_link' ); ?>" name="<?php echo $this->get_field_name( 'jpg_link' ); ?>" type="text" value="<?php echo $jpg_link; ?>" />
  84.     </p>
  85.     <p>
  86.         <label for="<?php echo $this->get_field_id('bg_name'); ?>">图片名称:</label>
  87.         <input class="widefat" id="<?php echo $this->get_field_id( 'bg_name' ); ?>" name="<?php echo $this->get_field_name( 'bg_name' ); ?>" type="text" value="<?php echo $bg_name; ?>" />
  88.     </p>
  89.     <p>
  90.         <label for="<?php echo $this->get_field_id('bg_link'); ?>">图片链接地址:</label>
  91.         <input class="widefat" id="<?php echo $this->get_field_id( 'bg_link' ); ?>" name="<?php echo $this->get_field_name( 'bg_link' ); ?>" type="text" value="<?php echo $bg_link; ?>" />
  92.     </p>
  93.     <p>
  94.         <label for="<?php echo $this->get_field_id('theone'); ?>">按键一名称:</label>
  95.         <input class="widefat"  id="<?php echo $this->get_field_id('theone'); ?>" name="<?php echo $this->get_field_name('theone'); ?>" type="text" value="<?php echo $theone; ?>" />
  96.     </p>
  97.     <p>
  98.         <label for="<?php echo $this->get_field_id('one_link'); ?>">按键一地址:</label>
  99.         <input class="widefat" id="<?php echo $this->get_field_id( 'one_link' ); ?>" name="<?php echo $this->get_field_name( 'one_link' ); ?>" type="text" value="<?php echo $one_link; ?>" />
  100.     </p>
  101.     <p>
  102.         <label for="<?php echo $this->get_field_id('thetwo'); ?>">按键二名称:</label>
  103.         <input class="widefat"  id="<?php echo $this->get_field_id('thetwo'); ?>" name="<?php echo $this->get_field_name('thetwo'); ?>" type="text" value="<?php echo $thetwo; ?>" />
  104.     </p>
  105.     <p>
  106.         <label for="<?php echo $this->get_field_id('two_link'); ?>">按键二地址:</label>
  107.         <input class="widefat" id="<?php echo $this->get_field_id( 'two_link' ); ?>" name="<?php echo $this->get_field_name( 'two_link' ); ?>" type="text" value="<?php echo $two_link; ?>" />
  108.     </p>
  109.     <p>
  110.         <label for="<?php echo $this->get_field_id('thethree'); ?>">按键三名称:</label>
  111.         <input class="widefat"  id="<?php echo $this->get_field_id('thethree'); ?>" name="<?php echo $this->get_field_name('thethree'); ?>" type="text" value="<?php echo $thethree; ?>" />
  112.     </p>
  113.     <p>
  114.         <label for="<?php echo $this->get_field_id('three_link'); ?>">按键三地址:</label>
  115.         <input class="widefat" id="<?php echo $this->get_field_id( 'three_link' ); ?>" name="<?php echo $this->get_field_name( 'three_link' ); ?>" type="text" value="<?php echo $three_link; ?>" />
  116.     </p>
  117.     <input type="hidden" id="<?php echo $this->get_field_id('submit1'); ?>" name="<?php echo $this->get_field_name('submit1'); ?>" value="1" />
  118. <?php }
  119. }
  120. add_action( 'widgets_init', create_function( '', 'register_widget( "threebtn" );' ) );

将美化小工具的css代码放进style.css里面

  1. /*增加一栏三按钮格式*/
  2. #update_version{margin:15px 15px}
  3. #update_version a{width:30%;height:35px;border-radius:3px;text-align:center;line-height:35px;font-size:9pt;margin-bottom:10px;color:#fff}
  4. .one_link{background-color:#2ba9fa}
  5. .one_link,.two_link{float:left;margin-right:5%}
  6. .two_link{background-color:#ff6969}
  7. .three_link{float:left;background-color:#70c041}
  8. #update_version img{width: 100%}

以上代码来自懿古今、知更鸟,佐语复制剪辑制作。o(∩_∩)o 哈哈!!!

该小工具适用于nana主题,其他主题自行做调整应该可以用。