Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Opción de defensa 3: Validación contra valores permitidos

No todo elemento es reemplazable con consultas parametrizadas. Las defensas anteriores no aplican a estos casos de posiciones “ilegales”, como nombres de tablas o columnas y el indicador de orden (ASC o DESC) de la cláusula ORDER BY. En esta situación la defensa más apropiada es validar las entradas de usuario y/o rediseño de la sentencia SQL.

Para nombres de tablas o columnas idealmente se usan valores fijos en el código, no desde parámetros de usuario. Aunque si estos deben ser variables, el parámetro debería ser asociado a un nombre esperado para que no se utilice directamente en el SQL final. Es recomendable reevaluar el diseño cuando esto sucede.

Ejemplo de validación de nombre de tabla:

String tableName;
switch(unsafeUserParameter): // Proveniente de entrada de usuario
  case "clients": tableName = "table_clients";
                 break;
  case "sellers": tableName = "table_sellers";
                 break;
  ...
  default      : throw new InputValidationException("unexpected value provided"
                                                  + " for table name");

La variable tableName puede ser insertada directamente en una sentencia SQL, es considerada legal y esperada. Lo mismo aplica para nombres de columnas.

Para orden de los resultados, al tratarse de solo dos direcciones podría convertirse la entrada de usuario a un valor boolean (true o false). En base a esto se genera programáticamente el texto final para la cláusula ORDER BY. Por ejemplo:

public String getProducts(boolean sortOrder) {
 String query = "SELECT * FROM products ORDER BY price " + (sortOrder ? "ASC" : "DESC");
 // ...
}

Es igual de importante utilizar los tipos de datos apropiados. Si una entrada de usuario puede ser convertida a datos como fecha, numérico, boolean, enumerado, etc., se sabe que el valor a insertar en la consulta es seguro por tener que haber sido de un tipo diferente a texto.

Validar las entradas se recomienda siempre como defensa secundaria (en profundidad), aunque se apliquen otras defensas. Para más información sobre aplicar validaciones, ver la OWASP Input Validation Cheat Sheet.