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.


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


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


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 :)


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


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))
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.