Advertencia "No acceda a Superglobal $ _POST Array directamente" en Netbeans 7.4 para PHP


118

Tengo este mensaje de advertencia en Netbeans 7.4 para PHP mientras estoy usando $ _POST , $ _GET , $ _SERVER , ....

No acceda directamente a la matriz Superglobal $ _POST

Qué significa eso? ¿Qué puedo hacer para corregir esta advertencia?

Editar: el código de muestra del evento todavía muestra esta advertencia.


1
¿Cuál es el código que asegura este mensaje en Netbeans?
TIMESPLiNTER

2
Es solo una recomendación, puedes desactivarlo en las opciones ... ¡y yo diría que esta no es una pregunta de programación!
Matteo Tassinari

1
¡Solo quiero saber qué quiere que cambie esta advertencia! porque la versión anterior de netbeans no se muestra. ¿Hay otra forma de obtener esos parámetros? (Me refiero a $ _POST)
Kannika

@MatteoTassinari Sé que es solo la recomendación y sé dónde desactivarlo, pero ¿qué puedo hacer para corregirlo sin previo aviso? Creo que mi conocimiento tiene un límite para recibir advertencias, pero solo quiero arreglarlo para que mi código esté actualizado con algo nuevo porque sé que solo $ _POST hará que se envíen los formularios de publicación. De todos modos, gracias por tu comentario: D
Kannika

1
posible duplicado del problema
Ankur

Respuestas:


92

filter_input(INPUT_POST, 'var_name')en lugar de en $_POST['var_name']
filter_input_array(INPUT_POST)lugar de$_POST


6
¿Está respondiendo a la pregunta "qué significa la advertencia" oa la pregunta "cómo eliminarla"? Porque estoy de acuerdo contigo, eso es lo que significa la advertencia, pero usando la función la advertencia permanece ahí. Lo tengo ahora mismo en un $name = filter_input(INPUT_POST, $_POST["name"]);.
stenci

6
@stenci está usando $ _POST de nuevo mientras que debería hacer algo como esto $ name = filter_input (INPUT_POST, "name");
Wojciech Sobczyk

16
Bueno, la advertencia puede desaparecer, pero si no especifica un filtro, no solucionará realmente el problema de seguridad que señala NetBeans. Por ejemplo, si está esperando un int, use:filter_input(INPUT_POST, 'var_name', FILTER_SANITIZE_NUMBER_INT)
HoffZ

44
-1: Esta respuesta parece un poco trivial. sin explicación, qué hace filter_input, ni siquiera un enlace a php.net/filter_input . Me asusta que la gente simplemente lo vea, lo use, piense que está escribiendo un código mejor pero aún no entienda nada.
IARI

5
Ow, sugerir el uso de una función de filtro sin un argumento de filtro conduce a FILTER_UNSAFE_RAW, que es equivalente a TRUST_ALL_BAD_INPUT
Kzqai

88

Aunque un poco tarde, me encontré con esta pregunta mientras buscaba la solución para el mismo problema, así que espero que pueda ser de alguna ayuda ...

Me encontré en la misma oscuridad que tú. Acabo de encontrar este artículo, que explica algunas sugerencias nuevas introducidas en NetBeans 7.4, incluido este:

https://blogs.oracle.com/netbeansphp/entry/improve_your_code_with_new

La razón por la que se ha agregado es porque las superglobales generalmente están llenas de información de usuario, en la que nunca se debe confiar ciegamente. En cambio, se debe hacer algún tipo de filtrado, y eso es lo que sugiere la sugerencia. Filtre el valor superglobal en caso de que tenga algún contenido envenenado.

Por ejemplo, donde tuve:

$_SERVER['SERVER_NAME']

He puesto en su lugar:

filter_input(INPUT_SERVER, 'SERVER_NAME', FILTER_SANITIZE_STRING)

Tienes el documento filter_input y filtros aquí:

http://www.php.net/manual/en/function.filter-input.php

http://www.php.net/manual/en/filter.filters.php


Si hace exactamente lo que dice, Netbeans todavía subrayará las partes "$ _POST" o "$ _GET" y mostrará la notificación como si no se estuviera filtrando. Este problema podría ser un error de Netbeans (al menos en la versión 8.1).
user3640967

6

Estoy de acuerdo con las otras personas que respondieron en que en la mayoría de los casos (casi siempre) es necesario desinfectar Su entrada.

Pero considere ese código (es para un controlador REST):

$method = $_SERVER['REQUEST_METHOD'];

switch ($method) {
            case 'GET':
                return $this->doGet($request, $object);
            case 'POST':
                return $this->doPost($request, $object);
            case 'PUT':
                return $this->doPut($request, $object);
            case 'DELETE':
                return $this->doDelete($request, $object);
            default:
                return $this->onBadRequest();
}

No sería muy útil aplicar higienizante aquí (aunque tampoco rompería nada).

Por lo tanto, siga las recomendaciones, pero no a ciegas; más bien, comprenda por qué son para :)


1

Solo usa

filter_input (INPUT_METHOD_NAME, 'var_name') en lugar de $ _INPUT_METHOD_NAME ['var_name'] filter_input_array (INPUT_METHOD_NAME) en lugar de $ _INPUT_METHOD_NAME

p.ej

    $host= filter_input(INPUT_SERVER, 'HTTP_HOST');
    echo $host;

en vez de

    $host= $_SERVER['HTTP_HOST'];
    echo $host;

Y use

    var_dump(filter_input_array(INPUT_SERVER));

en vez de

    var_dump($_SERVER);

NB: Aplicar a todas las demás variables Super Global


0

Aquí hay parte de una línea en mi código que generó la advertencia en NetBeans:

$page = (!empty($_GET['p'])) 

Después de mucha investigación y de ver cómo hay miles de millones de formas de filtrar esta matriz, encontré una que era simple. Y mi código funciona y NetBeans está contento:

$p = filter_input(INPUT_GET, 'p');
$page = (!empty($p))
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.