Comment faire pour échapper en toute sécurité des chaînes arbitraires pour SQL dans PostgreSQL en utilisant Java

J'ai un cas particulier exigeant que je génère le cadre d'une clause SQL where de l'utilisateur fourni des valeurs d'entrée. Je tiens à prévenir toute sorte de vulnérabilité d'Injection SQL. Je suis venu avec le code suivant:

private String encodeSafeSqlStrForPostgresSQL(String str) {

  //Replace all apostrophes with double apostrophes
  String safeStr = str.replace("'", "''");

  //Replace all backslashes with double backslashes
  safeStr = safeStr.replace("\\", "\\\\");

  //Replace all non-alphanumeric and punctuation characters (per ASCII only)
  safeStr = safeStr.replaceAll("[^\\p{Alnum}\\p{Punct}]", "");

  //Use PostgreSQL's special escape string modifier
  safeStr = "E'" + safeStr + "'";

  return safeStr;
}

Questions:

  • Voyez-vous des questions?
  • Pouvez-vous fournir une meilleure solution?
  • Existe-t-il des bibliothèques pour aider à cela?

Notes:

  • C'est une question commune que sur de SI et d'ailleurs, mais la seule réponse que j'ai vu, c'est de toujours utiliser PreparedStatements. Fwiw, je suis une utilisation JasperReports. Je veux garder la requête à l'intérieur de JasperReports. Le haut-Jasper fonctions des paramètres de la requête de gestion des paramètres (y compris le X{} fonctions) ne sont pas suffisantes pour ce que je dois paramétrer. Je pourrais essayer de créer un personnalisé Jasper QueryExecutor qui me permettrait d'injecter de mon propre X{} de fonctions, mais c'est plus compliqué que de simplement générer une dynamique de clause SQL where avec Jasper $P!{} syntaxe.
  • J'ai regardé la OWASP bibliothèques. Ils n'ont pas de PostgresSQL codec encore. J'ai regardé la OracleCodec bien et son échapper semblent simplistes. Je ne suis pas sûr qu'il serait d'une grande aidant à prévenir les attaques par injection SQL.
  • Dans mon code, je suis en ajoutant le E de manière à ne pas être dépendant sur PostgreSQL est standard_conforming_strings réglage. Idéalement, je n'aurais pas à ajouter et, ensuite, la fonction ne doit pas être PostgreSQL spécifiques. Plus d'infos: http://www.postgresql.org/docs/9.0/static/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-ESCAPE .

Idéalement, j'aurais aimé plus générique et robuste solution que je connaissais serait en sécurité et en charge toutes les chaînes UTF-8.

source d'informationauteur kaliatech