Kursus MIT "Keamanan Sistem Komputer". Kuliah 11: Bahasa Pemrograman Web / Web, Bagian 3

Institut Teknologi Massachusetts. Kursus Kuliah # 6.858. "Keamanan sistem komputer." Nikolai Zeldovich, James Mickens. Tahun 2014


Keamanan Sistem Komputer adalah kursus tentang pengembangan dan implementasi sistem komputer yang aman. Ceramah mencakup model ancaman, serangan yang membahayakan keamanan, dan teknik keamanan berdasarkan pada karya ilmiah terbaru. Topik meliputi keamanan sistem operasi (OS), fitur, manajemen aliran informasi, keamanan bahasa, protokol jaringan, keamanan perangkat keras, dan keamanan aplikasi web.

Kuliah 1: “Pendahuluan: model ancaman” Bagian 1 / Bagian 2 / Bagian 3
Kuliah 2: "Kontrol serangan hacker" Bagian 1 / Bagian 2 / Bagian 3
Kuliah 3: “Buffer Overflows: Exploits and Protection” Bagian 1 / Bagian 2 / Bagian 3
Kuliah 4: “Pemisahan Hak Istimewa” Bagian 1 / Bagian 2 / Bagian 3
Kuliah 5: "Dari mana sistem keamanan berasal?" Bagian 1 / Bagian 2
Kuliah 6: “Peluang” Bagian 1 / Bagian 2 / Bagian 3
Kuliah 7: “Kotak Pasir Klien Asli” Bagian 1 / Bagian 2 / Bagian 3
Kuliah 8: “Model Keamanan Jaringan” Bagian 1 / Bagian 2 / Bagian 3
Kuliah 9: "Keamanan Aplikasi Web" Bagian 1 / Bagian 2 / Bagian 3
Kuliah 10: “Eksekusi simbolik” Bagian 1 / Bagian 2 / Bagian 3
Kuliah 11: “Bahasa Pemrograman Web / Web” Bagian 1 / Bagian 2 / Bagian 3

Hal terakhir yang perlu kita lakukan dan yang akan sangat instruktif adalah mengubah kode ini dengan menunjukkan modul ruang di sana, dan kemudian mencoba mengakses tabel ruang, seperti pada contoh sebelumnya. Opsi ini tidak diizinkan karena ini tidak diizinkan.



Ini seperti bisa membaca dan menulis bidang kelas privat di Jawa. Memang, kami mendapatkan pesan yang cukup sederhana, pada dasarnya mengatakan bahwa kami memiliki variabel yang tidak terkait di sini, ekspresi yang tidak diketahui untuk parameter ruang.



Kami bisa menyebutkan modul tambahan ini, yang kami buat hanya untuk bersenang-senang.



Tapi kemudian itu akan menjadi tabel yang berbeda. Kami dapat dengan mudah mengaksesnya. Oleh karena itu, saya akan memecahnya menjadi dua bagian, kita akan mulai dengan hanya memanggil metode ruangan, dan kemudian melakukan hal yang sedikit berbeda untuk membaca elemen-elemennya.



Menampilkan daftar hasil, dan bukan sebaliknya, ini kira-kira setara dengan cara kerja program sebelumnya, kecuali untuk penggunaan berbagai tipe data. Mari kita lihat apa yang terjadi. Sekarang kita kembali ke obrolan di ruang 1 dan memasukkan pesan apa pun ke dalam saluran. Anda melihat bahwa semuanya ditampilkan tanpa kesalahan.



Artinya, sekarang kita memiliki enkapsulasi ini, sehingga Anda dapat menganggap struktur ruangan ini sebagai perpustakaan, tetapi Anda tidak perlu khawatir tentang hal itu.

Ada berbagai tempat yang dapat merusak invariansi internal suatu sistem. Mungkin Anda ingin itu setelah pesan ditambahkan, itu tidak akan pernah hilang. Semua ini ada di majalah. Struktur ini menyediakan properti semacam itu secara independen dari kode lain, seperti kode tempat modul ruang obrolan ditulis.

Siswa: jadi Anda mengubah definisi ruangan, apa yang akan terjadi pada tabel database dalam kasus ini?

Profesor: Anda harus menjalankan perintah alter table secara manual jika Anda ingin menyimpan data lama. Tetapi ketika aplikasi dimulai, ia menanyakan direktori database sistem dan memverifikasi bahwa skema masih seperti yang diharapkan. Maka Anda akan mendapatkan kesalahan statis. Semoga ini memberi Anda petunjuk apa yang harus Anda ubah dalam database.

Siswa: tetapi itu tidak akan secara otomatis menghapus database atau sesuatu seperti itu?

Profesor: Saya harap tidak. Saya tidak berpikir kompiler harus melakukan ini. Anda dapat membayangkan menyesuaikan kompiler untuk memahami evolusi basis data. Saya pikir Anda perlu menulis perintah mengubah tabel untuk memulai, karena kompiler tidak melakukan ini sekarang.



Sekarang mari kita bicara tentang pemalsuan permintaan lintas situs dan pencegahannya. Sebenarnya, sebelum kita melakukan ini, mari kita lihat kode di halaman ini. Kami memiliki formulir HTML tradisional yang dibuat di sini. Dan, tentu saja, tidak ada perlindungan terhadap pemalsuan permintaan lintas situs, dan saya pikir itu bagus. Karena, seperti yang saya pahami, masalah pemalsuan permintaan lintas situs adalah konteks tersirat yang dikirim aplikasi dengan setiap permintaan.

Misalkan ada semacam penyerang yang tidak tahu konteks tersirat Anda. Katakanlah kata sandi Anda disimpan dalam cookie, untuk contoh yang sangat sederhana. Dan ketika penyerang menipu Anda ketika mengklik tautan ke aplikasi yang ia butuhkan, browser secara otomatis mengirim konteks tersirat dan memaksa aplikasi untuk melakukan apa yang tidak dapat dilakukan penyerang secara langsung.



Dalam hal ini, tidak ada konteks tersirat, sehingga tidak ada risiko memalsukan permintaan lintas situs. Adakah yang ingin menantang fitur sistem ini sebelum saya melanjutkan? Ini bisa sangat informatif bagi saya. Jika tidak, tambahkan konteks implisit di sini. Dalam hal ini, sistem secara otomatis akan mengambil tindakan pencegahan yang tepat, berdasarkan analisis program, yang memahami bahwa sekarang ada konteks yang tersirat.

Sekarang saya akan memasukkan cookie di sini. Sebagai contoh lain dari enkapsulasi modul, pada kenyataannya, saya akan menempatkan di sini seluruh sistem autentikasi pengguna di mana kami memiliki akun pengguna dan tipe abstrak dari pengidentifikasi dan kata sandi. Dengan demikian, Anda tidak bisa begitu saja membuat nilai dari salah satu tipe data ini secara langsung. Anda harus melalui beberapa metode yang disetujui untuk membangun nilai-nilai jenis ini.

Saya akan menempatkan meja tepat di tanda tangan. Dan saya juga akan memberlakukan batasan pada itu, mengatakan bahwa kunci untuk itu adalah bentuk ID.



Tetapi kenyataannya adalah bahwa dalam tabel pengguna ini, ID dan kata sandi adalah tipe data abstrak. Oleh karena itu, kode tidak dapat melihat kata sandi dan tidak dapat secara konsisten menghasilkan semua pengidentifikasi dan mencobanya di tabel ini. Karena ia menggunakan tipe abstrak, karena itu tidak mungkin untuk menentukan seperti apa ID itu dan tidak mungkin untuk menemukan kata sandi. Mereka baru saja datang dari tabel ini, dan ini adalah token yang buram.

Tapi kita bisa membiarkannya menjadi input limbah. Anda mungkin ingin mengizinkan satu arah konversi antara string dan tipe ini. Sekarang saya akan melakukan sesuatu di sini, terutama detailnya, dan saya tidak akan mencoba menjelaskannya. Tapi ini seperti menyatakan bahwa Anda diizinkan untuk mengubah string ke ID. Bagi mereka yang akrab dengan Haskell, ini adalah kelas tipe instan, izin ini untuk mengubah string menjadi ID.



