2013-05-22 12 views
5

Ich experimentierte mit einem E-Mail-Python-Skript und fragte mich, ob es beim Schreiben eines Python-basierten E-Mail-Skripts weniger sicher ist, als wenn Anmeldeinformationen über das Internet gesendet werden, wenn man sich auf einer Webseite anmeldet? Im folgenden Skript, sind die Benutzer und geben Sie die clear?Python smtplib Sicherheit

import smtplib 
from email.mime.text import MIMEText 

GMAIL_LOGIN = '[email protected]' 
GMAIL_PASSWORD = 'amiexposed?' 

def send_email(subject, message, from_addr=GMAIL_LOGIN, to_addr=GMAIL_LOGIN): 
    msg = MIMEText(message) 
    msg['Subject'] = 'Test message' 
    msg['From'] = from_addr 
    msg['To'] = to_addr 

    server = smtplib.SMTP('smtp.gmail.com',587) 
    server.ehlo() 
    server.starttls() 
    server.ehlo() 
    server.login(GMAIL_LOGIN,GMAIL_PASSWORD) 
    server.sendmail(from_addr, to_addr, msg.as_string()) 
    server.close() 

if __name__ == '__main__': 
    send_email('testing email script', 'This is a test message') 
+2

Eine Sache, auf die man achten sollte - und etwas von einem Nitpick - wenn man kein Schlüssel/Cert-Paar an startls übergibt, glaube ich nicht, dass es die SSL-Signierungskette validiert, was bedeutet, dass jemand einen gefälschten SSL-Server einsetzen könnte up und posion Ihre DNS und Sie könnten SSL mit ihnen verbinden und ihnen Ihre Anmeldeinformationen geben. Wie unwahrschein- lich dies auch sein mag, es lohnt sich, darauf hinzuweisen, dass ein Neckbeard, der einen Code-Review durchführt, Sie dafür belästigt. Standardmäßig initiiert Python eine SSL-Verbindung mit einem signierten oder unsignierten Zertifikat auf der Gegenseite. Praktisch während der Entwicklung, weniger beeindruckend in der Produktion. – synthesizerpatel

+0

Um die Antwort von synthesizerpatel zu verdeutlichen, möchte ich bestätigen, dass das, was er beschreibt, ein Mann im mittleren Angriff ist und nicht unbedingt ein Angriff, bei dem Anmeldeinformationen aus dem obigen Skript von einem Benutzer erfasst und im Klartext gesendet werden (was einfach kochen bis zum Packet Sniffing). Ist das korrekt? – Kryptos

+0

Wie wäre es mit dem Code, ein Keyfile und eine certfile einzuschließen, um den Angriff zu verhindern, wie von synthesizerpatel beschrieben? Ich sehe von http://docs.python.org/3.2/library/smtplib.html, dass es eingeschlossen werden kann, aber es gibt keine Beispiele. Und eine andere Frage. Wenn ich jede dieser Zeilen in einem Terminalfenster manuell eingegeben habe, welche Schicht des OSI ist das im Gegensatz zu einer Anwendungsebene, wenn ich E-Mails über einen Mail-Client wie Thunderbird sende. – Kryptos

Antwort

4

Das hängt völlig davon ab, wie die TLS-Verbindung eingerichtet wird. Wenn Sie gültige Zertifikate benötigen (ich glaube, wenn ein Zertifikat gefunden wird, das nicht vertrauenswürdig ist), wird Ihre startTLS-Methode eine Ausnahme auslösen (ich bin mir nicht sicher, sollten Sie dies überprüfen)). Aber wenn Sie TLS einrichten und alles über die TLS-Verbindung senden, sollte alles verschlüsselt sein. Dies bedeutet, dass weder Ihr Passwort, noch Benutzername oder Ihre Nachricht und Empfänger in Klartext gesendet werden.

So nein, Ihr Benutzername und Passwort werden nicht gesendet klar.