Alasannya begini:
Nilai lingkungan yang Anda dapatkan dari getenv()[PHP]
(fungsi php) berbeda dari lingkungan yang Anda kueri dengan getenv()[C]
(fungsi C lib). Apa getenv()[PHP]
tidak, sedang memeriksa dengan sapi terdaftar untuk kecocokan (http ://lxr.php.net/xref/PHP_5_6/ext/standard/basic_functions.c#3999
).
Apache2 sapi melakukan ini melalui konteks lingkungannya sendiri (http://lxr.php.net/xref/PHP_5_6/sapi/apache2handler/sapi_apache2.c#253 ), bukan lingkungan OS standar dari proses Apache itu sendiri.
HANYA ketika tidak ada kecocokan yang ditemukan, itu akan memeriksa lingkungan proses yang sebenarnya. Jadi inilah mengapa getenv()[PHP]
mengembalikan nilai, tetapi getenv()[C]
tidak.
Sekarang, "peretasan" juga sederhana:putenv()[PHP]
, menyimpan kunci/nilai yang diberikan di lingkungan proses yang sedang berjalan, oleh karena itu dapat ditemukan nanti oleh getenv()[c]
.