如何测试电子邮件注入


How to test for email injection

我使用php邮件功能,我有一个表单的名称字段,电话字段,电子邮件字段和消息字段,这是一个文本区域。电子邮件字段(以及姓名和电话字段)显示在消息中,但不用于向该地址发送电子邮件。To:字段、subject:字段和From: header在脚本中是静态的,它们被设计成总是相同的。

我最近试图尝试电子邮件注入到我自己的脚本,这样我就可以知道我的预防措施是否有效。

我试着在地里种地%0ATo:mysecondemailaddress@provider.com和%0ACc:mysecondemailaddress@provider.com,但电子邮件甚至没有发送到正确的电子邮件地址。我只是想知道什么是正确的方法来做到这一点,也当我使用预防性的方法,如识别字符串,要么删除它们或拒绝电子邮件被发送什么字符,如%我也应该在寻找?

看起来不像使用表单直接进入注入工作得很好。我使用下面的代码来测试我放在一起的邮件,它发布了脚本中的数据。必须修改$postData以适应您的形式。这只是一个"受害者":

<?php
    $postData = 
        'contactname=Lord+Sauron&'.
        'email=darklord@ciplit.com.au%0ABcc:frodo@ciplit.com.au'.
        '&message=Sorry+about+that+whole+ring+thing.+No+hard+feelings%3F';
    $url = 'http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']).'/onetrueformmailer.php';
    $result = do_post_request($url, $postData);
    echo($result);


    // http://wezfurlong.org/blog/2006/nov/http-post-from-php-without-curl/
    function do_post_request($url, $data, $optional_headers = null) {
        $params = array('http' => array(
            'method' => 'POST',
            'content' => $data
        ));
        if ($optional_headers !== null) {
            $params['http']['header'] = $optional_headers;
        }
        $ctx = stream_context_create($params);
        $fp = @fopen($url, 'rb', false, $ctx);
        if (!$fp) {
            throw new Exception("Problem with $url, $php_errormsg");
        }
        $response = @stream_get_contents($fp);
        if ($response === false) {
            throw new Exception("Problem reading data from $url, $php_errormsg");
        }
        return $response;
    }
?>