cari

Rumah  >  Soal Jawab  >  teks badan

PHP: Mengendalikan tatasusunan (tidak dijangka) dalam input pengguna

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粉547362845P粉547362845237 hari yang lalu543

membalas semua(1)saya akan balas

  • P粉668113768

    P粉6681137682024-04-02 14:31:09

    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.

    balas
    0
  • Batalbalas