czy db_insert jest bezpieczny?

15

Korzystam z metody Drupal 7 db_insert , aby wstawić dane do niestandardowej tabeli w bazie danych Drupal. Przeczytałem, że jest to preferowany sposób, jednak przeszedłem przez kod i doco i nie widzę nigdzie, kto analizuje wartości lub mówi mi, że te wartości są bezpieczne.

Niektóre wartości pochodzą od użytkownika, więc muszę sprawdzić przed atakami SQL Injection.

To jest przykład, który czytałem, gdzie Drupal 6 analizuje wartości, a wersja Drupal 7 tego nie robi.

<?php
// Drupal 6 version
db_query('INSERT INTO {vchess_games} 
   (gid, timestamps, white, black, state, board_white, board_black) ' . "VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s')", 
   $gid, $timestamps, $game['white'], $game['black'], $state, $board_white, $board_black);

// Drupal 7 version
db_insert('vchess_games')
  ->fields(array(
    'gid' => $gid,
    'timestamps' => $timestamps,
    'white' => $game['white'],
    'black' => $game['black'],
    'state' => $state,
    'board_white' => $board_white,
    'board_black' => $board_black
  ))
  ->execute();
?>

źródło

Odpowiedzi:

13

Warstwa bazy danych Drupal otacza PDO i używa przygotowanych instrukcji, więc tak, instrukcje insert są dezynfekowane i chronione przed atakami SQL injection.

Ten cytat z dokumentów Przygotowane oświadczenia mówi najlepiej:

Parametry gotowych instrukcji nie muszą być cytowane; kierowca automatycznie to obsługuje. Jeśli aplikacja korzysta wyłącznie z przygotowanych instrukcji, deweloper może mieć pewność, że nie nastąpi wstrzyknięcie SQL (jednak jeśli inne części zapytania są budowane przy użyciu danych wejściowych bez zmian, wstrzyknięcie SQL jest nadal możliwe).

To samo odnosi się do wszystkich funkcji bazodanowych w Drupal 7 ( db_select, db_deleteetc.). Jedynym potencjalnie niepewnym jest db_query()wykonanie dowolnego przekazanego ci ciągu. Mimo db_query()to możesz przekazać parametry, aby zapytanie było bezpieczne.

Dokumenty warstwy abstrakcji bazy danych zawierają więcej informacji.

Clive
źródło