• Aktualisierte Forenregeln

    Eine kleine Änderung hat es im Bereich Forenregeln unter Abschnitt 2 gegeben, wo wir nun explizit darauf verweisen, dass Forenkommentare in unserer Heftrubrik Leserbriefe landen können.

    Forenregeln


    Vielen Dank

Formulare sicher machen

Biloboy

Anfänger/in
Registriert
02.10.2001
Beiträge
53
Reaktionspunkte
2
Hallo
Ich würde gerne ein Formular auf meiner Homepage einbinden.
Nun habe ich gehört, dass man dieses Formular ausnutzen kann um zum Beispiel die ganze DB zu löschen (Ich meine zum Beispiel, das man in das Feld ein "; hineinschreibt, und danach den Code).

Meine Frage ist. Wie kann ich die einzelnen form-Felder schützen, damit eben dieser Effekt nicht passieren kann?
 
Mag sein das schon einige angefangen haben an ihren beispielen und tollen Beiträgen bezüglich PHP und Javascript zu schreiben *g* aber vorher würd ich schon gern wissen welche serverseitigen, scripttechnischen Möglichkeiten dein Webserver bietet.


Wenn irgendwer Javascript Beispiele bringt gibts Schläge.
Javascript kann man maximal zur Eingabehilfe verwenden auch wenn einigen "Sicherheitskontrollen" im Kopf rumschwirren.
Was man machen kann ist den Javascript deaktivierhelden das komplette Formular garnicht erst sichtbar zu machen und dann per JS den Inputforce zu schreiben.
 
ZAM am 07.12.2005 16:14 schrieb:
Mag sein das schon einige angefangen haben an ihren beispielen und tollen Beiträgen bezüglich PHP und Javascript zu schreiben *g* aber vorher würd ich schon gern wissen welche serverseitigen, scripttechnischen Möglichkeiten dein Webserver bietet.


Wenn irgendwer Javascript Beispiele bringt gibts Schläge.
Javascript kann man maximal zur Eingabehilfe verwenden auch wenn einigen "Sicherheitskontrollen" im Kopf rumschwirren.
Was man machen kann ist den Javascript deaktivierhelden das komplette Formular garnicht erst sichtbar zu machen und dann per JS den Inputforce zu schreiben.

Tschuldigung, hab mich glaube ich ein bisschen falsch ausgedrückt. Das ganze ist ein Formular, welches per E-Mail verschickt werden soll.
 
Biloboy am 07.12.2005 16:27 schrieb:
Tschuldigung, hab mich glaube ich ein bisschen falsch ausgedrückt. Das ganze ist ein Formular, welches per E-Mail verschickt werden soll.

Nein hatte es schon verstanden. Wollte aber wissen ob per serverseitigen Script (CGI; php,perl ... jsp, cfm oder ähnliches?) oder per Javascript bzw. HTML spezifierter Übergabe der eingegebenen Daten an den jeweilig installierten Emailclienten?
 
ZAM am 07.12.2005 16:40 schrieb:
Biloboy am 07.12.2005 16:27 schrieb:
Tschuldigung, hab mich glaube ich ein bisschen falsch ausgedrückt. Das ganze ist ein Formular, welches per E-Mail verschickt werden soll.

Nein hatte es schon verstanden. Wollte aber wissen ob per serverseitigen Script (CGI; php,perl ... jsp, cfm oder ähnliches?) oder per Javascript bzw. HTML spezifierter Übergabe der eingegebenen Daten an den jeweilig installierten Emailclienten?

Die Daten gehen über ein PHP script
 
Das in den Scriptkopf:

while(list($key, $value) = each($HTTP_POST_VARS)) {
$HTTP_POST_VARS[$key] = @addslashes(@strip_tags($value));
}

alternativ:
while(list($key, $value) = each($_POST)) {
$_POST[$key] = @addslashes(@strip_tags($value));
}

alternativ:
while(list($key, $value) = each($HTTP_POST_VARS)) {
$$key = @mysql_escape_string(@strip_tags($value));
}
...und die direkten Variablennamen verwenden.

alternativ:
while(list($key, $value) = each($_POST)) {
$$key = @mysql_escape_string(@strip_tags($value));
}
...und die direkten Variablennamen verwenden.

usw....usw... das sichert die Daten zumindest schonmal gut vor injections etc.

Prüfen auf gültige Eingabefeld spezifische gültige Daten bekommst du doch hoffentlich selbst hin. zb. gültige Emailadresse, Text, Maximallängen etc.
 
Biloboy am 07.12.2005 15:36 schrieb:
Hallo
Ich würde gerne ein Formular auf meiner Homepage einbinden.
Nun habe ich gehört, dass man dieses Formular ausnutzen kann um zum Beispiel die ganze DB zu löschen (Ich meine zum Beispiel, das man in das Feld ein "; hineinschreibt, und danach den Code).

Meine Frage ist. Wie kann ich die einzelnen form-Felder schützen, damit eben dieser Effekt nicht passieren kann?

Du solltest jegliche Usereingaben (also Formdata, URL-Parameter, Cookie-Daten usw.) grundsätzlich so behandeln, als sei das Zeug böse. Daher gehört vor die eigentliche Verarbeitung solcher Eingaben (also z.B. Übergabe in einem DB-Query oder ähnliche "gefährliche" Funktionen) immer die Prüfung der Validität - und zwar serverseitig. Clientseitige Tests können vom Client immer umgangen werden. Zu den Vorsichtsmaßnahmen gehört z.B. auch, dass eval() grundsätzlich eine schlechte Idee ist. is_numeric() und addslashes () sind dagegen Deine Freunde. :)
 
ZAM am 07.12.2005 16:53 schrieb:
Das in den Scriptkopf:

while(list($key, $value) = each($HTTP_POST_VARS)) {
$HTTP_POST_VARS[$key] = @addslashes(@strip_tags($value));
}

alternativ:
while(list($key, $value) = each($_POST)) {
$_POST[$key] = @addslashes(@strip_tags($value));
}

alternativ:
while(list($key, $value) = each($HTTP_POST_VARS)) {
$$key = @mysql_escape_string(@strip_tags($value));
}
...und die direkten Variablennamen verwenden.

alternativ:
while(list($key, $value) = each($_POST)) {
$$key = @mysql_escape_string(@strip_tags($value));
}
...und die direkten Variablennamen verwenden.

usw....usw... das sichert die Daten zumindest schonmal gut vor injections etc.

Prüfen auf gültige Eingabefeld spezifische gültige Daten bekommst du doch hoffentlich selbst hin. zb. gültige Emailadresse, Text, Maximallängen etc.


Ist zwar ein sehr generischer Allrounder, aber macht mehr Arbeit als es soll - wenn ein User z.B. beliebig gar nicht existente Parameter durchprobiert. Daher register_globals = off setzen und wirklich nur das anfassen, was Du auch benutzt.
 
Markus_Wollny am 07.12.2005 17:06 schrieb:
Ist zwar ein sehr generischer Allrounder, aber macht mehr Arbeit als es soll - wenn ein User z.B. beliebig gar nicht existente Parameter durchprobiert. Daher register_globals = off setzen und wirklich nur das anfassen, was Du auch benutzt.

Aus dem Grund habe ich doch mehrere Varianten aufgeführt.
 
Machen wirs mal ganz simpel ohne Templates. Also die simpelste variante in der das PHP script extern aufgerufen wird.

1.1 Formular - Benutzerfreundlichere Version die nicht-javascript User nicht ausschließt.
Name, Email und Message sind Pflichtfelder.
<!--// Hier das Javascript aus Punkt 2. einfügen//-->

<form method="post" action="mail.php" onSubmit="return CheckForm(this)">
<table>
<tr>
<td>Name*:</td>
<td><input type="text" name="name" maxlength="255"></td>
</tr>
<tr>
<td>Email*:</td>
<td><input type="text" name="email" maxlength="255"></td>
</tr>
<tr><td colspan="2">Message: [max. 10000 Zeichen]</td></tr>
<tr><td colspan="2"><textarea cols="50" rows="12" name="message"></textarea></td></tr>
<tr><td colspan="2" align="center"><input type="submit"></td></tr>
</tr>
</table>
</form>

1.2 Formular - Benutzerunfreundlichere Version die nicht-javascript User ausschließt.
Name, Email und Message sind Pflichtfelder.
<!--// Hier das Javascript aus Punkt 2. einfügen//-->

<script type="text/javascript">
document.writeln("<form method=\"post\" action=\"mail.php\" onSubmit=\"return CheckForm(this)\">");
document.writeln("<table>");
document.writeln("<tr>");
document.writeln("<td>Name*:</td>");
document.writeln("<td><input type=\"text\" name=\"name\" maxlength=\"255\"></td>");
document.writeln("</tr>");
document.writeln("<tr>");
document.writeln("<td>Email*:</td>");
document.writeln("<td><input type=\"text\" name=\"email\" maxlength=\"255\"></td>");
document.writeln("</tr>");
document.writeln("<tr><td colspan="2">Message: [max. 10000 Zeichen]</td></tr>");
document.writeln("<tr><td colspan="2"><textarea cols=\"50\" rows=\"12\" name=\"message\"></textarea></td></tr>");
document.writeln("<tr><td colspan="2" align=\"center\"><input type=\"submit\"></td></tr>");
document.writeln("</tr>");
document.writeln("</table>");
document.writeln("</form>");
</script>
<noscript>
Bitte aktivieren Sie Javascript um das Formular benutzen zu können.<br>
Javascript stellt in diesem Falle und auch allgemein keine Gefahr da.
</noscript>

2. Javascript zur überwachung der Usereingabe
<script type="text/javascript">
function CheckEmail(mail)
{
var a = false;
var res = false;

if(typeof(RegExp) == 'function')
{
var b = new RegExp('abc');
if(b.test('abc') == true){a = true;}
}
if(a == true)
{
reg = new RegExp('^([a-zA-Z0-9\\-\\.\\_]+)(\\@)([a-zA-Z0-9\\-\\.]+)(\\.)([a-zA-Z]{2,4})$');
res = (reg.test(mail));
}
else
{
res = (mail.search('@') >= 1 &&
mail.lastIndexOf('.') > mail.search('@') &&
mail.lastIndexOf('.') >= mail.length-5)
}
return(res);
}

function CheckMessage(msg)
{
if(msg.length < 3) {
return(false);
}

// erweiterbar um abfragen nach HTML etc....
}

function CheckForm(what)
{
var error = '';

var name = trim(what.name.value);
var email = trim(what.email.value);
var message = trim(what.message.value);

if(name.length < 3) {
error += "Der Name sollte mind. 3 Zeichen haben.\n";
}
if(!CheckEmail(s)) {
error += "Ungültiger Email-Syntax: name@domain.xx\n";
}
if(!CheckMessage(message)) {
error += "Ungültige Zeichen im Text oder Text zu kurz. (mind. 3 Zeichen, kein HTML)\n";
}

if(error != '') {
alert(error);
return(false);
}
}
</script>


Das PHP Script mail.php
# Definitionen
# Emailadresse an welche die Mail gesendet werden soll.
$target_mail = '';

# Zieladresse an welche das Script weiterleitet sobald die Mail korrekt versendet wurde.
# Das unterbindet Mail-Flooder. Alternativ kann man sich noch durch ne Session oder
# Prüfbilder schützen.
$target_url = '';

# Daten durchparsen
$VARS = (ini_get(register_globals) == 1) ? $_POST : $HTTP_POST_VARS;
while(list($key, $value) = each($VARS))
{
$$key = @mysql_escape_string(@strip_tags(@trim($value)));
}

# Eingaben prüfen.
if(strlen($name) < 3) {
$error[] = 'Der Name sollte mind. 3 Zeichen haben.';
}

if(!CheckEmail($email)) {
$error[] = 'Ungültiger Email-Syntax: name@domain.xx';
}

if(strlen($message) < 3 || ereg("[\<|\>]", $message)) {
$error[] = 'Ungültige Zeichen im Text oder Text zu kurz. (mind. 3 Zeichen, kein HTML)';
}

# Fehlerausgabe
if(is_array($error))
{
echo "Ein Fehler ist aufgetreten.<br><br>\n";

foreach($error as $key => $value) {
@printf("- %s<br>\n", $value);
}

echo "<br><a href='Link'>Zurück zum Formular.</a>";
die();
}
else {
# Email erstellen
$header = "From: \"$name\" <$mail>\r\n";
$header .= "Mime-Version: 1.0\r\n";
$header .= "Content-Type: text/plain; charset=iso-8859-1\r\n\r\n";

# Email absenden.
if(!@mail($target_mail, $subject, $message, $header)) {
die("Die Email konnte aufgrund eines technischen Problems nicht versand werden.");
}
else {
header("LOCATION: $target_url");
}
}
 
Markus_Wollny am 07.12.2005 17:02 schrieb:
is_numeric() und addslashes () sind dagegen Deine Freunde. :)

regular expressions auch, besonders wenns um email formulare geht :) da gabs auch letztens mal einen interessanten c't artikel zu, hier gibts den
@zam: ih, tabellen :D :P
 
Zurück