Kami tidak akan menerapkan izin lain, karena kami tidak ingin dapat mengubah ID kembali menjadi sesuatu yang lain. Mari kita lakukan hal yang sama untuk kata sandi. Kami ingin dapat membaca kata sandi pengguna, tetapi kami tidak akan menerima kata sandi dan mengubahnya menjadi string yang akan memberi tahu kami bahwa pengguna telah memasuki obrolan.

Dengan demikian, bagian lain dari kode akan dapat menerima kata sandi dari pengguna, mengubahnya menjadi jenis ini, dan mengangkutnya ke modul pengguna untuk verifikasi. Tapi apa yang tidak bisa mereka lakukan adalah query tabel pengguna dan mendapatkan semua kata sandi dalam bentuk dari mana mereka dapat mengekstraksi ekspresi teks mereka.

Kemudian kita dapat memiliki metode login yang menerima dua komponen ini, ID dan kata sandi, dan hanya berfungsi sebagai efek samping, yang sebenarnya dinyatakan dalam kode. Kami juga akan membutuhkan cara untuk mengetahui pengguna mana yang terdaftar. Ini adalah kode yang mengeksekusi transaksi yang membuat ID.



Langkah pertama adalah menyalin definisi ini. Dan kemudian muncul kejutan. Ternyata ID pengguna dan kata sandi adalah string, tetapi keadaan ini tidak akan diungkapkan di luar modul.



Sekarang kita akan membuat cookie. Cookie adalah hal lain yang ada dalam bahasa tersebut. Bahkan, mereka bertindak sebagai variabel global yang bisa berubah yang memiliki satu salinan untuk setiap klien yang menggunakan aplikasi Anda.

Dengan demikian, kita akan membuat cookie yang untuk setiap pengguna hanya akan menyimpan salinan dari dua bidang yang sama yang kita miliki di sini.



Cookie ini bersifat pribadi untuk modul ini. Bagian lain dari kode tidak akan dapat membaca cookie karena mereka tidak memiliki bidang pribadi ini. Jadi tidak ada yang bisa langsung melihat ID dan kata sandi yang disimpan untuk pengguna ini. Tetapi mereka akan disimpan ketika melihat berbagai halaman, seperti halnya cookie biasa.

Sekarang saya akan memasukkan fungsi login, yang akan memulai proses untuk memeriksa database dan mencari tahu apakah ini benar-benar pasangan nama pengguna dan kata sandi yang benar. Proses ini hanya akan memeriksa apakah kita dapat menemukan baris dalam database yang berisi ID pengguna dan kata sandi ini.

Jika kita menemukannya, maka bagus, maka ini adalah arti yang benar. Mari kita simpan ini di cookie. Kami menggunakan metode yang mengubah nilai cookie. Dan kita harus meletakkan beberapa hal di sini, untuk kesederhanaan saya akan mengatakan bahwa cookie ini tidak kedaluwarsa. Saya tidak ingin menjalankan SSL di sini, jadi saya akan mengatakan bahwa dalam hal ini kami tidak memerlukan keamanan, dan mengatur parameter Secure = false.

Tetapi jika Anda benar-benar peduli dengan keamanan, jelas Anda akan menulis Secure = true. Jika pemeriksaan gagal dan modul memberi sinyal kesalahan, program akan berhenti, memberikan deskripsi kesalahan ini.



Akhirnya, kita dapat membuat fungsi ini yang memberitahu pengguna mana yang masuk dengan menerima nilai cookie saat ini. Parameter ini juga dapat diatur ke tidak ada jika pengguna belum masuk, dalam hal ini kita akan mendapatkan pesan kesalahan lain. Atau bisa juga semacam catatan jenis persis yang kita gunakan di atas. Jadi saya hanya menyalinnya di sini dan menjalankan pemeriksaan yang sama. Jika ini berhasil, maka kami cukup mengembalikan bagian dari catatan ID yang baru saja kami periksa di database.



