validacion filtros filter_var filter_validate_int filter_sanitize_url filter_sanitize_string filter_input array php security filter-input

filtros - El nuevo input_filter de PHP no lee matrices $_GET o $_POST



php filter_var (6)

En PHP 5.2 había una bonita función de seguridad añadida llamada "input_filter", así que en vez de decir:

$name = $_GET[''name''];

ahora puedes decir:

$name = filter_input (INPUT_GET, ''name'', FILTER_SANITIZE_STRING);

y automáticamente desinfecta su cadena, también hay:

  • FILTER_SANITIZE_ENCODED
  • FILTER_SANITIZE_NUMBER_INT
  • FILTER_SANITIZE_EMAIL
  • FILTER_SANITIZE_URL

etc. entonces esta es una característica de seguridad muy conveniente de usar y quiero cambiarla por completo.

El problema es ... A menudo manipulo las matrices $ _GET y $ _POST antes de procesarlas, así:

$ _GET [''name''] = ''(nombre predeterminado)'';

pero parece que filter_input no tiene acceso a los cambios en $ _GET ya que dice "INPUT_GET" que es de tipo int (?). Sería bueno si pudiera obtener filter_input para leer $ _GET en su lugar, pero:

$name = filter_input ( $_GET, ''name'', FILTER_SANITIZE_STRING );

me da el error:

Warning: filter_input() expects parameter 1 to be long, array given.

¿Alguien puede pensar de una manera que yo podría:

  • manipular la fuente de INPUT_GET (donde sea) para que pueda cambiar sus valores antes de que filter_input pueda leerlos
  • obtener filter_input para leer $_GET

ADDENDUM:

Rich preguntó: "¿Por qué cambias las matrices de todos modos, seguramente quieres que sean una entrada, en lugar de algo que hayas insertado programáticamente".

Es un lugar muy conveniente para preprocesar las variables que entran, por ejemplo, para:

  • establecer los valores predeterminados (si $ _GET [''state''] = '''' then $ _GET [''state''] = ''AL'')
  • hacer el procesamiento manual (eliminar todos los espacios, etc.)
  • seguridad (parte de la cual se hará mediante filter_input ahora)

Entonces sé que para cuando obtenga la variable entrante, es segura y válida. Por supuesto, podría copiar la matriz $ _GET a otra matriz y procesar ESA matriz, pero eso es solo un paso innecesario ya que I $ _GET ya es una matriz que funciona, por lo que tiene sentido hacerlo con estas matrices de sistemas que ya existen.


El bit INPUT_GET es solo un identificador (número) que le dice a PHP que necesita obtener el valor de $ _GET.

Si desea utilizar filter_input en toda la matriz, debe recorrerla, enviar cada clave de la matriz a filter_input y devolver el resultado a $ _GET.

Probablemente sea tan fácil simplemente escribir una función que te desinfecte a ti mismo, y eso también te permitirá tratar con matrices en matrices (no parece que filter_input lo haga). Hay un par de estas funciones de muestra en los comentarios de la documentación de PHP.net, haciendo cosas como eliminar "citas mágicas". Vea aquí para un ejemplo.


Podría forzarlo manualmente para que vuelva a leer las matrices utilizando filter_var y filter_var_array

$name = filter_var ( $_GET[''name''], FILTER_SANITIZE_STRING );


Si está cambiando manualmente la matriz, seguramente no es necesario sanarlo de todos modos? ¿Por qué cambias las matrices de todos modos, seguramente quieres que sean una entrada, en lugar de algo que has insertado programáticamente.

Quizás más código / contexto sería útil.


Una forma práctica de hacerlo sin modificar la matriz global:

if (!($name = filter_input(INPUT_GET, ''name''))) { $name = ''default_value''; }

O usando el operador ternario:

$name = ($name = filter_input(INPUT_GET, ''name'')) ? $name : ''default_value'';


El nuevo input_filter de PHP no lee las $_GET o $_POST . Si está sobreescribiendo Global''s (como, $_GET , $_POST ), entonces no acepte filter_input. En su lugar, use filter_var ( $_GET[''name''], FILTER_SANITIZE_STRING ) pasando la variable manualmente.


Como fue sugerido por Jrngs:

Omita la modificación programática de la variable de solicitud superglobal y defina y use nuevas variables ordinarias.

No solo es mucho más rápido crear nuevas variables que acceder y modificar el valor en una matriz asociativa (matriz con índices de cadena), sino que también es una práctica mucho mejor.

El objetivo de la función filter_input es ELIMINAR finalmente el uso de variables superglobales, ya que son el punto más peligroso de todos los scripts PHP y la causa más frecuente de vulnerabilidades de seguridad (tanto para XSS como SQL), así como errores y confusión. especialmente en proyectos grandes.

Por ejemplo, las variables $ _GET y $ _REQUEST deben devolver el mismo valor para la misma clave, sin embargo:

.../?var=1 var_dump($_GET[''var'']); ---> string ''1'' (length=1) var_dump($_REQUEST[''var'']); ---> string ''1'' (length=1) $_GET[''var''] = 2; var_dump($_GET[''var'']); ---> int 2 var_dump($_REQUEST[''var'']; ---> string ''1'' (length=1)

Sin mencionar las variables superglobales, apenas tiene sentido en el código orientado a objetos.

Por lo tanto, si la función filter_input accede a las variables superglobales $ _GET / $ _ POST / $ _ REQUEST, eso vencería por completo el punto de esta función. Y definitivamente NO DEBERÍAS usar la función filter_var sugerida para esto:

filter_var($_GET[''var''],FILTER_SANITIZE_STRING); ---> JUST NO!

La función filter_var se creó para proporcionar funcionalidad de filtrado / desinfección para variables que no son de solicitud, no para este tipo de "hack". Lo que está haciendo es básicamente tomar filtros de la función filter_input , que se creó originalmente para proporcionar un acceso mejor y más seguro a los datos de solicitud, omitir completamente la función, acceder a los datos de solicitud de la forma en que se creó filter_input para reemplazar y aplicar los filtros proporcionado por filter_input en los datos de solicitud. Y eso está simplemente mal. :)