3

我想使用 CakePHP 框架在 php 和 mysql 上运行一个 web 应用程序。并且为了将使用该站点的门槛保持在非常低的位置,我不想使用带有用户名/密码的标准登录。(而且我也不想用 OpenID 之类的东西来打扰我的用户。转到用户类型。)

所以我认为用户应该能够通过向 login@domain.com 发送电子邮件来登录,而无需主题或内容。作为回复,他们将收到一封电子邮件,其中包含一个可以让他们登录的链接(它将包含一个哈希)。此外,我会让用户在根本不访问该站点的情况下执行一些操作,只需发送一封带有 command@domain.com 的电子邮件,命令就会被执行。我会假设用户和他们的电子邮件提供商会照顾他们的电子邮件帐户安全,因此在我的网站上不需要它。

现在,我如何从电子邮件发送到人类未阅读的帐户到被触发一些脚本(基本上是“虚拟浏览器客户端”调用 url(并且 cakephp 将处理其余部分)?


我以前从未使用过 cron 工作,但我确实认为我了解它们的目的或它们通常是如何工作的。我不能让随机访问该站点的人调用该脚本,因为该解决方案由于多种原因无法正常工作。如果有人对此有任何意见,我想我想更多地了解让脚本作为对收到的电子邮件的响应而运行的可能性。如果它作为 cron 作业运行,它只会每 X 分钟检查一次,并且用户的响应会滞后(如果我理解正确的话)。

由于不同的命令会有不同的电子邮件地址,例如登录@domain.com,我知道根据发件人的电子邮件该做什么以及如何做,我什至不需要电子邮件中的内容、主题或任何其他标题.


这个应用程序的安全性有很多担忧,我理解这些问题,但在不泄露我的概念的情况下,我认为这对我正在做的事情来说不是一个大问题。另外关于可用性问题,真的没有。如果/当他们需要和另一个命令时,它只是登录以提供用户配置文件的更改。这是主要的电子邮件,很容易记住,也是整个概念的开始。

4

10 回答 10

7

我已经成功地使用了pop3 php 类(还有一个Pear POP3 模块)。

使用 pop3 类看起来像这样:

require ('pop3.php');

$pop3 = new pop3_class();
$pop3->hostname = MAILHOST;
$pop3->Open();
$pop3->Login('myemailaddress@mydomain.com', 'mypassword');

foreach($pop3->ListMessages("","") as $msgidx => $msgsize)
{
    $headers = "";
    $body = "";

    $pop3->RetrieveMessage($msgidx, $headers, $body, -1);
}

我用它来监控一个输入数据库的 POP3 邮箱。

它被一个 cronjob 调用,该 cronjob 使用 wget 将 url 调用到我的 php 脚本。

*/5 * * * * "wget -q --http-user=me --http-passwd=pass 'http://mydomain.com/mail.php'" >> /dev/null 2>&1

编辑

我一直在考虑您是否需要让用户通过电子邮件发送某些站点命令。

拥有多个命令可以发送到的单个地址而不是拥有多个地址不是更容易吗?

我认为安全问题也很有效。除非命令是非破坏性的或不执行任何特定于用户的操作,否则系统将对知道如何欺骗电子邮件地址的任何人开放(这将是每个人 :) )。

于 2008-09-05T20:08:59.613 回答
3

您将需要某种 CronJob/Timer 服务来定期检查邮箱然后对其进行操作。或者,您应该检查邮件服务器是否可以在邮件到达时运行脚本(即查看是否可以放入垃圾邮件过滤器脚本并“滥用”该功能来调用您的脚本)。

使用纯 PHP,您大多不走运,因为需要触发脚本。在一个流量很大的页面上,你可以让你的 index.php 或任何东西做检查,但是当很长一段时间没有人访问你的网站时,邮件将不会发送,你必须小心“种族条件”当多人同时访问脚本时。

编辑:请记住一个可用性缺陷:拥有多台 PC 且每台都没有电子邮件客户端的人。例如,我使用 4 台 PC,但只有 1 台(我的主要一台)安装了 Mail Client,而我使用 Webmail 来检查其他的。现在,通过 Webmail 登录和发送邮件并不是最大的可用性 - 为了使用您的站点,我首先必须登录到另一个站点,通过大多数 Webmail 工具具有的蹩脚界面撰写邮件并等待答复。也可以在那里使用 OpenID :-)

