> Zencart中文手册 > 关闭zen cart的"tell a friend"发送邮件功能

zen cart的漏洞和它一样流行.但是因特网上还是有N多的站没有升级,即使有补丁发布,那些漏洞依然大门敞开,再好的系统管理员也无用,因为后门总是开着啊.

 

今天碰到这样的一个问题

 

在新产生新订单时,magento后台没有发确认信。我直接的反应是不可能啊,因为一直都很正常啊,而且没有修改过代码?仔细一想,还有一个可以肯 定就是昨天有收到一封邮件,一个客户说收到了新订单确认邮件,但是没有进入付款页面。所以这就有茅盾。进一步确认是magento网站的contact us可以发出邮件。

 

查看mailog发现服务器在发大量的邮件。怀疑服务器让人利用发垃圾邮件,首先想到的是zen cart网站。查看apache的日志,确认发现有对zen cart的tell-a-friend页面的大量访问量。

 

关闭sendmail

清空

/var/spool/mqueue

/var/spool/clientqueue

将发垃圾邮件的IP从apache的access log中提取,暂时用iptable规则drop掉所来息这几个IP的的请求

启动sendmail

最重要的是如何完全的zen cart的给朋友发邮件推荐产品的功能彻底关闭掉

 

首先,关闭掉所有产品页面的"tell a friend”按钮

菜单Catalog 子菜单 Product Types 点击 Edit Layout  按钮 在页面中选择 Show Product Tell A Friend Button 这个选项编辑,修改为 false然后单击 update 保存

 

其次,关闭掉所有的"tell a friend”的sidebox

选项菜单Tools 子菜单  Layout Box Controller,在页面中找到 "sideboxes/tell_a_friend.php",选中所有的off,保存

 

这其实还不够,知道地址的人还是可以进入到发邮件的页面。所以,要在代码中禁用发邮件的功能。这不可能,因为发邮件的功能还是要用的。那什么办?有两个选项:

 

1,利用zen cart自带的配置机制,但是在后台是无法做到的,我是在查看代码之后看注释看到的

我用grep -r 'mail(' includes搜索php的mail函数,找到文件 includes/functions/functions_email.php,看到这段代码

...

...

/**
 * Send email (text/html) using mime. This is the central mail function.
 * If using "PHP" transport method, the SMTP Server or other mail application should be configured correctly in server's php.ini
 *
 * @param string $to_name           The name of the recipient, e.g. "Jim Johanssen"
 * @param string $to_email_address  The email address of the recipient, e.g. john.smith@hzq.com
 * @param string $email_subject     The subject of the eMail
 * @param string $email_text        The text of the email, may contain HTML entities
 * @param string $from_email_name   The name of the sender, e.g. Shop Administration
 * @param string $from_email_adrdess The email address of the sender, e.g. info@myzenshop.com
 * @param array  $block             Array containing values to be inserted into HTML-based email template
 * @param string $module            The module name of the routine calling zen_mail. Used for HTML template selection and email archiving.
 *                                  This is passed to the archive function denoting what module initiated the sending of the email
 * @param array  $attachments_list  Array of attachment names/mime-types to be included  (this portion still in testing, and not fully reliable)
**/
  function zen_mail($to_name, $to_address, $email_subject, $email_text, $from_email_name, $from_email_address, $block=array(), $module='default', $attachments_list='' )

...

...

// ignore sending emails for any of the following pages
    // (The EMAIL_MODULES_TO_SKIP constAnt can be defined in a new file in the "extra_configures" folder)

    if (defined('EMAIL_MODULES_TO_SKIP') && in_array($module,explode(",",constant('EMAIL_MODULES_TO_SKIP')))) return false;

    // check for injection attempts. If new-line characters found in header fields, simply fail to send the message
    foreach(array($from_email_address, $to_address, $from_email_name, $to_name, $email_subject) as $key=>$value) {
      if (eregi("/r",$value) || eregi("/n",$value)) return false;
    }

...

...

我先是看到$module参数,虽然注释说是为了调用模板之用,但是我想即使zen cart没做,我们自己要修改也应该是要利用这个参数来实现。但是从  (The EMAIL_MODULES_TO_SKIP constant can be defined in a new file in the "extra_configures" folder) 表明,我们只要在extra_configures目录下定义一个EMAIL_MODULES_TO_SKIP这个常量就OK了,我是这样做的:

 

 define('EMAIL_MODULES_TO_SKIP', 'tell_a_friend,tell_a_friend_extra');

 

不过,在我测试的这个版本中,1.3.8中即使这样设置后,也会提示发送成功,但是其实是没有发送的。

 

另外一种方法就是禁止对tell_a_friend页面的请求,或者通过mod_rewrite将对这个页面的请求重定向到产品页或首页。