Saya baru-baru ini mendapati bahawa menghantar pembolehubah yang mengandungi tatasusunan "tidak dijangka" (bukan rentetan) boleh membawa kepada ralat maut atau tingkah laku lain yang tidak diingini. Contoh:
Kami mempunyai susunan berikut:
$list = array( "a" => "first", "b" => "second" );
Pengguna menghantar $_REQUEST["key"]
yang akan digunakan untuk mencari elemen dalam senarai ini:
echo ($list[$_REQUEST["key"]] ?? null);
Jika $_REQUEST["key"]
的类型为 string
、int
、float
、bool
或 null
jenis string
, int
, float
, bool
atau null
, skrip akan memaparkan entri yang ditemui atau tidak memaparkan apa-apa (= null). Ini adalah tingkah laku yang diingini.
Jika $_REQUEST["key"]
是 array
ialah array
, skrip akan berhenti dengan ralat maut.
Kini, penyelesaian yang jelas ialah menambah beribu-ribu jenis semakan (is_scalar()
或 !is_array()
) di seluruh kod. Tetapi saya tertanya-tanya sama ada alternatif berikut kelihatan munasabah dari perspektif keselamatan:
Pada permulaan setiap permintaan, skrip berikut akan dijalankan:
$_COOKIE = array_map(function($e) { return (is_array($e) ? json_encode($e, JSON_INVALID_UTF8_IGNORE) : $e); }, $_COOKIE); $_REQUEST = array_map(function($e) { return (is_array($e) ? json_encode($e, JSON_INVALID_UTF8_IGNORE) : $e); }, $_REQUEST); $_POST = array_map(function($e) { return (is_array($e) ? json_encode($e, JSON_INVALID_UTF8_IGNORE) : $e); }, $_POST); $_GET = array_map(function($e) { return (is_array($e) ? json_encode($e, JSON_INVALID_UTF8_IGNORE) : $e); }, $_GET);
Ini melumpuhkan penghantaran tatasusunan ke pelayan dengan berkesan. Jika mana-mana kedudukan dalam tatasusunan kod sebenarnya diperlukan, ia akan dinyahkod secara manual menggunakan json_decode()
.
Adakah ini idea yang bagus?
Anda menyahkod setiap pembolehubah input secara manual untuk mengelakkan pengesahan setiap pembolehubah input secara manual. Bagi saya, ia adalah gangguan yang sama, tetapi lebih mengelirukan, kurang berprestasi dan mempunyai pepijat baharu (cth.
json_encode()
akan rosak jika input tidak sah UTF-8).Secara amnya, adalah berbaloi untuk menyatakan secara eksplisit tentang input aplikasi anda. Memastikan anda menggunakan satu set pembolehubah yang diketahui dalam keadaan yang diketahui benar-benar boleh menjimatkan masa dan masalah.
Jika
TypeError
satu-satunya kebimbangan anda, anda boleh membungkus semuanya dalam blok cuba/tangkap.Anda boleh menggunakan fungsi untuk mengelakkan pertindihan kod:
Anda boleh membina rangka kerja pengesahan atau menggunakan rangka kerja pihak ketiga.
Terdapat banyak perkara yang saya lakukan sebelum mengacaukan semua input, hanya untuk mengelakkan kes sudut tertentu.