Tutorial Pasukan Lucee MY

Pengurusan Sesi (Session) dalam Lucee: Konfigurasi dan Keselamatan

Panduan pengurusan sesi Lucee: sessionManagement, sessionTimeout, sessionStorage, onSessionStart, cookie sesi SameSite dan keselamatan penetapan sesi.

Pengurusan Sesi (Session) dalam Lucee: Konfigurasi dan Keselamatan
0
Kandungan

Pengurusan Sesi (Session) dalam Lucee: Konfigurasi dan Keselamatan

Protokol HTTP tidak menyimpan keadaan antara permintaan, jadi aplikasi web memerlukan mekanisme sesi untuk mengingati pengguna yang log masuk, kandungan keranjang belanja dan pilihan mereka. Dalam Lucee, sesi ialah skop khas yang menyimpan data per pengguna merentas permintaan, dan ia dikonfigurasikan melalui Application.cfc. Artikel ini menerangkan cara mendayakan sesi, memilih storan, menetapkan cookie sesi dengan selamat dan mengendalikan keselamatan seperti penetapan sesi.

Bagaimana Sesi Berfungsi dalam Lucee

Setiap pelawat dikenal pasti melalui CFID yang dihantar sama ada dalam cookie atau URL. Lucee menyokong dua jenis sesi: cfml, yang diurus sepenuhnya oleh Lucee, dan jee, yang diurus oleh enjin servlet sebagai JSession. Artikel ini memberi tumpuan kepada jenis cfml kerana ia paling fleksibel dan menyokong storan luaran. Skop session menyimpan data berkaitan pengguna dan kekal antara permintaan, berbeza dengan skop request yang hidup hanya untuk satu permintaan.

Mendayakan Sesi dengan this.sessionManagement

Sesi didayakan dalam Application.cfc. Tetapan utama ialah this.sessionManagement dan this.sessionTimeout:

component {
    this.name = "kedaiLucee";
    this.sessionManagement = true;
    this.sessionTimeout = createTimeSpan(0, 0, 30, 0); // 30 minit
}

sessionTimeout menerima nilai timespan. Selain createTimeSpan, anda boleh menulis pecahan hari seperti 1/24/2 yang juga bermaksud 30 minit. Tetapan lain yang berkaitan ialah this.sessionType untuk memilih cfml atau jee, dan this.sessionStorage untuk memilih storan. Butiran penuh Application.cfc ada dalam panduan memahami Application.cfc.

Skop Session

Skop session menyimpan data yang berkaitan dengan sesi pengguna semasa. Anda menulis dan membaca seperti struktur biasa, dan nilainya kekal antara permintaan sehingga sesi tamat:

// Semasa log masuk
session.userId = 42;
session.keranjang = [];

// Pada permintaan seterusnya
writeOutput(session.userId);

Kerana session ialah skop global yang kekal, ia berbeza daripada skop variables dan request. Perbandingan penuh semua skop ada dalam panduan memahami scope CFML. Satu perkara penting: menyemak kunci sesi dengan structKeyExists sebenarnya mencipta sesi kosong, jadi gunakan fungsi SessionExists untuk mengelakkan penciptaan sesi yang tidak perlu.

onSessionStart dan onSessionEnd

Application.cfc menyediakan dua pengendali acara untuk sesi. onSessionStart dipanggil apabila sesi baharu dicipta, tempat yang sesuai untuk memulakan nilai lalai. onSessionEnd dipanggil apabila sesi tamat, sama ada kerana tamat masa atau invalidation, dan menerima skop sesi serta skop aplikasi sebagai hujah:

public void function onSessionStart() {
    session.created = now();
    session.keranjang = [];
}

public void function onSessionEnd(
    required struct sessionScope,
    required struct applicationScope
) {
    // Bersihkan sumber atau log aktiviti
    var userId = sessionScope.userId ?: "unknown";
}

