Seite 1 von 3

Ajax Kontakt Formular mit Captcha

Verfasst: Mi 26.Sep, 2007 14:08
von KeineAhnung
So ich habe jetzt mal mit dem Mootools Framework ein Ajax Kontaktformular gemacht, dann noch von irgendwo ein Captcha genommen und in das absend und eingabe script eingefügt, wie findet ihr das formular ? bzw. gibt es irgendwelche großen sicherheitsmängel (das ist die wichtigste frage)?

(*freu* erstes 2/5 eigenes script :D)

EDIT: naja ok man sollte den temp oder ner deny allow für alle außer 127.0.0.1 unzugänglich machen...

Verfasst: Mi 26.Sep, 2007 17:10
von oxpus
wie findet ihr das formular
Als Anlage zu Deinem Post ;)

Im Ernst:
Solange Du übernommene Variablen so behandelt, wie ich hier gepostet hatte, kann erst einmal nicht viel passieren.
Dazu sollte man auch, wie es ebenfalls das phpBB macht, alle includierten Dateien auf eine existierende, im Hauptschript zu erstellende Konstante hin prüfen, damit man die Sub-Dateien nicht direkt und erfolgreich aufrufen kann.
Der Rest ist dann nur Kosmetik.

Verfasst: Mi 26.Sep, 2007 18:29
von KeineAhnung
ich verstehe aber trotzdem nicht wieso das ncith sicher ist, denn htmlspecialchars werden ja gefiltert, kann denn trotzdem noch schädlicher code eingeflöst werden und selbst wenn, tuen freemail anbieter wie gmail und co sowas ncith filtern ?

Verfasst: Mi 26.Sep, 2007 19:36
von oxpus
Die includierte Datei kann schädlichen Code enthalten!

Verfasst: Mi 26.Sep, 2007 19:38
von KeineAhnung
ja aber wenn sie doch von meinem eigenen server ist und nur von dem einen ordner includiert werden kann...

Verfasst: Mi 26.Sep, 2007 19:43
von oxpus
Dennoch gilt: Konstante erstellen, im includierten File prüfen und damit dieses absichern.
Denn man kann immer irgendwie eine Datei auch direkt(er) aufrufen und dann wäre es fatal, wenn diese ohne weiter Prüfung (die Konstante eben) Daten manipulieren kann.

Verfasst: Mi 26.Sep, 2007 19:45
von KeineAhnung
was heißt das genau, was muss ich jetzt an der datei (bzw. an welcher) ändern ?

Verfasst: Mi 26.Sep, 2007 22:38
von oxpus

Verfasst: Mi 26.Sep, 2007 22:49
von KeineAhnung
also anstatt:

Code: Alles auswählen

$vorname = htmlspecialchars($_POST["first_name"]);
$nachname = htmlspecialchars($_POST["last_name"]);
$email = htmlspecialchars($_POST["e_mail"]);
$sehrwichtig = htmlspecialchars($_POST["mootooler"]);
$anliegen = htmlspecialchars($_POST["new"]);
$textfeld = htmlspecialchars($_POST["textfeld"]);
das da machen:

Code: Alles auswählen

$vorname = htmlspecialchars(str_replace("\'", "''", $_POST["first_name"]));
$nachname = htmlspecialchars(str_replace("\'", "''", $_POST["last_name"]));
$email = htmlspecialchars(str_replace("\'", "''", $_POST["e_mail"]));
$sehrwichtig = htmlspecialchars(str_replace("\'", "''", $_POST["mootooler"]));
$anliegen = htmlspecialchars(str_replace("\'", "''", $_POST["new"]));
$textfeld = htmlspecialchars(str_replace("\'", "''", $_POST["textfeld"]));
?

Verfasst: Do 27.Sep, 2007 07:54
von oxpus
Ja, entweder so oder die Werte mit str_replace... in der SQL-Anweisung eintragen.
Spätestens dort wird es nämlich gebraucht.

Verfasst: Do 27.Sep, 2007 13:32
von KeineAhnung
sql ?

ich bentuzte kein sql...

Verfasst: Do 27.Sep, 2007 14:57
von oxpus
Sofern es genutzt wird ;)

Verfasst: Do 27.Sep, 2007 16:51
von KeineAhnung
achso, gut zu wissen, dann kann ich ja jetzt das formular nutzen :D

achja noch eine frage nicht so wichtig aber:

wie kann ich da ein feld hinzufügen wo steht:

Mitzusendender Anhang: [__________]

und das mann da dan eine datei wählen kann, z.B: nur zip, rar, jpg, gif, png und nur 250kb und wenn es zu groß ist das ein fehler kommt...

Verfasst: Do 27.Sep, 2007 17:36
von oxpus
Die Datei kann man aber erst nach dem Hochladen prüfen oder man müsste Javascript hierzu verwenden.
Und bei letzterem muss ich aktuell passen...

