이메일을 통해 웹 애플리케이션을 제어하는 ​​방법은 무엇입니까?아니면 이메일을 보내 PHP 스크립트를 실행하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/46777

  •  09-06-2019
  •  | 
  •  

문제

CakePHP 프레임워크를 사용하여 php와 mysql에서 웹 애플리케이션을 실행하고 싶습니다.그리고 사이트 이용 기준을 매우 낮은 수준으로 유지하기 위해 사용자 이름/비밀번호를 사용한 표준 로그인을 사용하지 않기를 원합니다.(그리고 OpenID와 같은 것으로 사용자를 괴롭히고 싶지도 않습니다.사용자 유형으로 이동합니다.)

그래서 제목이나 내용 없이 login@domain.com으로 이메일을 보내면 로그인이 가능하지 않을까 생각합니다.그리고 응답자는 로그인할 수 있는 링크가 포함된 이메일을 받게 됩니다(해시가 포함됨).또한 사용자가 사이트를 전혀 방문하지 않고도 몇 가지 작업을 수행할 수 있도록 하고, command@domain.com으로 이메일을 보내면 명령이 실행됩니다.사용자와 이메일 제공업체가 이메일 계정 보안을 관리하므로 내 사이트에서는 보안이 필요하지 않다고 가정하겠습니다.

이제 인간이 읽지 않는 계정으로 이메일을 보낸 후 일부 스크립트가 실행되도록 하려면 어떻게 해야 합니까(기본적으로 "더미 브라우저 클라이언트"가 URL을 호출하고 cakephp가 나머지를 처리합니다)?


저는 이전에 cron 작업을 사용해 본 적이 없지만 그 목적이나 일반적으로 작동하는 방식을 이해하고 있다고 생각합니다.여러 가지 이유로 해당 솔루션이 작동하지 않기 때문에 사이트를 방문하는 임의의 사람들이 스크립트를 호출하도록 할 수 없습니다.누군가가 이에 대한 의견을 가지고 있다면 들어오는 이메일에 대한 응답으로 스크립트를 실행할 수 있는 가능성에 대해 더 듣고 싶습니다.cron 작업으로 실행되는 경우 X분마다 확인하고 사용자는 응답이 지연될 수 있습니다(제가 올바르게 이해한 경우).

다음과 같은 명령마다 이메일 주소가 다르기 때문에 로그인@domain.com과 저는 보낸 사람의 이메일을 기반으로 무엇을 해야 하는지, 어떻게 해야 하는지 알고 있습니다. 이메일의 내용, 제목 또는 기타 헤더도 필요하지 않습니다.


이 애플리케이션의 보안에 대한 걱정이 많습니다. 문제를 이해하지만 제 개념을 포기하지 않고 제가 하는 일에 큰 문제라고 생각하지 않습니다.또한 유용성 문제에 대해서는 실제로 아무 것도 없습니다.필요한 경우 사용자 프로필에 대한 변경 사항을 제공하기 위해 로그인하고 다른 명령 하나를 사용하면 됩니다.그리고 이것은 주요 이메일이며 기억하기 매우 쉽고 이 전체 개념의 시작입니다.

도움이 되었습니까?

해결책

