Warnung "Nicht direkt auf das superglobale $ _POST-Array zugreifen" in Netbeans 7.4 für PHP

118

Ich habe diese Warnmeldung auf Netbeans 7.4 für PHP erhalten, während ich $ _POST , $ _GET , $ _SERVER , .... verwende.

Greifen Sie nicht direkt auf das Superglobal $ _POST-Array zu

Was heißt das? Was kann ich tun, um diese Warnung zu korrigieren?

Bearbeiten: Der Ereignis-Beispielcode zeigt diese Warnung weiterhin an.

Kannika
quelle
1
Was ist der Code, der diese Nachricht in Netbeans versichert?
TiMESPLiNTER
2
Es ist nur eine Empfehlung, Sie können es in den Optionen deaktivieren ... und ich würde sagen, dies ist keine Programmierfrage!
Matteo Tassinari
1
Ich möchte nur wissen, was diese Warnung von mir verlangt! weil ältere Netbeans-Version nicht angezeigt wird. Gibt es eine andere Möglichkeit, diese Parameter abzurufen? (Ich meine $ _POST)
Kannika
@MatteoTassinari Ich weiß, dass dies nur die Empfehlung ist und ich weiß, wo ich sie deaktivieren kann, aber was kann ich tun, um sie ohne Vorwarnung zu korrigieren? Ich denke, mein Wissen hat Grenzen, um eine Warnung zu erhalten, aber ich möchte es nur korrigieren, um meinen Code mit neuen Dingen auf den neuesten Stand zu bringen, da ich weiß, dass nur $ _POST diese Posting-Formulare erhalten wird. Wie auch immer, danke für deinen Kommentar: D
Kannika

Antworten:

92

filter_input(INPUT_POST, 'var_name')statt $_POST['var_name']
filter_input_array(INPUT_POST)statt statt$_POST

Homerocker
quelle
6
Beantworten Sie die Frage "Was bedeutet die Warnung?" Oder die Frage "Wie wird sie entfernt?". Weil ich Ihnen zustimme, bedeutet das die Warnung, aber mit der Funktion bleibt die Warnung dort. Ich habe es gerade auf einem $name = filter_input(INPUT_POST, $_POST["name"]);.
Stenci
6
@stenci Sie verwenden $ _POST erneut, während Sie so etwas tun sollten $ name = filter_input (INPUT_POST, "name");
Wojciech Sobczyk
16
Nun, die Warnung verschwindet möglicherweise, aber wenn Sie keinen Filter angeben, können Sie das Sicherheitsproblem, auf das NetBeans hinweist, nicht wirklich beheben. Wenn Sie beispielsweise ein int erwarten, verwenden Sie:filter_input(INPUT_POST, 'var_name', FILTER_SANITIZE_NUMBER_INT)
HoffZ
44
-1: Diese Antwort scheint trivial zu sein. Keine Erklärung, was filter_input macht, nicht einmal ein Link zu php.net/filter_input . Es macht mir Angst, dass die Leute es einfach sehen, benutzen, denken, sie schreiben besseren Code, verstehen aber immer noch nichts.
IARI
5
Ow, die Verwendung einer Filterfunktion ohne Filterargument vorzuschlagen, führt zu FILTER_UNSAFE_RAW, was TRUST_ALL_BAD_INPUT
Kzqai
88

Obwohl etwas spät, bin ich auf diese Frage gestoßen, als ich nach der Lösung für das gleiche Problem gesucht habe. Ich hoffe, dass sie hilfreich sein kann ...

Ich befand mich in derselben Dunkelheit wie du. Ich habe gerade diesen Artikel gefunden, der einige neue Hinweise erklärt, die in NetBeans 7.4 eingeführt wurden, einschließlich dieses:

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

Der Grund, warum es hinzugefügt wurde, ist, dass Superglobale normalerweise mit Benutzereingaben gefüllt sind, denen niemals blind vertraut werden sollte. Stattdessen sollte eine Art Filterung durchgeführt werden, und das schlägt der Hinweis vor. Filtern Sie den superglobalen Wert, falls er einen vergifteten Inhalt hat.

Zum Beispiel, wo ich hatte:

$_SERVER['SERVER_NAME']

Ich habe stattdessen gesagt:

filter_input(INPUT_SERVER, 'SERVER_NAME', FILTER_SANITIZE_STRING)

Sie haben das filter_input- und filter-Dokument hier:

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

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

Ricardo Palomares Martínez
quelle
Wenn Sie genau das tun, was Sie sagen, unterstreicht Netbeans weiterhin die Teile "$ _POST" oder "$ _GET" und zeigt die Benachrichtigung so an, als würde sie nicht gefiltert. Dieses Problem ist möglicherweise nur ein Netbeans-Fehler (mindestens in Version 8.1).
user3640967
6

Ich stimme den anderen Antwortenden zu, dass es in den meisten Fällen (fast immer) notwendig ist, Ihre Eingaben zu bereinigen.

Beachten Sie jedoch einen solchen Code (für einen REST-Controller):

$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();
}

Es wäre nicht sehr nützlich, hier Desinfektion anzuwenden (obwohl es auch nichts kaputt machen würde).

Befolgen Sie also die Empfehlungen, aber nicht blind - verstehen Sie lieber, warum sie dafür sind :)

Rauni Lillemets
quelle
1

Benutz einfach

filter_input (INPUT_METHOD_NAME, 'var_name') anstelle von $ _INPUT_METHOD_NAME ['var_name'] filter_input_array (INPUT_METHOD_NAME) anstelle von $ _INPUT_METHOD_NAME

z.B

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

anstatt

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

Und verwenden

    var_dump(filter_input_array(INPUT_SERVER));

anstatt

    var_dump($_SERVER);

NB: Auf alle anderen Super Global-Variablen anwenden

Sani Kamal
quelle
0

Hier ist ein Teil einer Zeile in meinem Code, die die Warnung in NetBeans angezeigt hat:

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

Nachdem ich viel recherchiert und gesehen hatte, wie es unzählige Möglichkeiten gibt, dieses Array zu filtern, fand ich eine, die einfach war. Und mein Code funktioniert und NetBeans freut sich:

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