【问题标题】:Connecting to a SMTP server with fsockopen from behing a proxy with PHP使用 PHP 从代理后面使用 fsockopen 连接到 SMTP 服务器
【发布时间】:2011-06-19 06:20:58
【问题描述】:

我正在尝试从代理后面连接到外部 SMTP 服务器。我想出了如何让 fsockopen 从代理后面获取网站,但不知道如何连接到 SMTP 服务器。 SMTP 服务器需要 TLS 连接以及用户名和密码身份验证。

我从代理后面获取网页的是以下代码。

<?
$proxy_fp = fsockopen('111.111.111.111', '80');

if (!$proxy_fp) {
    return false;
}

fputs($proxy_fp, "GET http://wwww.google.com HTTP/1.0\r\nHost: 111.111.111.111\r\n\r\n");
while (!feof($proxy_fp)) {
    $proxy_cont .= fread($proxy_fp, 4096);
}
fclose($proxy_fp);
$proxy_cont = substr($proxy_cont, strpos($proxy_cont, "\r\n\r\n") + 4);
return $proxy_cont;
?>

现在如何让代理连接到 SMTP 服务器?


--- 编辑 ---

<?
$s = "\r\n";

$proxy = '24.47.131.253';
$port = 8123;

$fp = fsockopen($proxy, $port);
socket_set_timeout($fp, 10, 0);

fputs($fp, "CONNECT smtp.domain.com:25 HTTP/1.0".$s.$s);

while(!feof($fp)){
    $line = fgets($fp, 4000);
    echo $line."\n";
}
fclose($fp);
?>

我现在有了这个基于答案。问题是我没有从 SMTP 服务器得到响应,它只是打印空行。有人能指出我正确的方向吗?

【问题讨论】:

    标签: php proxy smtp fsockopen


    【解决方案1】:

    SMTP 和 HTTP 不是相互兼容的协议;事实上,它们彼此完全不同。

    您可以尝试使用HTTP CONNECT 方法中的漏洞:发送CONNECT yourserver:yourport HTTP/1.0 而不是GET 或POST - 您应该获得到请求的主机和端口的TCP 连接(see this 以获得更完整的参考)。请注意,某些代理会将允许的目标端口限制为 443 (HTTPS) 或以其他方式检查 CONNECT 流量,以防止人们通过隧道访问任何服务(例如 SMTP)。

    请注意,在大多数组织中,此类操作可能会被解释为“规避访问控制和/或安全策略”,因此请谨慎行事。

    【讨论】:

    • 可以,使用 HTTP CONNECT 方法。
    • @user576875:不可靠 - CONNECT 已实现用于转发 HTTPS 连接;将其用于其他协议充其量是不可靠的。
    • 这不是不可靠的,它就像魅力一样,即使对于 SSH 访问也是如此。唯一的问题是:防火墙是否接受出站 SMTP 连接。因为这将决定它是否有效。
    • @wimvds:嗯,很有趣。也许我尝试过的代理以某种方式阻止了非 HTTPS 流量?
    • 好吧,为了通过防火墙,我只需在端口 443 (https) 上运行 SSH。这应该适用于大多数(如果不是全部)公司防火墙。
    猜你喜欢
    • 2013-08-21
    • 2013-04-23
    • 2012-02-21
    • 2018-07-05
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    相关资源
    最近更新 更多