Jadi izinkan saya memeriksa ini. Kami memulai kompiler, dan Anda melihat hasilnya di layar.



Pusat dari semua detail implementasi ini. Tetapi di luar modul ini, kami memikirkannya dari sudut pandang antarmuka. Ada beberapa jenis ID dan kata sandi yang tidak dikenal. Tabel pengguna ini menyatakan istilah yang memungkinkan Anda untuk mengubah string menjadi pengidentifikasi dan kata sandi, tetapi tidak sebaliknya. Kami memiliki dua metode ini untuk memasukkan login terlebih dahulu dan ada pemeriksaan pengguna mana yang masuk pada tahap ini. Ada pertanyaan tentang ini?

Siswa: Apakah Anda perlu memperluas tabel pengguna?

Profesor: Saya melakukan ini karena saya ingin menggunakannya nanti sebagai kunci asing, jadi ini bukan alasan penting. Jadi, kita hampir sampai pada titik di mana saya bisa menunjukkan perlindungan CSRF kepada Anda.

Untuk mulai dengan, masuk ke sistem cukup mudah dilakukan. Nah, apa lagi yang bisa kita lakukan pada titik ini dalam program ini? Mari kita tambahkan di sini bagian lain dari halaman yang mengatakan bahwa ini adalah tempat Anda memasukkan login. Di sini Anda harus memasukkan nama pengguna dan kata sandi lalu klik tombol kirim tindakan. Tindakan ini akan memberikan panggilan ke fungsi login.



Mari mendefinisikan login sebagai fungsi yang melakukan hal-hal ini. Sebenarnya, ini hanya pembungkus panggilan fungsi login dari modul ini, di mana kami mengambil masing-masing komponen dan mengubahnya dari string ke tipe abstrak.



Dia memeriksa kesalahan membaca. Kesalahan berarti bahwa jika login tidak berfungsi, operasi akan terganggu pada saat ini dan fungsinya akan kembali ke bagian utama dari program.
Sekarang kita bisa login. Kami mungkin ingin membuat akun yang memungkinkan kami masuk, jadi izinkan saya membuat pengguna dengan nama pengguna a dan kata sandi a.





Sekarang saya bisa masuk sebagai pengguna, ambil kata saya untuk itu. Kami memiliki seperangkat cookie untuk merekam informasi ini, jadi mari kita pergi ke ruang obrolan dan mengirim pesan, misalnya, asfasf. Anda melihat bahwa setelah mengklik tombol Tambah itu muncul di obrolan.



Faktanya, kami belum menambahkan kontrol akses di sini, jadi tidak ada yang istimewa terjadi di sini. Tapi kita bisa periksa.



Ada cookie di sini, tetapi sistem telah menentukan bahwa kami tidak menggunakan cookie. Saat kami mengirimkan formulir ini, cookie tidak dapat dibaca. Dengan demikian, sejauh ini tidak perlu menambahkan perlindungan CSRF di sini. Jadi, sekarang kita perlu menambahkan cara untuk menggunakan cookie dan melihat bagaimana perlindungan akan terwujud.

Mahasiswa: apa itu konten cookie?

Profesor: ini adalah konten yang Anda harapkan akan diterima dari kode. Dengan kata lain, cookie dinyatakan memiliki tipe catatan ini - pengidentifikasi dan kata sandi.



Jadi ini adalah persis apa yang terkandung di sana dalam bentuk serial tertentu. Sekarang mari kita gunakan cookies. Kita harus melihat ini, terlepas dari kenyataan bahwa kita akan menggunakan cookie secara tidak langsung, karena kita akan menggunakannya dalam modul ruang, yang tidak ada hubungannya dengan cookie. Tetapi kami akan memanggil metode modul khusus yang secara tidak langsung terkait dengan penggunaan cookie. Dan kemudian sistem akan mengerti bahwa ini berarti kita bergantung padanya.