나는 pop3 PHP 클래스 큰 성공을 거두었습니다(또한 배 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 메일함을 모니터링하는 데 사용합니다.

wget을 사용하여 내 PHP 스크립트에 대한 URL을 호출하는 cronjob에 의해 호출됩니다.

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

편집하다

저는 사용자가 특정 사이트 명령을 이메일로 보내도록 해야 할 필요성에 대해 생각해 왔습니다.

여러 개의 주소를 갖는 것보다 여러 명령을 보낼 수 있는 단일 주소를 갖는 것이 더 쉽지 않을까요?

보안 문제도 꽤 타당하다고 생각합니다.명령이 비파괴적이거나 사용자와 관련된 작업을 수행하지 않는 한, 시스템은 이메일 주소를 스푸핑하는 방법을 아는 모든 사람(모든 사람이 해당)에게 활짝 열려 있습니다.

다른 팁

사서함을 정기적으로 확인한 다음 그에 따라 조치를 취하는 일종의 CronJob/Timer 서비스가 필요합니다.또는 메일이 도착할 때 스크립트를 실행할 수 있는지 메일 서버를 확인해야 합니다(예:spamfilter-script를 삽입하고 해당 기능을 "남용"하여 대신 스크립트를 호출하는 것이 가능한지 확인하십시오.

순수 PHP를 사용하면 스크립트를 트리거해야 하기 때문에 대부분 운이 좋지 않습니다.트래픽이 많은 페이지에서는 index.php 등을 사용하여 검사할 수 있지만 오랫동안 아무도 사이트를 방문하지 않으면 메일이 전송되지 않으며 "경주"에 주의해야 합니다. 조건'은 여러 사람이 동시에 스크립트에 액세스할 때 발생합니다.

편집하다: 한 가지 유용성 결함을 염두에 두십시오.여러 대의 PC를 보유하고 있으며 모든 PC에 전자 메일 클라이언트가 없는 사람들.예를 들어, 저는 4대의 PC를 사용하는데 1대(주 PC)에만 메일 클라이언트가 설치되어 있고 다른 PC는 웹메일을 사용하여 확인합니다.이제 로그인하고 웹 메일을 통해 메일을 보내는 것은 가장 유용하지 않습니다. 귀하의 사이트를 사용하려면 먼저 다른 사이트에 로그인하고 대부분의 웹 메일 도구가 가지고 있는 형편없는 인터페이스를 통해 메일을 작성하고 답변을 기다려야 합니다.OpenID를 사용할 수도 있습니다 :-)

서버에서 허용하는 경우 다음을 사용할 수 있습니다. .앞으로 파일 또는 프로메일 메일이 특정 주소에 도착하면 프로세스(php 등)를 시작합니다.

OpenID로 사용자를 번거롭게 만들고 싶지는 않지만 이러한 이메일 체계를 처리하기를 원합니다.첫째, 이메일을 처리하는 데 시간이 오래 걸릴 수 있습니다.이메일이 전달될 것이라는 보장된 시간은 없습니다.이메일이 거기에 도착할 것이라는 보장도 없습니다.일반적으로 일이 빠르다는 것을 알고 있지만 왕복을 완료하는 데 최대 10분이 걸리는 경우도 많습니다.또한 이메일을 암호화하지 않는 한, 다시 보내는 링크는 공개된 상태로 전송됩니다.즉, 누구나 해당 링크를 사용하여 로그인할 수 있습니다.얼마나 보안을 원하는지에 따라 이는 문제가 될 수도 있고 아닐 수도 있지만 확실히 생각해 볼 문제입니다.이와 같은 비표준 로그인 방법을 사용하는 것은 가치 있는 것보다 훨씬 더 많은 작업이 될 것이며 전체 프로세스에서 어떤 이점도 실제로 볼 수 없습니다.

나는 또한 procmail을 사용하여 일부 스크립트를 시작하려고 생각했습니다.헤더를 변경하거나 추출하는 데 유용할 수 있는 formail도 있습니다.메일 서버에 대한 관리자 액세스 권한이 있는 경우 /etc/aliases를 사용하여 스크립트로 파이프할 수도 있습니다.

유용성 문제 외에도 보안에 대해 정말로 생각해야 합니다. 실제로 가짜 보낸 사람 주소로 이메일을 보내는 것은 매우 간단하므로 중요한 일에 대해서는 그것에 의존하지 않을 것입니다.

나는 모든 보안 문제에 동의합니다.발신자의 이메일 주소와 관련하여 "사용자와 이메일 제공업체가 이메일 계정 보안을 관리한다"는 가정은 올바르지 않습니다.

그러나 "사람이 읽지 않는 계정으로 이메일을 보내서 일부 스크립트가 실행되도록 하려면 어떻게 해야 합니까?"라고 구체적으로 물으셨으므로 procmail을 사용하여 수신 이메일을 작성한 스크립트로 전달하는 것이 좋습니다.

나는 URL을 호출하지 않을 것입니다.stdin으로 전송된 메시지를 읽어서 스크립트가 작업을 수행하도록 할 것입니다.이렇게 하면 웹사이트의 누구도 스크립트에 액세스할 수 없습니다.

이를 설정하려면 사용자에게 제공하는 이메일 주소는 시스템의 실제 사용자와 연관되어야합니다.해당 사용자의 홈 디렉터리에 ".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]
}

?>

전자 메일 메시지는 사서함에 남아 있지 않으므로 저장하거나 기록하려면 스크립트를 사용하여 수행하십시오.

--
브루스

나는 이 접근법을 진지하게 재고해 볼 것이다.이메일은 그다지 높은 신뢰도를 얻지 못했습니다.보안 위험은 말할 것도 없고 링크가 포함된 전자 메일을 가로채서 "명령"을 반쯤 완성한 상태로 만드는 모든 종류의 스팸 필터가 있습니다.

이메일에서 보낸 사람 주소를 속이는 것은 매우 쉽습니다.기본적으로 누구에게나 시스템을 공개하고 있습니다.

또한 사용자 이름/비밀번호 조합 대신 갑자기 사용자에게 이메일 주소 앞에 입력할 명령 목록을 기억하도록 요구합니다.사용자 이름/비밀번호를 제공한 다음 도움말 페이지에 대한 액세스 권한을 부여하는 것이 더 좋습니다.

즉, 이 체계의 유용성과 보안 점수는 매우 낮습니다.

나는 실제로 이 접근 방식에서 엄청난 단점을 능가하는 어떤 장점도 찾을 수 없습니다.

스팸을 방지하는 한 가지 솔루션은 첫 번째 줄, 마지막 줄 또는 특정 줄에 비밀번호와 거의 같은 특정 문자열이 포함되어 있는지 확인하는 것입니다. 하지만 전체 문장이 더 좋습니다.

당신만이 단어를 가지고 있고 꽤 안전합니다. 사용 후 메일과 비밀 라인이 없는 메일을 삭제하는 것을 잊지 마세요.

보안 및 유용성 외에도 이메일 전달은 또 다른 문제가 될 수 있습니다.사용자의 이메일 제공업체에 따라 이메일 전달이 몇 분에서 몇 시간까지 지연될 수 있습니다.

정말 좋은 교육적인 이야기가 있어요 thedailywtf.com 소프트웨어 설계에 대해제기된 질문은 테크우프라가 아닌 제대로된 디자인으로 해결되어야 합니다.

알렉산더, 링크된 이야기를 읽고 이메일 기반 웹페이지 탐색이 아닌 장갑을 끼고 생각하십시오.

PHP는 망치.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top