于 2008-09-05T20:07:42.580 回答
3

如果您的服务器允许,当邮件到达某个地址时,您可以使用.forward文件或Procmail启动进程(php 或任何东西)。

于 2008-09-08T12:18:19.703 回答
1

您不想用 OpenID 打扰用户,但您希望他们处理这个电子邮件方案。首先,电子邮件可能需要很长时间才能通过。没有任何保证电子邮件会送达的时间。甚至不能保证电子邮件会到达那里。我知道事情通常很快,但通常需要 10 分钟才能完成往返行程。此外,除非您对电子邮件进行加密,否则您发回的链接是公开发送的。这意味着任何人都可以使用该链接登录。这取决于您想要的安全程度,这可能是也可能不是问题,但这绝对是值得考虑的事情。使用像这样的非标准登录方法将比它可能的价值多得多,而且我真的看不出整个过程有什么好处。

于 2008-09-08T12:37:43.200 回答
1

我也在考虑使用 procmail 来启动一些脚本。还有formail,它可能会派上用场来更改或提取标题。如果您对邮件服务器具有管理员访问权限,您还可以使用 /etc/aliases 并通过管道传输到您的脚本。

除了可用性问题之外,您还应该真正考虑安全性 - 使用虚假发件人地址发送电子邮件实际上非常简单,所以我不会依赖它来处理任何关键问题。

于 2008-09-08T12:46:46.033 回答
1

我同意所有的安全问题。当涉及到发件人的电子邮件地址时,您认为“用户及其电子邮件提供商负责他们的电子邮件帐户安全”的假设是不正确的。

但是,由于您特别询问“我如何从电子邮件发送到人类未阅读的帐户到被触发某些脚本”,我建议使用 procmail 将传入的电子邮件传递到您编写的脚本。

我不会调用 URL。我会让脚本通过阅读在标准输入上发送的消息来执行工作。这样,网站上的任何人都无法访问该脚本。

要进行此设置,您提供给用户的电子邮件地址必须与系统上的真实用户相关联。在该用户的主目录中,创建一个名为“.procmailrc”的文件

在该文件中,添加以下两行:

:0 hb:
| /path/to/program

其中 /path/to/program 是用于处理传入消息的脚本或程序的完整路径。然后使用如下代码创建脚本:

#!/usr/bin/php
<?php

$fp=fopen('php://stdin','r');
while($line = fgets($fp)) {
    [do something with each $line of input here]
}

?>

电子邮件不会保留在邮箱中,因此如果您想保存或记录它,请让脚本执行此操作。

——
布鲁斯

于 2008-09-10T20:46:10.107 回答
0

我会认真重新考虑这种方法。电子邮件没有很高的可靠性。有各种各样的垃圾邮件过滤器可能会拦截带有链接的电子邮件,从而使“命令”半途而废,更不用说安全风险了。

在电子邮件中欺骗发件人地址非常容易。你基本上是在向任何人开放你的系统。

此外,您突然要求用户记住要放在电子邮件地址前面的命令列表,而不是用户名/密码组合。最好为他们提供用户名/密码,然后允许他们访问帮助页面。

换句话说,该方案的可用性和安全性得分很低。

我真的找不到这种方法的任何优势,甚至几乎超过了巨大的劣势。

于 2008-09-08T12:52:45.097 回答
0

防止垃圾邮件的一种解决方案是,确保第一行、最后一行或特定行包含某个字符串,几乎就像密码一样,但最好是完整的句子。

只有你有一个字或字,很安全,只要记得删除使用后的邮件和那些没有密码的邮件。

于 2008-09-16T19:57:44.760 回答
0

除了安全性和可用性之外,电子邮件传递可能是另一个问题。根据用户的电子邮件提供商,电子邮件传递可能会延迟几分钟到几个小时。

于 2008-09-17T17:30:12.330 回答
0

thedailywtf.com上有一个关于设计软件的非常好的教育故事。提出的问题应该通过适当的设计来解决,而不是通过 techo-woopla。

亚历山大,请阅读链接的故事并思考手套,而不是电子邮件驱动的网页浏览。

PHP 不是锤子

于 2008-09-17T18:44:44.020 回答