Seite 5 von 6

Verfasst: 29.11.2005 18:21
von IPB_Flüchtling
snakepilsken hat geschrieben:Aber da man ja bei jeder Anfrage diesen 5-stelligen Code eingeben muß und dieser jedes Mal anders ist, kann doch sowas nciht passieren oder ?
Hallo snakepilsken,

es wird zwar deutlich erschwert, aber besonders schwierig zu knacken ist das benutzte Captcha nicht; und die Spammer lernen halt auch immer dazu... Aber um Dich zu beruhigen: Wenn ich von der (relativen) Sicherheit dieses Kontaktformulares nicht überzeugt wäre, würde ich es bestimmt nicht benutzen. :)
snakepilsken hat geschrieben:Ich habe das Kontaktformular für 3 unterschiedliche Zwecke auf einem Board im Einsatz. ... In der Art etwa contact_form.php, contact_form2.php, contact_form3.php
In diesem Fall kannst Du je nach Deinen eigenen Vorlieben jedes Kontaktformular auf das Datenbankfeld lastcontact zugreifen lassen, oder Du führst für contact_form2.php und contact_form3.php mittels SQL-Befehl zwei zusätzliche Felder ein, z.B. lastcontact2 und lastcontact3. (In diesem Fall müsstest Du auch den php-Code von contact_form2 und 3 entsprechend anpassen: Wo in contact_form2 "lastcontact" steht, müsstest Du "lastcontact2" hinschreiben, und das "lastcontact" in contact_form3.php müsstest Du mit "lastcontact3" ersetzen.)

Im erstgenannten Fall können halt die Formulare 2 und 3 auch für 30 Sekunden nicht benutzt werden, nachdem über das Formular 1 eine Anfrage abgeschickt worden ist. Wenn Du letzteres verwirklichst, gilt für jedes Formular ein eigener Countdown, bis es wieder benutzbar wird.

Einfacher zu verwirklichen und vom Sicherheitsstandpunkt genauso gut ist sicher Variante 1, also dass jedes Formular auf das Datenbank-Feld lastcontact zugreift. Dann brauchst Du auch im php-Code nichts zusätzlich verändern.

Ich persönlich habe das Zeitlimit in meinem Board übrigens auf zwei Minuten erhöht, weil ich sowieso nur alle paar Tage mal eine Kontaktanfrage erhalte. Einstellbar ist das in folgender Zeile:

Code: Alles auswählen

$stime = time() + 30; //hier wird das Flood-Intervall in Sekunden festgelegt 
LG, IPB_Flüchtling

Verfasst: 02.12.2005 08:32
von IPB_Flüchtling
Zum Thema Sicherheit und SQL-Injection gefunden:

http://www.abakus-internet-marketing.de ... 69385.html
http://www.perlunity.de/php/manual/secu ... base.shtml
http://de.wikipedia.org/wiki/SQL-Injektion
http://www.php-homepage.de/manual/funct ... string.php

Also, mysql_real_escape_string ist bislang im Kontakt-Script nicht enthalten. Ich weiß auch nicht, ob es wirklich nötig wäre. Vielleicht liest ja ein Sicherheitsexperte mit.

LG, IPB_Flüchtling

Verfasst: 02.12.2005 14:59
von fanrpg
Um das auch in anderen DB Typen zu verwenden muss man einfach die $db Anordnung verändern ungefähr so:

öffne: db/mysql.php und db/mysql4.php

suche:

Code: Alles auswählen

} // class sql_db
davor einfügen:

Code: Alles auswählen

	function sql_escape($result, $queryid)
	{
		if(!$queryid)
		{
		$result = mysql_real_escape_string($result, $queryid);
		}
		else
		{
		$result = mysql_escape_string($result);
		}
		
		return $result;
	}	
Das kann man auch in anderen DB System benutzen

und z.B MS SQL (dort habe ich keine escape funktion gefunden als zu fuß)
öffne db/mssql.php
suche:

Code: Alles auswählen

} // class sql_db
davor einfügen:

Code: Alles auswählen

	function sql_escape($result)
	{
		$result = stripslashes($result);
		$result = str_replace("'", "\'", $result);
		
		return $result;
	}	
So ungefähr funktioniert das dann, muss man dann für jeden Verbindungstyp machen.
Wie sicher das ist mal in Frage gestellt, aber sicherer wie ohne auf jeden Fall.
Dann kann man das auch per $db benutzen und funktioniert mit jedem DB Type.

So ungefähr müsste das auch klappen.

Verfasst: 02.12.2005 15:53
von IPB_Flüchtling
Hallo fanrpg,

vielen Dank für Deine Ausführungen! Momentan ist mir das Ganze noch ein bisschen zu hoch, wie ich ehrlich zugeben muss. :oops:

marc75 hatte auch eine Anregung, die ich für das Kontaktformular-Script vielleicht eher umsetzen könnte:

