저는 PHP 기반 CMS가 포함된 웹사이트를 운영하고 있으며 이 웹사이트의 유일한 사용자입니다. 웹사이트에는 등록되지 않은 사용자로부터 이메일을 받을 수 있는 간단한 문의 양식(이름, 이메일, 전화번호 및 문자)이 있습니다.
한편으로는 이 양식의 이메일을 내 이메일 계정으로 직접 전송하고 싶습니다.
반면에 사이트 컴퓨터의 IP를 양호한 목록에 넣을 것이기 때문에 적어도 한 번은 스팸 디렉토리에 문제가 없기 때문에 DNS 레코드를 설정하지 않는 것이 좋습니다.
내가 아는 한, 모든 Linux 시스템에서 (PHP mail()
기능을 통해) SMTP 프로토콜을 사용하는 기본적으로 세 가지 방법이 있습니다.
- 메일 전송 에이전트(예:
postfix
)를 설치하고 구성합니다. - 이메일 프록시 애플리케이션(예
ssmtp
:잠재적인 해커에게 보여주기ssmtp
프로그램이 해당 계정을 프록시로 사용할 수 있도록 구성 파일에 있는 프록시 이메일 계정의 주소와 비밀번호입니다 . - 이 답변에 따르면, 세 번째 방법으로 이름이 지정될 수 있습니다.메일 바이너리 파일 보내기.
그런 개념이 있나요?메일 바이너리 파일 보내기그렇다면 처음 두 옵션과 어떻게 다른가요?
답변1
PHP에서 이메일을 받는 방법에는 세 가지가 있습니다.
mail()
사람들과 대화를 나누/usr/lib/sendmail
거나 비슷한mail()
MTA와의 SMTP 대화(주로 Windows용)- phpmailer SMTP를 직접 사용하는 PHP 객체이며, TCP를 지원하는 유사한 PHP 코드입니다.
나열된 3가지 옵션은 모두 옵션 1의 변형입니다.
Postfix와 ssmtp는 모두 사용자가 호출한 후 PHP가 호출하는 sendmail 바이너리를 제공합니다 mail()
.
sendmail에 액세스하는 네 번째 방법은 를 사용하는 것입니다 popen()
. 이 방법을 사용하는 경우 모든 인수에 반드시 이 shellescape()
방법을 사용하십시오. 몇 년 전에 인수 이스케이프 실패로 인해 주요 WordPress 취약점이 있었습니다. 이로 인해 해당 기능이 에서 제거됩니다 mail()
.
모든 경우에 서버에 대한 공격이 성공하면 SMTP 자격 증명이 노출되므로 다른 시스템과 공유해서는 안 됩니다. 또는 이식할 수 없는 유형이어야 합니다(예: 서버의 SMTP 계정이 서버의 IP 주소와 연결된 경우). IMAP 비밀번호는 절대 사용하지 마세요. 비밀번호가 유출되면 신원(도메인 이름 등)이 도난당할 수 있습니다.
답변2
이것은 세 번째 방법이 아닙니다.
이는 두 가지 방법 중 첫 번째입니다.
- 봉투와 메시지를 입력으로 사용하여 잘 알려진 프로그램을 실행하거나
- 원격/로컬 SMTP 제출 서버에 대한 TCP 연결을 설정하고 SMTP 제출 프로토콜을 사용합니다.
(세 번째 방법은 다음과 같습니다.이전 메일 주입 프로토콜로컬/원격 서버로 전송되지만, SMTP 릴레이와 달리 세상은 20년 동안 적절한 SMTP 제출을 받아온 것 같습니다. )
1980년대의 오래된 BSD Sendmail 프로그램은 메일 사용자 에이전트(당시 메일 리더 및 뉴스 리더)와 다양한 하위 시스템이 메일을 통해 콘텐츠를 보고할 수 있는 매우 인기 있는 메일 하위 시스템이었지만 더 이상은 아닙니다. 메일로메시지 봉투명령줄 인수로메시지 내용(제목 및 텍스트)를 프로그램의 표준 입력으로 사용합니다. Berkeley Mail
및 AT&T 와 같은 MUA는 mailx
이전 제품과 같이 사용자 사서함에 메일을 직접 삽입하지 않습니다. 대신 관련 명령줄 매개변수를 사용하여 Sendmail을 실행하는 하위 프로세스를 분기하고 메시지 내용을 하위 프로세스로 파이프했습니다.
프로그램은 일반적으로 쉘의 명령 검색 경로에 없지만 프로그램을 실행하는 데 사용되는 전체 경로 이름이 잘 알려져 있습니다. MUA에는 일반적으로 사용자가 컴파일된 경로 이름을 재정의할 수 있는 구성 가능한 옵션이 있지만 해당 옵션이 없으면 MUA는 운영 체제에 따라 달라지는 /usr/ucb/sendmail
(또는 /usr/libexec/sendmail
, 또는 /usr/lib/sendmail
, 또는 기타 유사한 파일 이름)로 프로그램을 실행합니다. /usr/sbin/sendmail
운영 체제에서).
이것바이너리프로그램 이미지 파일에는 다음이 포함됩니다.이메일을 보내이 프로그램은 사실상의 메일 제출 솔루션이 되었습니다. BSD Sendmail을 대체한 대체 메일 전송 시스템은 결국 자체 프로그램을 제공했는데, 이 프로그램은 sendmail
다양한 시스템과 상호 운용되는 MUA에 내장된 이름이었기 때문에 여전히 호출됩니다.
물론 원본 프로그램은 MTS가 수행한 모든 작업을 수행하려고 시도했지만 헛된 단일 프로그램인 BSD Sendmail 자체였습니다. 이는 여러 가지 옵션을 통해 선택할 수 있는 다양한 모드에서 작동할 수 있습니다. 제출은 모드 중 하나일 뿐이며 기본 모드입니다.-bx
-bm
많은 대체 MTS는 이러한 방식으로 작동하지 않으며 대체 sendmail
프로그램은 기능이 다음으로 제한됩니다.오직이메일 제출.
- 특히 큐메일의 경우가 그렇습니다.
- 가장 주목할만한 점은 바로아니요예를 들어 Exim은 하나의 거대한 프로그램에서 모든 작업을 수행하고 심지어 여러 가지 기능을 추가하기도 합니다.더 멀리
-bx
표준 I/O를 통한 SMTP 제출을 위한 추가 모드를 포함하여 Sendmail의 일부 모드도 수년에 걸쳐 축적되었습니다. - Zmailer는
sendmail
또한 다양한 모드를 지원하지만 뒤에서는 여러 기본 프로그램 간에 작업을 분할합니다. - MMDF는 shim을 제공하지 않는 몇 안 되는 프로그램 중 하나이지만 사용자가 위에서 언급한 MUA 구성 설정을 사용하여
sendmail
해당 프로그램을 가리켜야 합니다 .submit
MMDF doco는 Mutt를 구성하는 방법에 대한 예를 제공합니다.sendmail='/usr/mmdf/bin/submit -mlnre' 설정
Windows NT에는 실제로 이와 같은 것이 없었기 때문에 일반적으로 다른 동작에 대해 이야기하는 크로스 플랫폼 소프트웨어를 찾을 수 있습니다. 또한 단순히 모든 호스트가 어떤 형태로든 메일 기능을 갖기를 기대하는 전통도 부족합니다. (예를 들어, 현재까지도 FreeBSD의 다양한 부분에서는 사용자와 시스템 관리자에게 정기적으로 이메일을 보낼 수 있을 것으로 기대하고 있습니다.)
(OS/2도 이런 전통이 없고 다중 사용자도 아닙니다. 그러나 BSD Sendmail 포트도 함께 제공됩니다. 저는 한때 IBM에서 제공한 것을 포함하는 OS/2용 대체 MTS를 작성한 적이 있습니다. sendmail.exe
.Zmailer와 유사하며 sendmail
, 배후에서 기본 프로그램에 아웃소싱합니다.
그러나 Unices에서는 메일 시스템이 있으면 읽은 것으로 간주됩니다. 게다가 서버가 TCP 소켓을 수신한다는 아이디어가 널리 퍼지기 전에는 이 메커니즘이 메일뿐만 아니라 표준이 되었습니다. 하나는 set-GID/set-UID 프로그램을 실행하고 명령줄 인수와 표준 입력 데이터를 제공하여 인쇄 작업을 제출하고, UUCP 작업을 예약하고, at
작업을 예약합니다.
대체 sendmail
프로그램은 일반적으로 BSD Sendmail 프로그램처럼 UID/GID를 설정하지 않습니다. (때때로 모든 메일을 다른 호스트의 큐에 푸시하는 mini-qmail 및 기타 시스템의 경우에는 set-ID 프로그램이 전혀 필요하지 않습니다. 다른 경우에는 set-ID 프로그램이 MTS의 기본 프로그램을 감싸는 래퍼입니다. 프로그램 sendmail
) 일반적으로 제출만 지원합니다. 하지만 이는 아직까지는 메일을 제출하는 두 가지 방법 중 하나입니다.
추가 읽기
답변3
옛날 옛적에 이라는 SMTP 서버가 있었습니다 sendmail
. (실제로 SMTP 서버는 여전히 존재합니다.) 오랫동안 루트 취약점으로 가득 차 있습니다. 문제가 있는 SMTP 서버를 대체하기 위해 postfix, qmail 등과 같은 다른 SMTP 서버가 등장했습니다. 한때는 sendmail
어떤 명령이든 ~/.forward
파일에 넣고, 파일이 포함된 계정으로 메일을 보내고 ~/.forward
, ~/.forward
파일에서 사용자로 모든 명령을 실행할 수 있을 정도로 나빴습니다 root
. 세상에는 아주 간단한 익스플로잇이 많이 있습니다. SMTP 서버가 너무 안전하지 않게 되기 전까지 sendmail
는 모든 곳에 존재했습니다. 따라서 많은 소프트웨어가 sendmail
.
오늘날 SMTP 서버는 sendmail
자신의 존재에 의존하는 다른 프로그램과 함께 실행할 수 있는 자체 제작 바이너리를 제공합니다. 예를 들어, Postfix SMTP 서버를 설치한 후 설명서의 첫 번째 설명은 "sendmail - Postfix to Sendmail 호환성 인터페이스"입니다. 귀하의 질문에 따르면 이는 sendmail
PHP의 바이너리를 활용하여 PHP 코드를 단순화하고 기존의 잘 구성된 SMTP 서버를 활용할 수 있음을 의미합니다. 귀하의 질문에 대해서는 sendmail
(SMTP 서버가 아닌) 기존 SMTP 서버 설치 sendmail
에 대한 래퍼 역할을 하는 바이너리 프로그램을 언급하고 계십니다. 즉, sendmail
바이너리를 사용하려면 여전히 SMTP 서버가 필요합니다.
DNS 부분은 간단합니다. MX
레코드 하나와 TXT
SPF 포함 레코드 하나만 있으면 됩니다. 기록 MX
은중간 사이즈에어엑스변경 로그. 공식적인 것은 아니지만 모두가 사용하고 있습니다. 도메인에 여러 개의 SMTP 서버가 있는 경우 번호 우선 순위가 할당됩니다. 아래 값입니다 10
. 가장 작은 숫자가 가장 높은 우선순위를 갖습니다.
SPF는에스엔더인오리치에프액자. 이 레코드는 도메인을 대신하여 메일을 보내도록 승인된 주소 또는 서브넷 목록을 게시합니다. 이렇게 하면 악의적인 발신자가 자신의 신원을 위장하기가 더 어려워지고 스팸과 사기가 줄어듭니다. 거의 모든 다른 SMTP 서버는 SPF 레코드를 구현하지 않는 도메인과 SMTP를 통해 통신하지 않습니다.
Type Host Value
MX @ 10 full.host.name
TXT @ v=spf1 mx a -all
실제로 한 기사에서 지적했듯이논평, @RubberStamp, DMARC 레코드도 현재 사용 중입니다.. 따라서 이 기술의 구현은 적극적이어야 합니다. 즉, 서비스를 원활하게 실행하는 것이 옳은 일인데 왜 중단을 기다리나요? 기차를 놓쳤다는 걸 방금 깨달았고, 어디에도 보고된 SMTP 문제가 없는 것 같아서 기록된 예가 없습니다. 하지만 나중에 돌아와서 포스팅하겠습니다.
이러한 레코드가 존재하면 Postfix, qmail, exim 등과 같은 SMTP 서버 설치 및 구성을 진행할 수 있습니다. 일단 구성되면 Open Relay Testing Tool을 사용하여 스패머가 새 SMTP 서버를 남용할 수 없도록 하십시오.
이 프로그램은 ssmtp
보내기 전용 프로그램입니다. 메일서버가 아닙니다. 메일을 보내기 전에 인증을 위해 자격 증명을 사용하여 메일 서버에 연결합니다. 누구든지 스토어에서 다운로드할 수 있습니다 ssmtp
.