Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Czy mysqli_real_escape_string wystarczy, aby uniknąć wstrzyknięcia SQL lub innych ataków SQL?

Czy ktoś mógłby mi powiedzieć, czy jest bezpieczny lub czy jest podatny na atak SQL Injection lub inne ataki SQL?

Nie. Jak mówi uri2x, zobacz Wstrzykiwanie SQL, które omija mysql_real_escape_string() .

Najlepszy sposób aby zapobiec wstrzyknięciu SQL, należy użyć przygotowanych instrukcji. Oddzielają dane (twoje parametry) od instrukcji (ciąg zapytania SQL) i nie pozostawiają miejsca na to, aby dane zanieczyściły strukturę zapytania. Przygotowane oświadczenia rozwiązują jeden z podstawowych problemów bezpieczeństwa aplikacji .

W sytuacji, gdy nie możesz użyć przygotowanych instrukcji (np. LIMIT ), używanie bardzo ścisłej białej listy dla każdego konkretnego celu jest jedynym sposobem na zagwarantowanie bezpieczeństwo.

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

Zakładam, że powyższy kod jest odporny na wstrzyknięcie SQL, nawet w przypadku niejasnych krawędzi. Jeśli używasz MySQL, upewnij się, że wyłączyłeś emulowane przygotowania.

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Instalowanie sterowników MySQL JDBC w narzędziach Pentaho Data Integration i BA Server

  2. MySQL usuwa zduplikowane rekordy, ale zachowuje najnowsze

  3. Grupuj wiersze za pomocą grupowania według klauzuli w MySQL

  4. Błąd krytyczny:wywołanie niezdefiniowanej funkcji mysqli_result()

  5. Jak wyłączyć sprawdzanie klucza obcego w MySQL?