sql >> Databáze >  >> RDS >> Mysql

Je mysqli_real_escape_string dostačující, aby se zabránilo SQL injection nebo jiným SQL útokům?

Mohl by mi někdo říct, zda je bezpečný nebo zda je zranitelný vůči útoku SQL Injection nebo jiným útokům SQL?

Ne. Jak říká uri2x, viz Injekce SQL, která obchází mysql_real_escape_string() .

Nejlepší způsob Chcete-li zabránit vkládání SQL, je použít připravené příkazy. Oddělují data (vaše parametry) od instrukcí (řetězec dotazu SQL) a neponechávají žádný prostor, aby data kontaminovala strukturu vašeho dotazu. Připravená prohlášení řeší jeden ze základních problémů zabezpečení aplikací .

V situaci, kdy nemůžete použít připravené příkazy (např. LIMIT ), použití velmi přísného seznamu povolených pro každý konkrétní účel je jediným způsobem, jak zaručit zabezpečení.

// 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);

Předpokládám, že výše uvedený kód je imunní vůči SQL injection, a to i v obskurních okrajových případech. Pokud používáte MySQL, ujistěte se, že jste emulované přípravy vypnuli.

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



  1. Jak funguje funkce REGEX_REPLACE() v MySQL

  2. zkontrolujte platné datum, které je deklarováno ve varchar2

  3. Příklady TIMESTAMP() – MySQL

  4. Jak vybrat uživatelsky přívětivou databázi pro vaši firmu