• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

MySQL-Injection

Status
Für weitere Antworten geschlossen.

Durek

Neues Mitglied
Hallo,
dieses Thema findet sowohl in PHP als auch in MySQL platz aber ich schreibe es mal hier rein, weil ich denke, dass es hier besser hinpasst.
Zu meiner Frage:
mysql_query("UPDATE `user` SET name='$_POST[name]'");

man könnte in das Formular (<input type="text" name="name">)
ja nun folgendes schreiben...
' UNION TRUNCATE TABLE 'user

was würde rauskommen?

mysql_query("UPDATE `user` SET name='' UNION TRUNCATE TABLE 'user'");

was passiert? Alle Einträge meiner Tabelle user sind weg...

wie kann ich sowas verhindern? Mir fällt einfach keine Lösung ein...
 
****

PHP:
<?php
fopen('http://www.google.de', r);
?>

Mod-Edit: Sorry, aber das musste sein (XraYSoLo)
Mod-Edit: lol, jetzt mach es dem doch net so schwer xD (Frank)
 
Zuletzt bearbeitet:
Jetzt zensieren sich die Mods schon gegenseitig, obwohl einer nur helfen will?!
Also das find ich jetzt ein wenig daneben XraY.

Zu deiner Frage,
du musst die Eingaben eines users IMMER genau prüfen,
merk' dir: Traue keinem User unter und über 30!

Beispiel:
HTML:
<input type="text" name="username">
// Abgeschickt:

PHP:
$_POST['username'] = htmlspecialchars($_POST['username']);

Und als Gegenmittel für die Injection:

PHP:
mysql_real_escape_string($_POST['username']);

Damit 'fischt' SQL alles 'raus, was bedeutsam für es wäre.
 
PHP:
$_POST['username'] = htmlspecialchars($_POST['username']);

PHP:
mysql_real_escape_string($_POST['username']);

Also einfach

PHP:
$_POST['username'] = htmlspecialchars(mysql_real_escape_string($_POST['username']));
?

oder im MySQL-Code dann "mysql_real_escape_string($_POST['username'])" statt "$_POST['username']"?
 
Ist
HTML:
$_POST['username'] = htmlspecialchars(htmlentities($_POST['username'],ENT_QUOTES));
nicht genug? Da dann die Anführungszeichen Escaped sind?
 
sieh' aber zu, dass magic_quotes off sind, da sonst der server auf die idee kommen könnte, doppelt zu escapen und es dafür bei der ausgabe der dateien keine rückschaltung gibt.

Nils aka XraYSoLo
 
Da ich auch sowas brauche:
Kann man magic_quotes in der php.ini auf off stellen?
 
sieh' aber zu, dass magic_quotes off sind, da sonst der server auf die idee kommen könnte, doppelt zu escapen und es dafür bei der ausgabe der dateien keine rückschaltung gibt.

Nils aka XraYSoLo

also dass da dann kein Backslash vor ' und " kommt?
naja ich schau mal... danke ^^
 
wo einer hinkäme, kommen dann auf einmal zwei hin.
der interpreter kann aber nur einen wieder entfernen, also steht bei der ausgabe dann immernoch einer da, den du nicht wegbekommst.

Nils aka XraYSoLo
 
schreibs einfach so

PHP:
<?php

function MyEscape($inp)
{
    $var = (get_magic_quotes_gpc()) ?
            mysql_escape_string($inp):
            mysql_real_escape_string($inp);
    return $var;
}

$user = (!empty($_POST['username'])) ?
         MyEscape($_POST['username']):
         false;

if(!$user){ die('Bitte füllen sie alle Felder aus!'); }

mysql_query("UPDATE ......... SET username='".$user."' WHERE .....");

?>

die funktion kannst auch überall verwenden also global verfügbar machen um wirklich überall alles was vom user eingegeben werden kann zu sichern.
 
slibbo was soll das bringen:
PHP:
    $var = (get_magic_quotes_gpc()) ?
            mysql_escape_string($inp):
            mysql_real_escape_string($inp);

da kannst gleich mysql_real_escape_string schreiben.
mysql_escape_string ist haar genau das selbe wie mysql_real_escape_string, nur dass es seit PHP 4.3 veraltet ist

Diese Funktion ist identisch zur Funktion mysql_real_escape_string() ausgenommen, dass mysql_real_escape_string() eine Verbindungs-Kennung benötigt und den String entsprechend zum aktuellen Zeichensatz maskiert. Der Funktion mysql_escape_string() kann keine Verbindungs-Kennung übergeben werden und der aktuelle Zeichensatz wird nicht berücksichtigt.

Anmerkung: Diese Funktion ist seit PHP 4.3.0 veraltet. Benutzen Sie diese Funktion nicht und verwenden Sie stattdessen mysql_real_escape_string().
 
Wenn würde ich dir empfehlen gleich alle Daten zu escapen:

PHP:
if (get_magic_quotes_gpc()) {

  foreach ($_POST as $schluessel => $wert) {

    $_POST[$schluessel] = stripslashes($wert);

  }

}

So kannst du das direkt absichern.
Die Funktion get_magic_quotes_gpc() liefert die 0 oder 1, je
nachdem worauf der Schalter in der php.ini steht!

@ matibaski, entweder php.ini ändern oder:

PHP:
ini_set('magic_quotes_gpc', 'Off');
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben