PHP: Mengendalikan tatasusunan (tidak dijangka) dalam input pengguna
P粉547362845
P粉547362845 2024-04-01 17:56:37
0
1
590

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"] 的类型为 stringintfloatboolnull 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?

P粉547362845
P粉547362845

membalas semua(1)
P粉668113768

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.

$key = isset($_REQUEST['key']) && is_string($_REQUEST['key']) ? $_REQUEST['key'] : null;
$item = $list[$key] ?? null;

Jika TypeError satu-satunya kebimbangan anda, anda boleh membungkus semuanya dalam blok cuba/tangkap.

Anda boleh menggunakan fungsi untuk mengelakkan pertindihan kod:

function get(string $name, ?string $default = null): ?string
{
    if (isset($_REQUEST[$name]) && is_string($_REQUEST[$name])) {
        return $_REQUEST[$name];
    }
    return $default;
}

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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan