¿Cómo se escapan las cadenas para cada extensión de base de datos en php?

Antes de que nadie saque conclusiones sobre la naturaleza de esta pregunta, ya sé sobre declaraciones parametrizadas / preparadas y las uso siempre que sea posible. Desafortunadamente, no siempre es posible usarlos al crear consultas dinámicas.


Estoy interesado en trabajar con bases de datos que no sean MySQL, pero no puedo encontrar fácilmente buenas fonts en cuanto a cómo escapar cadenas para cada extensión de base de datos para evitar la inyección de SQL .

Los documentos PHP enumeran las siguientes extensiones de base de datos específicas del proveedor. He engatillado a los que más me interesan:

  • CUBRID
  • dBase
  • DB ++
  • FrontBase
  • filePro
  • Firebird / InterBase
  • Informix
  • IBM DB2
  • Ingres
  • MaxDB
  • Mongo
  • mSQL
  • Mssql
  • MySQL
  • Mysqli
  • Mysqlnd
  • mysqlnd_ qc
  • OCI8
  • Ovrimos SQL
  • Paradoja
  • PostgreSQL
  • SQLite
  • SQLite3
  • Sybase
  • tokyo_ tirano

Ejemplo de consulta dinámica que no funcionará para la mayoría de las declaraciones parametrizadas:

"Select $col1, $col2 from $table where $col1 = ?" 

Después de que se hayan escapado $col1 , $col2 y $table , la statement se puede usar en una statement preparada.

PostgreSQL y otros (PDO)

PostgreSQL puede usar pg_escape_string para el escape de cadenas.

Para PostgreSQL no necesita ningún escape gracias a pg_query_params()

Además de eso, debe usar PDO con declaraciones preparadas . Ellos se encargan de eso y puedes pasar argumentos por separado; al igual que con pg_query_params()

MongoDB

En MongoDB no escribe SQL, pero trabaja con objetos (“documentos”): no tiene que escapar de cosas ya que nunca usa cadenas, excepto por los datos.

Sin embargo, debe asegurarse de pasar cadenas y no arrays a la API de MongoDB. Al menos en PHP, pasar una matriz como array('$ne' => 1) daría como resultado una verificación != 1 y, por lo tanto, sería similarmente peligroso como la inyección SQL. Y desafortunadamente, PHP permite al cliente crear matrices dentro de $_POST etc. simplemente proporcionando un campo con un nombre usando la syntax de PHP, como la password[$ne] . [Fuente]

MySQL

Use mysql_real_escape_string .

MySQLi

Usa mysqli_real_escape_string .

OCI8

Por lo que yo puedo decir:

 function oci_escape_string( $str ) { return strtr( $str, array( "'" => "''" ) ); } 

Debe hacer el truco , ignorando caracteres comodín para las declaraciones LIKE.

CUBRID

De acuerdo con su manual, CUBRID PHP API tiene la misma syntax que MySQL, es decir, cubrid_real_escape_string . Con su nueva versión CUBRID 8.4.0 proporciona una compatibilidad del 90% con MySQL.