PHP-Skript-Aufrufherkunft

Hallo,

ich habe da ein etwas größeres Problem. Ich hatte mir ein Skript geschaffen, das eigentlich zum Versenden von Feedbackformularen gedacht war. Das Skript an sich funktioniert auch recht gut. Leider haben irgendwelche dunklen Gestalten das Skript entdeckt und es zum Spamen mißbraucht, was natürlich mein Provider nicht so gut gefunden hat. Jetzt suche ich nach einer Möglichkeit, das Skript so abzuändern, daß sich an der Funktion an sich nichts ändert, aber trotzdem verhindert wird, daß irgendwer ausser dem eben diesem Eingabeformular von eben genau dieser Homepage das Skript aufrufen kann.
Für mich stellt sich also die Frage, ob ich überprüfen kann, woher der Skriptaufruf und die zugehörigen Daten kommen.

Gruß

Thomas

Hallo Thomas,

den http Referer bekommst du mit $_SERVER[‚HTTP_REFERER‘], ich würde jedoch noch ne 2. sicherheitsmassnahme einbauen in der du prüfst ob die ip in der letzten stunde schon ne mail verschickt hat.

Gruß
Phillip

Hallo Philip,

den http Referer bekommst du mit $_SERVER[‚HTTP_REFERER‘],

gut, muß ich mal testen, was diese Variable so hergibt. Wie kann ich das dann mit der Webseite abgleichen, die das Skript aufruft?

ich würde jedoch noch ne 2. sicherheitsmassnahme einbauen in der
du prüfst ob die ip in der letzten stunde schon ne mail
verschickt hat.

Welche IP meinst Du? Die dessen, der das Kontaktformular ausfüllt? Wenn ja, wie sollte das gehen? For allem könnte es ja sein, daß tatsächlich einmal einer an verschiedene Ansprechpartner per Kontaktformular was verschiecken will. Allerdings wären da das auch maximal 2 Aufrufe pro Minute. Das könnte eine Idee sein. Könntest Du mir da noch genauere Tips Liefern?

Gruß

Thomas

Gruß
Phillip

Ich speichere meine ganzen Besuche in der Datenbank!
$verboten = 0;
$timestamp = time()-(10*60); //Aktuelle Zeit -10 min
$datum = date(„Y-m-d H:i:s“,$timestamp);
$logs = mysql_query(„SELECT * FROM logs WHERE zeit > ‚$datum‘“);
while($schleife = mysql_fetch_assoc($logs)){
if($schleife[„ip“] == $HTTP_SERVER_VARS[„REMOTE_ADDR“])
$verboten = 1;
}

if($verboten == 1){
.
.
.
.
}
else {
.
.
.
.
}

Hallo Thomas,

klar kann es sein das ein IP 2 mal auf das Formular zugreift nur musst du das in Relationen sehen.

Wie Warscheinlich ist es das 2 unterschiedliche Personen von einer IP auf deine Homepage zugreifen und dann noch ein Feedback an dich schicken wollen.

Aktuell hast du ein Problem mit Spammern, da hilft dir nicht unbedingt die Referer Abfrage, ich würde auf jedem fall noch einen IP Check oder eine Grafik einbauen die auf einen Bot prüft.

Gruß
Phillip

Hallo Phillip,

klar kann es sein das ein IP 2 mal auf das Formular zugreift
nur musst du das in Relationen sehen.

Wie Warscheinlich ist es das 2 unterschiedliche Personen von
einer IP auf deine Homepage zugreifen und dann noch ein
Feedback an dich schicken wollen.

Es kann ja auch die gleiche Person sein. Das selbe gilt ja für Kontaktformulare. Immerhin kann es ja vorkommen, daß sogar die selbe Person Nachrichten an verschiedene Leute schicken möchte. Aber auch das sollte ich dann auf max. 2 Aufrufe pro Minute beschränken. Somit wird das für Spamer schon mal uninteressanter.
Bleibt aber immer noch die Frage, wie bekomme ich die IP-Adresse desjenigen heraus, der das Formular ausfüllt. Das Formular selbst ist ja reiner HTML-Code. Dieses Formular an sich ruft ja über „Absenden“ erst wieder das Skript auf.

