Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Reicht mysqli_real_escape_string aus, um SQL-Injection oder andere SQL-Angriffe zu vermeiden?

Kann mir jemand sagen, ob es sicher ist oder ob es für den SQL-Injection-Angriff oder andere SQL-Angriffe anfällig ist?

Nein. Wie uri2x sagt, siehe SQL-Einschleusung, die mysql_real_escape_string() umgeht .

Der beste Weg Um eine SQL-Injection zu verhindern, verwenden Sie vorbereitete Anweisungen. Sie trennen die Daten (Ihre Parameter) von den Anweisungen (der SQL-Abfragezeichenfolge) und lassen keinen Platz für die Daten, um die Struktur Ihrer Abfrage zu kontaminieren. Vorbereitete Anweisungen lösen eines der grundlegenden Probleme der Anwendungssicherheit .

Für Situationen, in denen Sie keine vorbereiteten Anweisungen verwenden können (z. B. LIMIT ), ist die Verwendung einer sehr strengen Whitelist für jeden spezifischen Zweck die einzige Möglichkeit, Garantie zu geben Sicherheit.

// This is a string literal whitelist
switch ($sortby) {
    case 'column_b':
    case 'col_c':
        // If it literally matches here, it's safe to use
        break;
    default:
        $sortby = 'rowid';
}

// Only numeric characters will pass through this part of the code thanks to type casting
$start = (int) $start;
$howmany = (int) $howmany;
if ($start < 0) {
    $start = 0;
}
if ($howmany < 1) {
    $howmany = 1;
}

// The actual query execution
$stmt = $db->prepare(
    "SELECT * FROM table WHERE col = ? ORDER BY {$sortby} ASC LIMIT {$start}, {$howmany}"
);
$stmt->execute(['value']);
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);

Ich gehe davon aus, dass der obige Code immun gegen SQL-Injection ist, selbst in obskuren Randfällen. Wenn Sie MySQL verwenden, stellen Sie sicher, dass Sie emulierte Vorbereitungen deaktivieren.

$db->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);