49 Stimmen

Ist dies eine sichere Methode, um Formulardaten in eine MySQL-Datenbank einzufügen?

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 andere Fragen hier durchgelesen, aber ich konnte keine direkte Antwort finden, da die meisten viel komplizierter waren.

Ich habe mir Wie kann ich SQL-Injection in PHP verhindern? aber ich bin ein wenig verwirrt, wie ich das ändern kann:

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

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

Angenommen, ich benutze das obige HTML-Formular und möchte die Daten aus dem Feld "Vorname" in die Datenbank einfügen, sollte es dann so aussehen? Oder soll ich Folgendes ändern column ?:

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

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

21voto

shaunsantacruz Punkte 8833

Das von Ihnen angegebene Beispiel fügt die Post-Vars in die Datenbank ein, ohne sie vorher auf bösartige Benutzereingaben zu untersuchen. Verwenden Sie Typ-Casting, Escape-/Filterfunktionen, vorbereitete Anweisungen usw., bevor Sie sie zur Interaktion mit Ihrer DB verwenden.

Eine allgemeine Regel lautet, dass man sich nie auf Benutzereingaben verlassen sollte. NIEMALS!

Sehen Sie sich das an: Der beste Weg, um SQL Injection in PHP zu stoppen

Als Antwort auf Ihre Frage, hier ist, wie Sie das gesamte Formular mit PDO vorbereitete Anweisungen behandeln würde.

$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 in den Datensatz einfügen wollen, wie Sie gefragt haben, lautet die Syntax wie folgt:

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

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

8voto

Daniel A. White Punkte 180762

NEIN.

Das heißt HIGHLY anfällig für Sql-Injection-Angriffe.

Anstelle der Verwendung von mysql_real_escape_string schlage ich vor, vorbereitete Erklärungen zu verwenden.

1voto

yunzen Punkte 31443

Verwenden Sie mysql_real_escape_string .

-1voto

yehuda Punkte 1234
$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 gilt als eine sehr sichere Methode, um Daten in eine Datenbank einzufügen. Verwenden Sie die zurückgegebene $sql als Ihre Anfrage!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X