Aktuell hast du ein Problem mit Spammern, da hilft dir nicht
unbedingt die Referer Abfrage, ich würde auf jedem fall noch
einen IP Check oder eine Grafik einbauen die auf einen Bot
prüft.

Mein Problem ist nicht, daß die mich zuspammen, sondern, daß die mein Skript dazu mißbrauchen, den Mailserver meines Providers für ihre eigenen Spams an x-beliebige Empfänger zu benutzen.
Ich müßte also nur sicherstellen können, daß der Skriptaufruf auch tatsächlich von dieser Webseite mit dem Kontaktformular stammt und nicht von irgendeiner x-beliebigen Webseite.

Gruß

Thomas

Hallo doeneraffe,

die Abfrage an sich ist ja mal absolut simple. Bleibt aber immer noch die Frage, wie ich die IP des „Formularausfüllers“ bekomme.

Gruß

Thomas

Das hab ich davor geschrieben

if($schleife[„ip“] == $HTTP_SERVER_VARS[„REMOTE_ADDR“])

Das haste deine IP Addresse O.o

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Phillip,

klar kann es sein das ein IP 2 mal auf das Formular zugreift
nur musst du das in Relationen sehen.

Wie Warscheinlich ist es das 2 unterschiedliche Personen von
einer IP auf deine Homepage zugreifen und dann noch ein
Feedback an dich schicken wollen.

Es kann ja auch die gleiche Person sein. Das selbe gilt ja für
Kontaktformulare. Immerhin kann es ja vorkommen, daß sogar die
selbe Person Nachrichten an verschiedene Leute schicken
möchte. Aber auch das sollte ich dann auf max. 2 Aufrufe pro
Minute beschränken. Somit wird das für Spamer schon mal
uninteressanter.

warum soll per kontaktformular an jemand anderen als an dich versendet werden sollen?
dafür gibt es emails :wink:

Bleibt aber immer noch die Frage, wie bekomme ich die
IP-Adresse desjenigen heraus, der das Formular ausfüllt. Das
Formular selbst ist ja reiner HTML-Code. Dieses Formular an
sich ruft ja über „Absenden“ erst wieder das Skript auf.

Datei in php umbenennen und per var $_SERVER[‚REMOTE_ADDR‘] die ip speicher

Aktuell hast du ein Problem mit Spammern, da hilft dir nicht
unbedingt die Referer Abfrage, ich würde auf jedem fall noch
einen IP Check oder eine Grafik einbauen die auf einen Bot
prüft.

Mein Problem ist nicht, daß die mich zuspammen, sondern, daß
die mein Skript dazu mißbrauchen, den Mailserver meines
Providers für ihre eigenen Spams an x-beliebige Empfänger zu
benutzen.

was eigentlich noch nen größeres problem ist da du in dem augenblick ein möglichkeit zum spammen geschafen hast

Ich müßte also nur sicherstellen können, daß der Skriptaufruf
auch tatsächlich von dieser Webseite mit dem Kontaktformular
stammt und nicht von irgendeiner x-beliebigen Webseite.

ich würde einfach per grafik und feldeingabe überprüfen ob da ein mensch oder ein bot hintersitz damit sollte das klappen.

siehe auch http://de.wikipedia.org/wiki/Captcha

Gruß
Phillip

Hallo Phillip,

warum soll per kontaktformular an jemand anderen als an dich
versendet werden sollen?
dafür gibt es emails :wink:

Eben genau nicht. Ich möchte jemandem eine Kontaktmöglichkeit schaffen, der eben nicht unbedingt selber eine E-Mailadresse besitzt sondern die Seite z.B. in einem Internetcafe aufruft oder bei jemandem anderes am PC.
Das Kontaktformular ist ja dazu da, daß man mit irgendeinem der möglichen Ansprechpartner Kontakt aufnehmen kann. Da dies aber für viele verschiedene Internetseiten möglichst einfach zu verwenden sein soll, ohne daß jemand jedesmal das Skript abändern muß, wenn sich hier ein Ansprechpartner ändert, wird der Empfänger des Kontaktformularmails per Parameter im Kontaktformular mit übergeben.

Ich müßte nur irgendwie sicherstellen, daß nur dann Mails raus gehen, wenn sich das Kontaktformular und das Skript in der selben Domain befinden.

Datei in php umbenennen und per var $_SERVER[‚REMOTE_ADDR‘]
die ip speicher

Hm… Das wäre eine Möglichkeit.

was eigentlich noch nen größeres problem ist da du in dem
augenblick ein möglichkeit zum spammen geschafen hast

Ja, da hast Du leider Recht. Sowas gibt massig Ärger.

ich würde einfach per grafik und feldeingabe überprüfen ob da
ein mensch oder ein bot hintersitz damit sollte das klappen.

Die Idee dahinter kenne ich, aber mir ist nicht recht klar, wie ich das einbauen sollte.

Gruß

Thomas

Hallo,

mit einem Formular auf meiner Homepage hatte auch ein solches Problem, zwar konnte man damit nicht an andere Mailadressen senden, aber ich selbst habe ständig SPAM bekommen.

Das solltest du als erstes ändern: Mails über das Formular gehen nur an Dich ! Achte auch darauf, die Eingabedaten wie in FAQ:2435 beschrieben zu prüfen.

Eine Sperre von x-mal innerhalb von y Minuten pro IP nur zu versenden hat bei mir leider nicht wirklich Erfolg gebracht, weil über Botnetze gespammt wurde, jeder Bot mit anderer IP. Jetzt habe ich (obwohl ich das eigentlich nicht so toll finde) doch auf ein Captcha ( http://www.jtr.de/scripting/php/classes/captcha/inde… ) zurückgegriffen.

Alexander

Hallo Phillip,

warum soll per kontaktformular an jemand anderen als an dich
versendet werden sollen?
dafür gibt es emails :wink:

Eben genau nicht. Ich möchte jemandem eine Kontaktmöglichkeit
schaffen, der eben nicht unbedingt selber eine E-Mailadresse
besitzt sondern die Seite z.B. in einem Internetcafe aufruft
oder bei jemandem anderes am PC.
Das Kontaktformular ist ja dazu da, daß man mit irgendeinem
der möglichen Ansprechpartner Kontakt aufnehmen kann. Da dies
aber für viele verschiedene Internetseiten möglichst einfach
zu verwenden sein soll, ohne daß jemand jedesmal das Skript
abändern muß, wenn sich hier ein Ansprechpartner ändert, wird
der Empfänger des Kontaktformularmails per Parameter im
Kontaktformular mit übergeben.

nun ja… eine emailadresse anlegen ist nicht schwer und geht auch aus dem internetcafe… wie soll ich zu jemanden kontakt aufnehmen wenn diese person keine möglichkeit zum antworten hat. wie gesagt, so ein mailformular ist so ziemlich das größte sicherheitsrisiko was du dir auf einer homepage einbauen kannst.

Hallo Phillip,

nun ja… eine emailadresse anlegen ist nicht schwer und geht
auch aus dem internetcafe…

Ja schon, nur was nutzt jemanden eine E-Mailadresse, wenn er später eben nicht mehr vor dem Computer sitzt und die Mails sowieso nicht mehr abfragen kann? Soll sich der dann einen E-Mailaccount anlegen, nur um einmalig ein Mail zu verschicken?

wie soll ich zu jemanden kontakt
aufnehmen wenn diese person keine möglichkeit zum antworten
hat.

Die Kontaktmöglichkeit besteht durchaus. Wenn jemand per Kontaktformular z.B. Infomaterial anfordert, dann wird ihm dieses sowieso per Post geschickt. In anderen Situationen wird per Telefon Kontakt aufgenommen. Manchmal sogar persönlich.
Ich muß hier als Erläuterung wohl mal dazu sagen, daß es hier vorrangig um Kontaktformulare von Vereinen geht.

wie gesagt, so ein mailformular ist so ziemlich das
größte sicherheitsrisiko was du dir auf einer homepage
einbauen kannst.

Ich merke es, muß aber trotzdem eine Lösung dafür finden.

Gruß

Thomas

Besorg dir ein CMS mit PM´s(Private Nachrichten)

Hallo Alexander,

Das solltest du als erstes ändern: Mails über das Formular
gehen nur an Dich ! Achte auch darauf, die Eingabedaten wie in
FAQ:2435 beschrieben zu prüfen.

das geht leider nicht. Ich bin Webmaster von verschiedenen Seiten, will aber keinesfalls Mailempfänger für alle Internetanfragen an irgendeinen der Seiteneigentümer sein.
Aber gerade bei Vereinen ist es sehr oft wichtig, daß man auf verschiedene Personen zugreiffen kann und nicht immer auf einen. Der würde sich schön bedanken, wenn alle wie auch gearteten Anfragen bei ihm landen würden.

Gruß

Thomas

Hallo,

Besorg dir ein CMS mit PM´s(Private Nachrichten)

wie soll das denn gehen?

Gruß

Thomas

Hallo Alexander,

Das solltest du als erstes ändern: Mails über das Formular
gehen nur an Dich ! Achte auch darauf, die Eingabedaten wie in
FAQ:2435 beschrieben zu prüfen.

das geht leider nicht. Ich bin Webmaster von verschiedenen
Seiten, will aber keinesfalls Mailempfänger für alle
Internetanfragen an irgendeinen der Seiteneigentümer sein.

Muss ja nicht sein. Du kannst die Empfänger ja auf Serverseite im Script vorgeben und nur noch die „Nummer“ des Empfängers im Formular übermitteln, wenn du das Script für mehrere Präsenzen einsetzen willst. Also im Script:

$empfaeger=Array("key1"=\>"[email protected]", "key2"=\>"[email protected]", ...

Im Formular dann als Empfänger nur key1, key2, etc. und im Script schaust su dann nach, ob der dabei ist und hast die E-Mail Adresse:

if (in\_array($\_POST["empf\_key"], array\_keys($empfaenger)))
 $empf\_mail = $empfaenger[$\_POST["empf\_key"]];
 else
 // Fehlermeldung

Du solltest eben nur tunlichst vermeiden, das ein Angreifer seine eigenen Empfängeradressen dort angeben kann.
Falls du den Absender und/oder Betreff im mail() verwendest, da natürlich auch auch \n / \r testen, damit du da keine Bcc:'s untergeschoben bekommst…

Alexander

1 Like

Also ich pflege wechselnde session ID’s und die dann von einem Meiner Webseitenbesucher, den Schlüssel Hinterlege ich und nach aufruf der seite (form etc) wird er ungultig (einmal senden).

Gab noch nie probleme damit.

Hallo Alexander

Muss ja nicht sein. Du kannst die Empfänger ja auf Serverseite
im Script vorgeben und nur noch die „Nummer“ des Empfängers im
Formular übermitteln, wenn du das Script für mehrere Präsenzen
einsetzen willst. Also im Script:

$empfaeger=Array(„key1“=>„[email protected]“,
„key2“=>„[email protected]“, …

Im Formular dann als Empfänger nur key1, key2, etc. und im
Script schaust su dann nach, ob der dabei ist und hast die
E-Mail Adresse:

if (in_array($_POST[„empf_key“], array_keys($empfaenger)))
$empf_mail = $empfaenger[$_POST[„empf_key“]];
else
// Fehlermeldung

Hm, genau den gleichen Gedanken hatte ich gestern auf dem Heimweg auch schon mal. Nur würde ich gern die Adressen in eine extra Datei verpacken. Hier würde mir z.B. eine csv-Datei oder so gefallen. Das Skript an sich sollte nicht unbedingt jedesmal irgendwie geändert werden müssen. Hier ist die Gefahr zu groß, daß irgendwer mal „Murks“ im Skript baut und dann gar nichts mehr geht.
Wäre nur mal noch interessant, wie ich die Adressen über eine csv-Datei einbinden kann.

Du solltest eben nur tunlichst vermeiden, das ein Angreifer
seine eigenen Empfängeradressen dort angeben kann.
Falls du den Absender und/oder Betreff im mail() verwendest,
da natürlich auch auch \n / \r testen, damit du da keine
Bcc:'s untergeschoben bekommst…

Danke für den Tip! Da hätte ich ja gleich das Nächste Loch geöffnet gehabt. Ist ja Wahnsinn, welche Lücken es gibt, die man so nebenbei mal übersehen kann. :frowning:
Kannst Du mir bitte noch genauer sagen, in welchem Feld ich nach was suchen soll, bevor ich wieder alle Referenzen durchblättern muß?

Gruß

Thomas

Hallo,

das hört sich auch mal noch nicht schlecht an, lönntest Du mir Dein Konzept nochmals genauer erläutern, wie Du das technisch umsetzt?

Gruß

Thomas

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]