Code: Alles auswählen

   mysql_query("INSERT 
      INTO tabelle_text 
         (text1, 
         text2) 
         VALUES 
         ('".mysql_escape_string($_POST['text1'])."', 
         '".mysql_escape_string($_POST['text2'])."')"); 
Kann oder sollte man mysql_real_escape_string eigentlich auch in folgendem Fall anwenden? Ich meine statt

Code: Alles auswählen

   $res = mysql_fetch_object($QUE);
vielleicht folgendes:

Code: Alles auswählen

   $res = mysql_fetch_object (mysql_real_escape_string($QUE));
Oder ist das kompletter Unfug? Naja, einem Blinden die Farben erklären...

Schönes Wochenende!
IPB_Flüchtling

Verfasst: 02.12.2005 16:36
von fanrpg
Also mysql_fetch_object(mysql_escapestring()) bringt gor nichts.

Mann muss die Variabeln die eingefügt werden maskieren.

Also so z.B:

Code: Alles auswählen

$externe_variable = $_GET['id'];
$externe_variable = $db->sql_escape($externe_variable); // nach meinem Beispiel
$externe_variable = mysql_escape_string($externe_variable); // nur mit mysql
$sql = "INSERT INTO `TABLE` (`feld`) VALUES ('$externe_variable')";
// Oder
$sql = "SELECT FROM `TABLE` WHERE `id` = '$externe_variable'";
// Query und Co...
Sonst ist das alles Sinnlos, mann muss den Inhalt der Variabeln maskieren die eingeben werden. Dann kann auch keine SQL Injection untergeschoben werden. :wink:

Verfasst: 02.12.2005 17:18
von IPB_Flüchtling
DANKE DIR!

Darf ich noch einen letzten Punkt nachfragen? Im Kontaktformular-Script kommt (verkürzt) folgendes vor:

Code: Alles auswählen

$topic_kurz = substr($enquiry, 0, 50);
$topic_title = addslashes($topic_kurz);
$topic_poster = addslashes($poster_id);
$topic_time = addslashes($post_time);

$INS_topics = "INSERT INTO ".TOPICS_TABLE." (forum_id, topic_title, topic_poster, topic_time) VALUES ('$forum_id', '$topic_title', '$topic_poster', '$topic_time')";

mysql_query($INS_topics) or die("Leider ist ein Fehler aufgetreten.");
Die Frage: addslashes allein schützt hier wohl nicht vor SQL-Injection? Wäre ich mit folgender Modifikation auf der sicheren Seite?

Code: Alles auswählen

$INS_topics = "INSERT INTO ".TOPICS_TABLE." (forum_id, topic_title, topic_poster, topic_time) VALUES ('$forum_id', '$topic_title', '$topic_poster', '$topic_time')";

$INS_topics = mysql_real_escape_string($INS_topics);

mysql_query($INS_topics) or die("Leider ist ein Fehler aufgetreten.");
Kann dieses Query dann aber überhaupt noch funktionieren? Oder sollten stattdessen die Variablen $forum_id, $topic_title, $topic_poster und $topic_time mit mysql_real_escape_string "aufbereitet" werden?

Ist meine letzte Frage für heute. Versprochen!!

LG, IPB_Flüchtling

Verfasst: 02.12.2005 17:26
von fanrpg
Kann dieses Query dann aber überhaupt noch funktionieren? Oder sollten stattdessen die Variablen $forum_id, $topic_title, $topic_poster und $topic_time mit mysql_real_escape_string "aufbereitet" werden?
Ja jede einzelnte Variable sollte aufbereitet werden.
Sonst maskierst du dir die ganze Abfrage, und kann somit nicht mehr ausgeführt werden. :wink:

Verfasst: 02.12.2005 17:43
von IPB_Flüchtling
Danke noch einmal - ich denke, dass ich es jetzt soweit kapiert habe, dass ich darauf aufbauen kann! :grin: Werde mich dann nächste Woche an die Umsetzung machen.

LG, IPB_Flüchtling

Verfasst: 11.01.2006 19:26
von Siebenschläfer
Hallo erst mal,
ich habe mir jetzt diesen Thread sehr aufmerksam durchgelesen, nur leider bin ich anscheinend zu doof das "Snippet" einzubauen. Die Originallinks zur modifizierten contact_form.php funktionieren leider auch nicht mehr. Kann mir vielleicht bitte einer sagen wo ich den Code genau einbauen muß ?
Muß ich auch Änderungen an der Datenbank vornehmen ? Irgendwie bekomm ichs einfach nicht zum Laufen. Vielleicht hat ja auch jemand von Euch eine modifizierte contact_form.php die er mir geben könnte.

Schon mal Danke für Eure Hilfe im Voraus.

Verfasst: 11.01.2006 22:21
von AmShaegar
ich kann dir höchstens meine geben.. sie funktioniert.. ich hab danach aufgehört.. den ganzen kram der hier nachträglich hinzugefügt wurde, damit hab ich nichts zu tun... schick mir doch ne pn mit deiner e-mailadresse.