Verfasst: Do 27.Sep, 2007 17:38
von KeineAhnung
ja nach dme hochladen prüfen muss man ja auch hier bei oxpus.de bei dne attachments :D nur wie kann ich das ermöglichen

und java-script wäre ziemlich unsicher wenn ich mcih nciht irre, das könnte man ja umgehen.

Verfasst: Do 27.Sep, 2007 17:42
von oxpus
Eine andere Möglichkeit gibt es nicht, aber wenn Du Javascript abschaltest, könntest Du es auch so steuern, daß ein Upload dann nicht vorgenommen wird ;)

Verfasst: Do 27.Sep, 2007 17:44
von KeineAhnung
ja und wie bekomm ich das dann ohne java script hin, aslo mit nacher prüfen :D
den mit java -script kann mans ja bestimmt irgendwie doch umgehen und dann 10 MB dateien auf einmal schicken :D (auch wenn das formular selber ohne java-script dank ajax leer abgeschickt wird)

Hierdraus könnte man was machen, ich aber nicht :D (also nicht zu faul sondern ich bekomm das nicht ganz hin :D)

Verfasst: Do 27.Sep, 2007 18:17
von oxpus
Nun, man hat zunächst ein Eingabefeld

Code: Alles auswählen

<input type="file" name="upload" value="" />
welches dann wie beim Attachment MOD das gewünschte Feld im Formular bereitstellt.
Dieses selber muss aber noch umgestellt werden, also im <form...>-Tag muss noch dieser Eintrag rein:

Code: Alles auswählen

enctype="multipart/form-data"
Nur damit ist das Formular auch in der Lage, die Post-Daten UND die Datei an den Server zu schicken.
Auf dem Server selber steht dann mit $_FILES alles zur Verfügung, was man zum prüfen braucht, also
$_FILES['upload']['tmp_name'] ist der temporäre Dateiname des Uploads (wichtig beim Prüfen oder verschieben der Datei)
$_FILES['upload']['name'] der angegebene Name des Uploads
$_FILES['upload']['size'] die Dateigrösse
$_FILES['upload']['type'] die Dateiart,
wobei hier ['upload'] für die Feldbezeichnung im Formular steht, mit der die Datei für den Upload ausgewählt wird.
Und damit hätte man alles zusammen.
Nachteil hierbei ist ganz klar, daß zunächst eine Datei hochgeladen wird, bevor man sie prüft.
Sie belegt also damit schon einmal Platz auf dem Server und kostet Traffic.
Mit Javascript wäre das im Vorfeld eher zu prüfen, aber wie gesagt, hier muss ich passen.

Verfasst: Do 27.Sep, 2007 18:23
von KeineAhnung
ach das mit dem traffic/speicher ist nicht schlimm habe eh undenlich traffic :D und wenn dann macht die person das auch nur 1 mal weil die dann den fehler sieht :D

nur wie schaffe ich es das das ganze dann noch in der mai mitgesendet wird, also ins temp verzeichnis, danach in die mail sendne und löschen...

und noch ne frage ist als methode Get oder psot sicher, denn ich habe in meinem script jetzt get stehen (in der form)

Verfasst: Do 27.Sep, 2007 18:57
von oxpus
Files kann man nur mittels POST vernünftig hochladen, also auf POST umstellen und auch $HTTP_POST_VARS, bzw. $_POST verwenden.

Öhm, Attachment im Email senden...
Oh ja...
Wie war das noch gleich...

Ist etwas tricky, aber sollte gehen:

Code: Alles auswählen

$email_to = "ich@bins.de";
$email_subject = "Tach";
$email_message = "Hallo World";
$email_headers = "MIME-Version: 1.0\r\n";
$email_headers .= "Content-Type: multipart/mixed\r\n";
$email_headers .= "Content-Transfer-Encoding: 7bit\r\n";
$email_headers .= "Content-Type: " . $_FILES['upload']['type'] . "; name='" . $_FILES['upload']['name'] . "'\r\n";
$email_headers .= "Content-Transfer-Encoding: base64\r\n";
$email_headers .= "Content-Disposition: attachment\r\n";

mail ($email_to, $email_subject, $email_message, $email_headers);
Damit brauchst Du dann das hochgeladene File nicht mehr löschen, denn das wird mit Ende der PHP-Session automatisch gelöscht.

Verfasst: Do 27.Sep, 2007 19:18
von KeineAhnung
also so wie ich den code jetzt habe bekomme ich zwar eine nachricht, aber keine attachment bzw den ausgefüllten text nicht formatiert (also man sieht <b> <html> etc. tags), hier meine von davor:

Code: Alles auswählen