Gunakan onSessionEnd untuk kerja pembersihan yang tidak bergantung kepada pelayar, seperti membebaskan kunci atau mencatat aktiviti. Ia bukan tempat untuk memaparkan output, kerana tiada respons HTTP dihantar pada peringkat ini.

Penyimpanan Sesi: Memory lawan Storan Luar

this.sessionStorage menentukan di mana data sesi disimpan. Pilihan lalai ialah memory, yang menyimpan sesi dalam ingatan pelayan sepanjang hayatnya dan paling sesuai untuk satu pelayan. Untuk storan bukan memory, sesi disimpan dalam ingatan sehingga seminit ketika tidak aktif, kemudian dibuang dan dimuat semula dari storan mengikut keperluan.

Pilihan storan lain ialah file, yang menyimpan sesi dalam fail tempatan dan sesuai untuk pembangunan tetapi bukan untuk kluster, serta storan pangkalan data atau cache dengan menulis nama datasource atau nama cache. Storan pangkalan data menyimpan sesi dalam jadual cf_session_data yang dicipta secara automatik dan memerlukan tetapan storage pada datasource itu. Storan cache seperti Redis atau Memcached sesuai untuk sistem teragih. Pilihan cookie pernah wujud tetapi dibuang dalam Lucee 7 dan patut dielakkan atas sebab keselamatan.

Aplikasi Berbilang Pelayan dan sessionCluster

Apabila aplikasi berjalan di lebih satu pelayan, storan luaran diperlukan supaya sesi boleh dikongsi. Tetapan this.sessionCluster mengawal cara data disegerakkan antara ingatan tempatan dan storan. Dengan nilai false, ingatan tempatan ialah sumber utama dan storan hanya dikemas kini apabila data berubah, yang meminimumkan operasi I/O dan sesuai untuk satu pelayan. Dengan nilai true, storan luaran menjadi sumber kebenaran dan sesi disemak terhadap storan pada setiap permintaan, yang menjamin konsistensi merentas pelayan dalam kluster.

Gunakan sessionCommit untuk memaksa penulisan serta-merta ke storan semasa permintaan apabila anda perlu. Elakkan menyimpan komponen dalam skop session kerana ia mahal untuk disiri dan dinyahsiri pada setiap permintaan. Simpan nilai ringkas sahaja.

Lucee menghantar cookie CFID untuk mengenal pasti sesi. Kelakuan cookie ini dikawal oleh this.sessionCookie, sebuah struktur yang menyokong beberapa kunci. Kunci httpOnly menghalang JavaScript membaca nilai cookie, kunci secure memastikan cookie hanya dihantar melalui HTTPS, dan kunci sameSite menyekat cookie kepada konteks pihak pertama dengan nilai lax, strict atau none.

component {
    this.sessionManagement = true;
    this.sessionCookie = {
        httpOnly: true,
        secure: true,
        sameSite: "lax",
        timeout: -1 // cookie pelayar, bukan cookie berterusan
    };
}

Kunci domain menetapkan domain cookie, dan timeout menetapkan tempoh luput cookie dalam hari dengan nilai -1 untuk cookie sesi pelayar. Tetapkan secure kepada true hanya apabila seluruh tapak berjalan melalui HTTPS, dan pilih sameSite strict untuk perlindungan maksimum terhadap CSRF, dengan sedar ia boleh menyekat sesi apabila pengguna tiba dari pautan luar. Kaitannya dengan pertahanan CSRF dibincangkan dalam panduan keselamatan aplikasi web CFML.

Keselamatan Sesi: Penetapan Sesi dan Logout

Penetapan sesi berlaku apabila penyerang memaksa mangsa menggunakan ID sesi yang diketahui, membolehkan penyerang merampas sesi selepas mangsa log masuk. Lucee menyediakan SessionRotate untuk mencipta sesi baharu dengan token segar, menyalin data sedia ada dan membatalkan token lama. Panggil ia sebaik sahaja pengesahan berjaya:

