Avertissement «Ne pas accéder directement au tableau Superglobal $ _POST» sur Netbeans 7.4 pour PHP

118

J'ai ce message d'avertissement sur Netbeans 7.4 pour PHP lorsque j'utilise $ _POST , $ _GET , $ _SERVER , ....

N'accédez pas directement au tableau Superglobal $ _POST

Qu'est-ce que ça veut dire? Que puis-je faire pour corriger cet avertissement?

Edit: l' exemple de code Event affiche toujours cet avertissement.

Kannika
la source
1
Quel est le code qui assure ce message dans Netbeans?
TiMESPLiNTER
2
C'est juste une recommandation, vous pouvez la désactiver dans les options ... et je dirais que ce n'est pas une question de programmation!
Matteo Tassinari
1
Je veux juste savoir ce que cet avertissement veut que je change! car l'ancienne version de Netbeans ne s'affiche pas. Y a-t-il un autre moyen d'obtenir ces paramètres? (Je veux dire $ _POST)
Kannika
@MatteoTassinari Je sais que ce n'est que la recommandation et je sais où le désactiver, mais que puis-je faire pour corriger sans aucun avertissement? Je pense que mes connaissances ont des limites pour recevoir un avertissement, mais je veux juste le corriger pour que mon code soit à jour avec de nouvelles choses parce que je sais que seulement $ _POST obtiendra ces formulaires de publication soumis. Quoi qu'il en soit, merci pour votre commentaire: D
Kannika
1
duplication possible d'un problème
Ankur

Réponses:

92

filter_input(INPUT_POST, 'var_name')au lieu de $_POST['var_name']
filter_input_array(INPUT_POST)au lieu de$_POST

Homerocker
la source
6
Répondez-vous à la question «que signifie l'avertissement» ou à la question «comment le supprimer»? Parce que je suis d'accord avec vous, c'est ce que signifie l'avertissement, mais en utilisant la fonction, l'avertissement reste là. Je l'ai en ce moment sur un $name = filter_input(INPUT_POST, $_POST["name"]);.
stenci
6
@stenci vous utilisez à nouveau $ _POST alors que vous devriez faire quelque chose comme ceci $ name = filter_input (INPUT_POST, "name");
Wojciech Sobczyk
16
Eh bien, l'avertissement peut disparaître, mais si vous ne spécifiez pas de filtre, vous ne résoudrez pas vraiment le problème de sécurité signalé par NetBeans. Par exemple, si vous attendez un int, utilisez:filter_input(INPUT_POST, 'var_name', FILTER_SANITIZE_NUMBER_INT)
HoffZ
44
-1: Cette réponse semble assez triviale. aucune explication, ce que fait filter_input, pas même un lien vers php.net/filter_input . Cela me fait peur que les gens le voient, l'utilisent, pensent qu'ils écrivent un meilleur code mais ne comprennent toujours rien.
IARI
5
Ow, suggérer l'utilisation d'une fonction de filtre sans argument de filtre conduit à FILTER_UNSAFE_RAW, ce qui équivaut à TRUST_ALL_BAD_INPUT
Kzqai
88

Bien qu'un peu tard, je suis tombé sur cette question en cherchant la solution pour le même problème, alors j'espère que cela pourra vous aider ...

Je me suis retrouvé dans la même obscurité que toi. Je viens de trouver cet article, qui explique quelques nouveaux conseils introduits dans NetBeans 7.4, dont celui-ci:

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

La raison pour laquelle il a été ajouté est que les superglobales sont généralement remplies d'entrées utilisateur, auxquelles il ne faut jamais faire confiance aveuglément. Au lieu de cela, une sorte de filtrage devrait être effectuée, et c'est ce que suggère l'indice. Filtrez la valeur superglobale au cas où elle aurait un contenu empoisonné.

Par exemple, où j'avais:

$_SERVER['SERVER_NAME']

J'ai mis à la place:

filter_input(INPUT_SERVER, 'SERVER_NAME', FILTER_SANITIZE_STRING)

Vous avez le document filter_input et filters ici:

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

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

Ricardo Palomares Martínez
la source
Si vous faites exactement ce que vous dites, Netbeans soulignera toujours les parties "$ _POST" ou "$ _GET" et affichera la notification comme si elle n'était pas filtrée. Ce problème pourrait simplement être un bogue Netbeans (au moins dans la version 8.1).
user3640967
6

Je suis d'accord avec les autres répondants que dans la plupart des cas (presque toujours), il est nécessaire de nettoyer votre entrée.

Mais considérez un tel code (c'est pour un contrôleur 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();
}

Il ne serait pas très utile d'appliquer un assainissement ici (même si cela ne casserait rien non plus).

Alors, suivez les recommandations, mais pas aveuglément - comprenez plutôt pourquoi elles le sont :)

Rauni Lillemets
la source
1

Juste utiliser

filter_input (INPUT_METHOD_NAME, 'var_name') au lieu de $ _INPUT_METHOD_NAME ['var_name'] filter_input_array (INPUT_METHOD_NAME) au lieu de $ _INPUT_METHOD_NAME

par exemple

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

au lieu de

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

Et utilise

    var_dump(filter_input_array(INPUT_SERVER));

au lieu de

    var_dump($_SERVER);

NB: Appliquer à toutes les autres variables Super Global

Sani Kamal
la source
0

Voici une partie d'une ligne de mon code qui a fait apparaître l'avertissement dans NetBeans:

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

Après de nombreuses recherches et vu comment il existe un bazillion de façons de filtrer ce tableau, j'en ai trouvé une qui était simple. Et mon code fonctionne et NetBeans est content:

$p = filter_input(INPUT_GET, 'p');
$page = (!empty($p))
Jim Tippins
la source