Jadi, mari kita lakukan dengan sangat sederhana dan panggil metode whoami. Bahkan, saya hanya akan mengabaikannya, atau sebaliknya, biarkan dia melakukan sesuatu. Mari kita putuskan bahwa pengguna yang kita buat benar-benar istimewa, dan hanya pengguna ini yang dapat memposting apa pun. Jika ini bukan masalahnya, maka kami akan mendapatkan pesan kesalahan.



Saya akan menambahkan ID ke modul pengguna, dan kemudian ini akan berfungsi, karena tipe ID mendukung pemeriksaan kesetaraan.



Sekarang semuanya harus beres, dan kita dapat melakukan lebih banyak hal dengan ID ini, yang dapat menyebabkan beberapa masalah keamanan.



Ini memungkinkan kita untuk menambahkan pemeriksaan kontrol akses, jadi mari kita lihat cara kerjanya dan kembali ke halaman utama.



Sekarang keempat huruf "a" ini muncul di obrolan.

Di konsol antarmuka, kita melihat bahwa sekarang formulir telah secara otomatis menerima sig nama input tersembunyi, yang merupakan tanda tangan kriptografis dari nilai semua cookie. Sig ini menandatangani cookie menggunakan kunci yang dirahasiakan ke server. Dan ketika formulir sudah siap, aplikasi tahu - karena kompiler memberi tahu tentang hal ini - bahwa aplikasi harus memeriksa tanda tangan untuk set operasi berikutnya. Untuk ini, kami memiliki operasi katakanlah.



Siswa: apakah tanda tangan memiliki semacam stempel waktu?

Profesor: tidak, tanda tangan tidak memiliki stempel waktu.

Siswa: dalam hal ini, jika penyerang berhasil "memata-matai" data ini, ia bisa berpura-pura menjadi pengguna, karena cookie ini tidak akan pernah kedaluwarsa.

Profesor: ya, itu tidak pernah berakhir. Ini adalah sesuatu yang dapat diubah hanya dengan mengubah implementasi bahasa tanpa mengubah aplikasi, dan kemudian dengan cepat menggunakannya. Tetapi sekarang ini tidak ada di sini. Dan saya mengerti mengapa ini berguna untuk ditambahkan.

Siswa: Anda juga dapat memperbaikinya dengan hanya membubuhkan cap waktu pada tanda tangan.

Profesor: ya, Anda benar, Anda dapat mengubah aplikasi sedemikian rupa sehingga secara sengaja mengubah data cookie cukup sering, yaitu, membuat tanda tangan kedaluwarsa.
Mahasiswa: dapatkah Anda menetapkan kembali URL?

Profesor: ya, pengalihan tugas apa yang ingin Anda lihat?

Mahasiswa: apa saja, saya hanya ingin melihat bagaimana ini dilakukan.

Profesor: Jadi, kompiler menetapkan ... seperti yang kita lihat, kita memanggil fungsi say, dan pemanggilan fungsi ini diserialisasi sebagai bentuk URL tertentu. Misalkan kita tidak suka formulir ini.



Kami memutuskan untuk menulis ulang URL, jadi, di dalam modul kamar, di dalam demo. Lebih baik tempelkan. Jadi kami ingin menugaskan kembali Demo / Kamar / katakan ke Demo / Kamar / Bicara.



Kami memulai kompiler dan pergi ke layar utama aplikasi. Mari kita lihat apa yang terjadi. Semuanya beres, kami juga bisa memasukkan pesan teks dan muncul di baris obrolan. Dalam aturan ini, Anda dapat menggunakan karakter yang tidak dapat diprediksi untuk mengganti satu awalan dengan yang lain, dan kompiler akan memastikan bahwa setiap fungsi memiliki skema URL yang terpisah, tetapi URL secara otomatis dihasilkan secara default.

Siswa: Anda menyebutkan bahwa HTML tidak spesifik untuk kompiler, itu hanya perpustakaan. Apakah ada perpustakaan lain untuk format lain?

Profesor: ada perpustakaan lain yang tidak memeriksa jenis dengan kelengkapan fungsional yang sama, tetapi, misalnya, ada perpustakaan untuk serialisasi dan deserializing JSON, dan sejumlah besar cara otomatis untuk mengelola struktur tipe. Dengan cara ini Anda bisa melakukan hal-hal yang tidak terintegrasi ke dalam kompiler.

