2017-09-26 4 views
0

Je voudrais composer une requête NpgsqlConnection.BeginTextExport() spécifiant la table à exporter en tant que paramètre. Le naive way pour ce faire est la suivante:Paramètre défensif pour une requête COPY avec Npgsql?

using (var reader = conn.BeginTextExport("COPY " + myTable + " TO STDOUT")) 
{ 
    Console.WriteLine(reader.ReadLine()); 
} 

Mais je ne l'aime pas à cause du motif évident d'injection SQL. Je peux penser à beaucoup d'options assez compliquées pour assainir le champ myTable, mais je me demande si c'est le modèle canonique ici. Une idée?

Répondre

1

Je crois que dans votre cas, vous devez vous en tenir à "Echapper à toutes les entrées fournies par l'utilisateur".

Cette technique est généralement utilisée en dernier recours. La validation d'entrée est probablement un meilleur choix car cette méthodologie est fragile comparée à d'autres défenses et nous ne pouvons pas garantir qu'elle empêchera toute injection SQL dans toutes les situations.

Cette technique consiste à échapper à l'entrée de l'utilisateur avant de l'insérer dans une requête. Il est très spécifique à la base de données dans sa mise en œuvre. Il est généralement recommandé de modifier le code existant uniquement lorsque la validation des entrées n'est pas rentable. Les applications créées à partir de zéro ou les applications nécessitant une faible tolérance au risque doivent être créées ou réécrites à l'aide de requêtes paramétrées, de procédures stockées ou d'une sorte de Object Relational Mapper (ORM) qui génère vos requêtes pour vous.

Cette technique fonctionne comme ceci. Chaque SGBD prend en charge un ou plusieurs schémas d'échappement de caractères spécifiques à certains types de requêtes. Si vous quittez alors toutes les entrées fournies par l'utilisateur en utilisant le schéma d'échappement approprié pour la base de données que vous utilisez, le SGBD ne confondra pas cette entrée avec le code SQL écrit par le développeur, évitant ainsi les éventuelles vulnérabilités d'injection SQL.

En cas si PostGres vous pouvez utiliser les guillemets dollar

https://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-DOLLAR-QUOTING

1

Voir https://github.com/npgsql/npgsql/issues/1677. L'essentiel de la réponse est que Npgsql transmet simplement les paramètres à PostgreSQL (plutôt que d'effectuer une substitution côté client), et PostgreSQL ne supporte pas les paramètres dans les noms de tables. Voir la réponse de github pour une certaine justification de ceci.