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.

Kannika
fuente
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

Homerocker
fuente
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

Ricardo Palomares Martínez
fuente
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 :)

Rauni Lillemets
fuente
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

Sani Kamal
fuente
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))
Jim Tippins
fuente