if (authBerjaya) {
    sessionRotate();
    session.user = userDetails;
    session.authenticated = true;
}

Untuk log keluar, gunakan SessionInvalidate untuk menamatkan sesi dan membuang semua data. Dokumentasi juga mengesyorkan menyekat CFID dalam URL sepenuhnya dengan menetapkan -Dlucee.read.cfid.from.url=false, dan membenamkan maklumat klien dalam CFID dengan -Dlucee.identify.client=true supaya sesi daripada pelayar A sukar digunakan oleh pelayar B.

Fungsi Pengurusan Sesi

Lucee menyediakan beberapa fungsi untuk mengurus sesi. SessionExists menyemak sama ada sesi wujud tanpa menciptanya, tersedia sejak Lucee 6.2.1. SessionInvalidate menamatkan sesi dan membuang datanya, sesuai untuk log keluar. SessionRotate mencipta sesi baharu dan memindahkan data, sesuai selepas log masuk. SessionCommit memaksa penulisan segera ke storan. Gunakan fungsi ini dan bukannya memanipulasi cookie secara manual.

Amalan Terbaik Ringkas

Elakkan mencipta sesi yang tidak perlu dengan hanya mengakses skop session apabila diperlukan, dan semak dengan SessionExists sebelum membaca. Pilih storan mengikut seni bina pelayan anda, memory untuk satu pelayan dan cache atau pangkalan data untuk kluster. Laksanakan rotasi sesi selepas perubahan keadaan pengesahan. Tetapkan nilai tamat masa yang munasabah untuk aplikasi anda. Simpan nilai ringkas dalam sesi, bukan komponen besar. Sejak Lucee 6.2, sesi kosong hanya disimpan sehingga seminit tanpa mengira storan, untuk menjimatkan sumber.

Pilihan Penyimpanan Sesi

this.sessionStorage menentukan tempat data sesi disimpan. Pilihan yang betul bergantung pada sama ada aplikasi anda berjalan pada satu pelayan atau dalam kluster.

StoranCara kerjaSesuai untukCatatan
memorySimpan dalam ingatan pelayanSatu pelayanLalai, paling mudah
fileSimpan dalam fail tempatanPembangunanBukan untuk kluster
pangkalan dataSimpan dalam jadual cf_session_dataKlusterPerlu tetapan storage pada datasource
cache (Redis/Memcached)Simpan dalam cache luaranSistem teragihSesuai untuk kluster
cookiePernah wujud sebagai pilihanTiadaDibuang dalam Lucee 7, elakkan

Simpan nilai ringkas sahaja dalam sesi, dan elakkan komponen besar yang mahal untuk disiri.

Soalan Lazim (FAQ)

Bagaimana cara mendayakan sesi dalam Lucee?

Tetapkan this.sessionManagement = true dalam Application.cfc, dan tentukan this.sessionTimeout dengan createTimeSpan atau pecahan hari.

Apakah beza sessionStorage memory dan storan luaran?

Memory menyimpan sesi dalam ingatan pelayan dan sesuai untuk satu pelayan. Storan luaran seperti pangkalan data atau cache membolehkan sesi dikongsi merentas pelayan dalam kluster.

Bagaimana cara mencegah penetapan sesi?

Panggil SessionRotate selepas pengesahan berjaya supaya ID sesi baharu dijana dan token lama dibatalkan. Elakkan menerima CFID daripada URL.

Apa fungsi SessionExists dan kenapa ia penting?

SessionExists menyemak sama ada sesi wujud tanpa menciptanya. Menggunakan structKeyExists pada skop session akan mencipta sesi kosong, jadi SessionExists mengelakkan penciptaan sesi yang tidak perlu.

Bagaimana cara menamatkan sesi semasa log keluar?

Panggil SessionInvalidate untuk menamatkan sesi dan membuang semua data, kemudian arahkan pengguna ke halaman log masuk tanpa token.

Sumber

0 komen

Log masuk untuk menjawab atau memberi komen.

Log masuk