<?php
	require_once( 'class.captcha.php' );

	if (empty($_GET['session_code'])) 
		{ $session_code = md5(round(rand(0,40000))); } 
	else 
		{ $session_code=$_GET['session_code']; }	
	
	$my_captcha = new captcha( $session_code, '__TEMP__/' );
			
	

	$do = $_GET['do'];
	
	if ($do == 'verify')
	{
		if ($my_captcha->verify( $_POST['password'] ) )
		{
$vorname = htmlspecialchars(str_replace("\'", "''", $_POST["first_name"]));
$nachname = htmlspecialchars(str_replace("\'", "''", $_POST["last_name"]));
$email = htmlspecialchars(str_replace("\'", "''", $_POST["e_mail"]));
$sehrwichtig = htmlspecialchars(str_replace("\'", "''", $_POST["mootooler"]));
$anliegen = htmlspecialchars(str_replace("\'", "''", $_POST["new"]));
$textfeld = htmlspecialchars(str_replace("\'", "''", $_POST["textfeld"]));

$mime_boundary = "--ka.ultimatik.de--".md5(time());

$to = "maxhatka@gmail.com";
$subject = "$nachname, $vorname";

$headers = "From: <$email>\n";
$headers .= "Reply-To: <$email>\n";
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: multipart/alternative; boundary=\"$mime_boundary\"\n";

$message .= "--$mime_boundary\n";
$message .= "Content-Type: text/html; charset=UTF-8\n";

$message .= "<html>\n";
$message .= "<body style=\"font-family:Verdana, Verdana, Geneva, sans-serif; font-size:14px;\">\n";
$message .= "Sehr Wichtig ?: <b>$sehrwichtig</b><br>\n";
$message .= "Vorname: $vorname<br>\n";
$message .= "Nachname: $nachname<br>\n";
$message .= "Anliegen: $anliegen<br>\n";
$message .= "Text: <pre>$textfeld</pre><br><br>\n";
$message .= "E-Mail: $email<br>\n\n";
$message .= "</body>\n";
$message .= "</html>\n";

$message .= "--$mime_boundary--\n\n";

$mail_sent = @mail( $to, $subject, $message, $headers );
echo $mail_sent ? "Die E-Mail <b>wurde</b> versendet" : "Die E-Mail <b>wurde nicht</b> erfolgreich versendet.";

echo "<br>Es w&auml;re n&uuml;tzlich wenn du nach<br>3 Tagen noch keine Antwort bekommen<br>hast mir eine E-Mail an<br>maxhatka(&auml;t)gmail.com<br>zu schicken!<br>";
echo "<br>Wenn du Java-Script deaktiviert<br>hast wird die E-Mail leer ankommen<br>also wenn du es deaktiviert<br>hast aktiviere es.";
                        }
                        else
                        {
                        echo "Falscher Sicherheitscode, bitte Seite erneuern und nochmal ausf&uuml;llen.";
			exit;	
		}
	}

	$pic_url = $my_captcha->get_pic( 4 );
?>
<?php
	if (empty($_GET['session_code']))
         echo "Wie bereits schon gesagt funktioniert dieses Formular nur wenn du Java-Script eingeschaltet hast";
?>

Verfasst: Do 27.Sep, 2007 23:07
von oxpus
# $headers .= "Content-Type: multipart/alternative; boundary=\"$mime_boundary\"\n";
#

# $message .= "--$mime_boundary\n";
# $message .= "Content-Type: text/html; charset=UTF-8\n";
Ja, was soll es denn nun auch werden?
Text-Mail ohne Formatierung oder mit Attachment?

Verfasst: Do 27.Sep, 2007 23:13
von KeineAhnung
achso danke, naja das script kann arten, habe ausvershene 100.000 ordner auf dme webspace erstellt, und es werden immer mehr (lol vor 5 min war das noch 65 (EDIT: 77MB jetzt 23.49Uhr) MB groß, nur der ordner in dem andere LEERE ordner sind...) obwohl ich das script garncith mher aufrufe, anaj muss ich halt alle Daten bei dem support meines hosters löschen lassen (wer kann ahnen das ordner erstellen bei php heißt beliebig viele....)

naja ich poste mal das script was das berursacht hat, kann jemand das script reparieren ? (würde es gerne wieder benutzen :D):

Code: Alles auswählen

<?php
$leer = "/";
// Einstellungen
$maxsize = "40960"; // Maximale Uploadgrösse (40 Kb) 
$uploddir = "uploadbin/"; // Upload Ordner
$extensions = array(".jpg", ".gif", ".png", ".jpeg", ".psd"); // Erlaubte Erweiterungen