Siswa: misalkan kita masih ingin menulis dalam JavaScript, misalnya, untuk menghidupkan beberapa hal di halaman ...

Profesor: izinkan saya mengunduh versi Ajax ini, yang akan menjawab pertanyaan Anda. Versi ini memiliki kode sisi klien. Mari kita beralih ke versi program yang disebut demo3. Saya memasukkan data pada halaman utama di baris obrolan, dan mereka juga muncul di bagian bawah obrolan. Percaya atau tidak, kali ini add-in berfungsi menggunakan panggilan Ajax. Ini karena nilai tombol tag tombol. Ini memiliki atribut onclick, yang, ketika pengguna mengklik tombol, semua kode di bawah garis dengan atribut ini berfungsi di sisi klien.

]

Tapi ini kode Ur / Web, ini bukan kode JavaScript. Kompiler menerjemahkan ini ke dalam JavaScript untuk Anda dan memastikan bahwa ia menyimpan properti yang kami inginkan untuk abstraksi dalam daftar kami jika pengguna tidak ingin mengotak-atik secara manual di browser.

Siswa: Saya pikir hari ini ada banyak perpustakaan yang melakukan hal-hal yang bermanfaat, dan dalam banyak kasus hal-hal yang rumit, jika Anda ingin mengkode ulang semuanya sendiri. Apakah ada cara mereka berinteraksi dengan JavaScript dari Ur / Web?

Profesor: ya, ada antarmuka fungsi eksternal yang memungkinkan Anda memberikan nama fungsi Ur / Web ke nama dan panggilan fungsi JavaScript. Tetapi ketika Anda menggunakan antarmuka fungsi eksternal, Anda tidak bisa lagi menggunakan semua fungsi konstruksi yang bermanfaat ini. Dalam hal ini Anda harus sangat berhati-hati.

Anda harus memahami implementasi beberapa abstraksi ini agar tidak mengganggu mereka. Selama saya memiliki kode ini, izinkan saya menunjukkan kepada Anda sesuatu yang lain.

Kami masih memiliki fungsi katakan yang sama seperti sebelumnya. Tapi sekarang, alih-alih memanggilnya dengan referensi, kami hanya mengambil panggilan fungsi, yang diisi dengan argumen yang berasal dari konteks penangan onclick.



Kami cukup membungkus fungsi ini di dalam sintaks rpc. Ini berarti bahwa ini adalah fungsi panggilan sisi klien, tetapi panggilan itu sendiri diluncurkan pada server dengan akses ke database dan sumber daya server lainnya, dan kemudian mentransfer hasilnya kembali ke sini.

, , JavaScript .
, . , , , .



, , , . , , .

, - , . GUI , , , , .

, , , . , DOM. , , .



, GUI, , , , .

, , .

: ?

: , , . , - .

: . , ?



: — . , . , , . , .

: — Ur?

: Ur — , , . , . .


.

Terima kasih telah tinggal bersama kami. Apakah Anda suka artikel kami? Ingin melihat materi yang lebih menarik? Dukung kami dengan melakukan pemesanan atau merekomendasikannya kepada teman-teman Anda, diskon 30% untuk pengguna Habr pada analog unik dari server entry-level yang kami buat untuk Anda: Seluruh kebenaran tentang VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps dari $ 20 atau bagaimana membagi server? (opsi tersedia dengan RAID1 dan RAID10, hingga 24 core dan hingga 40GB DDR4).

VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps hingga Desember secara gratis ketika membayar untuk jangka waktu enam bulan, Anda dapat memesan di sini .

Dell R730xd 2 kali lebih murah? Hanya kami yang memiliki 2 x Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100 TV dari $ 249 di Belanda dan Amerika Serikat! Baca tentang Cara Membangun Infrastruktur Bldg. kelas menggunakan server Dell R730xd E5-2650 v4 seharga 9.000 euro untuk satu sen?

Source: https://habr.com/ru/post/id426001/


All Articles