Peringatan “Jangan Akses Array Superglobal $ _POST Secara Langsung” di Netbeans 7.4 untuk PHP

118

Saya mendapat peringatan pesan ini di Netbeans 7.4 untuk PHP saat saya menggunakan $ _POST , $ _GET , $ _SERVER , ....

Jangan Akses Array $ _POST Superglobal Secara Langsung

Apa artinya? Apa yang dapat saya lakukan untuk memperbaiki peringatan ini?

Edit: Kode contoh Peristiwa masih menunjukkan peringatan ini.

Kannika
sumber
1
Apa kode yang menjamin pesan ini di Netbeans?
TiMESPLiNTER
2
Ini hanya rekomendasi, Anda dapat mematikannya di opsi ... dan menurut saya ini bukan pertanyaan pemrograman!
Matteo Tassinari
1
Saya hanya ingin tahu peringatan apa yang ingin saya ubah! karena versi netbeans yang lebih lama tidak muncul. Apakah ada cara lain untuk mendapatkan parameter tersebut? (Maksud saya $ _POST)
Kannika
@MatteoTassinari Saya tahu itu hanya rekomendasi dan saya tahu di mana menonaktifkannya, tetapi apa yang dapat saya lakukan untuk memperbaikinya tanpa peringatan apa pun? Saya pikir pengetahuan saya memiliki batas untuk mendapatkan peringatan, tetapi saya hanya ingin memperbaikinya agar kode saya diperbarui dengan hal baru karena saya tahu hanya $ _POST yang akan mengirimkan formulir posting tersebut. Bagaimanapun, Terima kasih atas komentar Anda: D
Kannika
1
kemungkinan duplikat masalah Keamanan saat mengakses php superglobal secara langsung
Ankur

Jawaban:

92

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

Homerocker
sumber
6
Apakah Anda menjawab pertanyaan "apa arti peringatan itu" atau pada pertanyaan "bagaimana cara menghapusnya"? Karena saya setuju dengan Anda, itulah arti peringatan, tetapi menggunakan fungsi peringatan tetap ada. Saya memilikinya sekarang di a $name = filter_input(INPUT_POST, $_POST["name"]);.
stenci
6
@stenci Anda menggunakan $ _POST lagi sementara Anda harus melakukan sesuatu seperti ini $ name = filter_input (INPUT_POST, "name");
Wojciech Sobczyk
16
Nah, peringatan itu mungkin hilang, tetapi jika Anda tidak menentukan filter maka Anda tidak akan benar-benar memperbaiki masalah keamanan yang ditunjukkan NetBeans. Misalnya, jika Anda mengharapkan int, gunakan:filter_input(INPUT_POST, 'var_name', FILTER_SANITIZE_NUMBER_INT)
HoffZ
44
-1: Jawaban ini sepertinya sepele. tidak ada penjelasan, apa fungsi filter_input, bahkan tidak ada tautan ke php.net/filter_input . Saya takut bahwa orang-orang hanya akan melihatnya, menggunakannya, mengira mereka menulis kode yang lebih baik tetapi masih tidak mengerti apa-apa.
IARI
5
Ow, menyarankan penggunaan fungsi filter tanpa argumen filter mengarah ke FILTER_UNSAFE_RAW, yang setara dengan TRUST_ALL_BAD_INPUT
Kzqai
88

Meskipun agak terlambat, saya menemukan pertanyaan ini saat mencari solusi untuk masalah yang sama, jadi saya harap ini bisa membantu ...

Menemukan diriku dalam kegelapan yang sama denganmu. Baru saja menemukan artikel ini, yang menjelaskan beberapa petunjuk baru yang diperkenalkan di NetBeans 7.4, termasuk yang ini:

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

Alasan mengapa itu ditambahkan adalah karena superglobals biasanya diisi dengan input pengguna, yang seharusnya tidak pernah dipercaya begitu saja. Sebaliknya, beberapa jenis pemfilteran harus dilakukan, dan itulah yang disarankan petunjuknya. Saring nilai superglobal seandainya nilai itu mengandung racun.

Misalnya, di mana saya punya:

$_SERVER['SERVER_NAME']

Saya telah menempatkan sebagai gantinya:

filter_input(INPUT_SERVER, 'SERVER_NAME', FILTER_SANITIZE_STRING)

Anda memiliki dokumen filter_input dan filter di sini:

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

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

Ricardo Palomares Martínez
sumber
Jika Anda melakukan persis seperti yang Anda katakan, Netbeans masih akan menggarisbawahi bagian "$ _POST" atau "$ _GET" dan menampilkan pemberitahuan seolah-olah tidak sedang difilter. Masalah ini mungkin hanya bug Netbeans (setidaknya dalam versi 8.1).
pengguna3640967
6

Saya setuju dengan penjawab lain bahwa dalam banyak kasus (hampir selalu) masukan Anda perlu dibersihkan.

Tetapi pertimbangkan kode seperti itu (ini untuk pengontrol 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();
}

Tidak akan terlalu berguna untuk menerapkan sanitasi di sini (meskipun tidak akan merusak apa pun).

Jadi, ikuti rekomendasi, tetapi tidak secara membabi buta - cukup pahami mengapa itu untuk :)

Rauni Lillemets
sumber
1

Gunakan saja

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

misalnya

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

dari pada

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

Dan gunakan

    var_dump(filter_input_array(INPUT_SERVER));

dari pada

    var_dump($_SERVER);

NB: Berlaku untuk semua variabel Super Global lainnya

Sani Kamal
sumber
0

Berikut adalah bagian dari baris dalam kode saya yang memunculkan peringatan di NetBeans:

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

Setelah banyak penelitian dan melihat bagaimana ada sekitar satu miliar cara untuk memfilter array ini, saya menemukan satu yang sederhana. Dan kode saya berfungsi dan NetBeans senang:

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