Ist dies eine sichere Methode zum Einfügen von Formulardaten in eine MySQL-Datenbank? [duplicate]

Lesezeit: 3 Minuten

Benutzer-Avatar
Meilen Pfefferle

Mögliches Duplikat:

Wie kann ich SQL-Injection in PHP verhindern?

Dies ist das Beispiel auf w3schools.org:

HTML-Formular:

<html>
    <body>
        <form action="insert.php" method="post">
            Firstname: <input type="text" name="firstname" />
            Lastname: <input type="text" name="lastname" />
            Age: <input type="text" name="age" />
            <input type="submit" />
        </form>
    </body>
</html>

Datei insert.php:

<?php
    $con = mysql_connect("localhost","peter","abc123");
    if (!$con)
    {
        die('Could not connect: ' . mysql_error());
    }

    mysql_select_db("my_db", $con);

    $sql="INSERT INTO Persons (FirstName, LastName, Age)
          VALUES
          ('$_POST[firstname]','$_POST[lastname]','$_POST[age]')";

    if (!mysql_query($sql,$con))
    {
        die('Error: ' . mysql_error());
    }
    echo "1 record added";

    mysql_close($con)
?>

Ich habe hier andere Fragen durchgelesen, aber ich konnte keine direkte Antwort finden, da die meisten viel komplizierter waren.

Ich sah zu Wie kann ich SQL-Injection in PHP verhindern?aber ich bin etwas verwirrt, wie ich das ändern soll:

$preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)');

$preparedStatement->execute(array(':column' => $unsafeValue));

Angenommen, ich habe das obige HTML-Formular verwendet und wollte die Daten aus dem Feld „Vorname“ in die Datenbank einfügen, sollte es dann so aussehen? Oder soll ich modifizieren column?:

$preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)');

$preparedStatement->execute(array(':column' => $firstname));

  • Also, was genau ist dein Problem?

    – Bogdacutu

    8. März 2012 um 20:20 Uhr

  • Wie kann ich diese Methode sicher machen?

    – Miles Pfefferle

    8. März 2012 um 20:24 Uhr

Benutzer-Avatar
shaunsantacruz

Das von Ihnen bereitgestellte Beispiel fügt die Post-Variablen in die Datenbank ein, ohne sie zuerst auf bösartige Benutzereingaben zu analysieren. Verwenden Sie Typumwandlung, Escape-/Filterfunktionen, vorbereitete Anweisungen usw., bevor Sie sie verwenden, um mit Ihrer DB zu interagieren.

Eine allgemeine Regel lautet, Benutzereingaben niemals zu vertrauen. JE!

Check out: Der beste Weg, um die SQL-Injection in PHP zu stoppen

Als Antwort auf Ihre Frage, hier ist, wie Sie das gesamte Formular mit PDO-vorbereiteten Anweisungen handhaben würden.

$stmt = $db->prepare('INSERT INTO Persons (FirstName, LastName, Age) VALUES (:first_name, :last_name, :age)');

$stmt->execute(array(':first_name' => $first_name,':last_name' => $last_name, ':age' => $age));

Wenn Sie nur eine Spalte wie gewünscht in den Datensatz einfügen möchten, lautet die Syntax:

$stmt = $db->prepare('INSERT INTO Persons (FirstName) VALUES (:first_name)');

$stmt->execute(':first_name', $first_name);

Benutzer-Avatar
Daniel A. Weiß

NEIN.

Das ist HÖCHST anfällig für SQL-Injection-Angriffe.

Anstatt zu verwenden mysql_real_escape_stringschlage ich vor, vorbereitete Anweisungen zu verwenden.

  • Okay danke. Irgendwelche Tipps, wie man es so ändert, dass es sicher ist?

    – Miles Pfefferle

    8. März 2012 um 20:24 Uhr

  • Sie sollten vorbereitete Anweisungen verwenden.

    – Daniel A. Weiß

    8. März 2012 um 20:25 Uhr

Verwenden mysql_real_escape_string.

Benutzer-Avatar
jahuda

$magic_quotes_active = get_magic_quotes_gpc();
$real_escape_string_exists = function_exists('mysql_real_escape_string');

function escape_value($sql) {
    if ($real_escape_string_exists) {
        if($magic_quotes_active) {
            $sql = stripslashes($sql);
        }
        $sql = mysql_real_escape_string($sql);
    } else {
        if(!$magic_quotes_active) {
            $sql = addslashes($sql);
        }
    }
    return $sql;
}

Dies wird als eine sehr sichere Art betrachtet, Daten in eine Datenbank einzufügen. Verwenden Sie die zurückgegebenen $sql als Ihre Anfrage!

1298740cookie-checkIst dies eine sichere Methode zum Einfügen von Formulardaten in eine MySQL-Datenbank? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy