db_insert est-il sécurisé?

15

J'utilise la méthode Drupal 7 db_insert , pour insérer des données dans une table personnalisée dans la base de données Drupal. J'ai lu que c'est la façon préférée, mais j'ai parcouru le code et le doco et je ne vois aucun endroit qui analyse les valeurs ou me dit que ces valeurs sont sûres.

Certaines valeurs proviennent de l'utilisateur, je dois donc vérifier les attaques par injection SQL.

C'est l'exemple que je lisais, où le Drupal 6 analyse les valeurs, et pas la version drupal 7.

<?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();
?>

la source

Réponses:

13

La couche de base de données Drupal entoure PDO et utilise des instructions préparées, donc oui, les instructions d'insertion sont nettoyées et protégées contre les attaques par injection SQL.

Cette citation des documents des déclarations préparées le dit le mieux:

Les paramètres des instructions préparées n'ont pas besoin d'être cités; le pilote s'en charge automatiquement. Si une application utilise exclusivement des instructions préparées, le développeur peut être sûr qu'aucune injection SQL ne se produira (cependant, si d'autres parties de la requête sont créées avec des entrées non échappées, l'injection SQL est toujours possible).

La même chose est vrai pour toutes les fonctions de base de données dans Drupal 7 ( db_select, db_delete, etc.). Le seul qui est encore potentiellement non sécurisé est celui db_query()qui exécutera toute chaîne arbitraire que vous lui passerez. Même avec db_query(), cependant, vous pouvez transmettre des paramètres afin que votre requête soit sûre.

Les documents de la couche d'abstraction de la base de données contiennent des informations supplémentaires.

Clive
la source