if($_POST['action']=="upload")
{
$tmp_name = $HTTP_POST_FILES['bild']['tmp_name']; // Der Originalname 
$name = $HTTP_POST_FILES['bild']['name']; // Der Originalname 
$size = $HTTP_POST_FILES['bild']['size']; // Größe der Datei 
$type = $HTTP_POST_FILES['bild']['type']; // Der MIME Type der Datei 

$ext_tmp = explode(".", $name);
$ext = ".".$ext_tmp[(count($ext_tmp)-1)];

if(in_array($ext, $extensions))
{ 
if($size<=$maxsize && $size!=0)
{
while(file_exists($uploddir.$newname) || !$newname)
{
$newname = md5(uniqid(rand()));
mkdir ( "uploadbin/$newname", 0755 );
}
if(move_uploaded_file($tmp_name, $uploddir.$newname.$leer.$name))
{
echo "Die Datei erfolgreich hochgeladen.<br>"; 
echo "Größe: ".$size." Byte<br>"; 
echo "Name: ".$name."<br>";
echo "MIME-Type: ".$type."<br>";
echo "Ansehen: <a href='".$uploddir.$newname.$leer.$name."'>".$uploddir.$newname.$leer.$name."</a>"; 
}
else{echo "Fehler: Datei konnte nicht verschoben werden!";}
}
else
{ 
echo "Ihre Datei ($size) ist über $maxsize Bytes oder gleich 0 KB"; 
} 
}
else
{ 
echo "Falsche Erweiterung: ".$name; 
} 
}
else
{ 
echo "<form action='".$_SERVER['PHP_SELF']."' enctype=\"multipart/form-data\" method='post'>";
echo "<input type=\"hidden\" name=\"MAX_FILE_SIZE\" value=\"".$maxsize."\">";
echo "<input type='hidden' name='action' value='upload'>"; 
echo "<table>"; 
echo "<tr>"; 
echo "<td>Datei</td><td><input type='file' name='bild'></td>"; 
echo "</tr><tr>"; 
echo "<td> </td><td><input type='submit' value='Hochladen'></td>"; 
echo "</tr>"; 
echo "</form>";
echo "</table>"; 
} 

?>
ich habe die stelle "mkdir ( "uploadbin/$newname", 0755 ); " eingefügt (nichts böses anehnd)

und dann zum eigentlichen Thema zurück, wie kann ich dann nur bestimmte Datei typen erlauben und größe festlegen (bin ein noob wenns um sowas geht, in der lernphase :D)

rofl, jetzt sollte es mit datei anhang funktionieren, snede formular ab, habe zwar datei anhang, aber undefined, also keine datei aber am anfang steht "enctype="multipart/form-data" und das upload feld hat auch den namen "upload" aber es funktioniert nicht

Verfasst: Fr 28.Sep, 2007 08:33
von oxpus
Um mal die Struktur nur zu nennen:
Du lässt eine Datei hochladen, prüfst auf Erweiterung und Grösse und erstellst dann einen neue Ordner, bevor die Datei verschoben wird, löscht diesen Ordner aber nicht, wenn die Datei nicht verschoben werden konnte (warum auch immer). Es bleibt dann also ein leerer Ordner stehen!
Also solltest Du nach

Code: Alles auswählen

else{echo "Fehler: Datei konnte nicht verschoben werden!";
(VOR der schliessenden Klammer }) noch diese Zeile einfügen:

Code: Alles auswählen

rmdir ( "uploadbin/$newname" );

Verfasst: Fr 28.Sep, 2007 09:09
von KeineAhnung
ja so gehts jetzt, nur der will die datei nciht verscheiben, das verzeichnis besteht, der will die da ja auch reintuen (merkt man an fehler), ka wieso, das ist der error:

Code: Alles auswählen

Warning: move_uploaded_file(uploadbin/2725ba42d55db4c77d8c04d86e511f9b/pferd.jpg) [function.move-uploaded-file]: failed to open stream: No such file or directory in /data/apache/users/kilu.de/keineahnung/www/lol.php on line 26

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/data/apache/users/kilu.de/keineahnung/tmp/phpaMW3Wu' to 'uploadbin/2725ba42d55db4c77d8c04d86e511f9b/pferd.jpg' in /data/apache/users/kilu.de/keineahnung/www/lol.php on line 26
Fehler: Datei konnte nicht verschoben werden!
lol die datei ist jetzt 98,36 MB groß, größer geht nicht (keinen speicher mehr) :D:D:D gibts noch ne andere möglichkeit die zu entfernen als das ich mich bei meinem hoster melden muss ? (habe schon löschen versucht, ftp stürtzt ab... dann script zum löschen, geht nicht....)

und die letzte offene frage ist nurnoch:

rofl, jetzt sollte es mit datei anhang funktionieren, snede formular ab, habe zwar datei anhang, aber undefined, also keine datei aber am anfang steht "enctype="multipart/form-data" und das upload feld hat auch den namen "upload" aber es funktioniert nicht


dann kann ich endlich mein projekt eröffnen :D:D