Formulir publik yang tidak pernah berbicara dengan jaringan privat tetap menghasilkan data yang harus dinilai oleh jaringan privat. Terowongan hanya mengubah siapa yang menghubungi siapa. Semua yang terjadi setelah unduhan adalah keputusan impor, dan itu milik sisi privat. Panduan ini mengikuti satu kiriman dari peramban hingga catatan internal yang sudah ditetapkan.

Mulai dari tempat kiriman mendarat

Peramban mengirim ke titik akhir publik, yang menulis baris ke penyimpanan penerimaan terkendali dan tidak mengembalikan apa pun selain tanda terima. Penyimpanan itu adalah titik serah terima, dan seharusnya menjadi satu-satunya tempat lapisan publik dapat menulis. Simpan muatan mentah di sana tanpa perubahan, bersama waktu kedatangan dan pengenal catatan yang stabil.

Setelah itu pekerja privat menarik baris yang tertunda melalui terowongan dan memutuskan apa yang harus dilakukan dengan masing-masing. Pekerja berjalan di bawah identitasnya sendiri, yang menjadi topik bagian berikutnya.

curl --silent --fail \
  --cert /etc/importer/client.crt --key /etc/importer/client.key \
  "https://intake.corp.internal/api/pending?limit=20" \
  -o /var/lib/importer/pending.json

Beri pengimpor hanya wewenang yang diperlukannya

Proses web publik dan identitas yang menulis ke aplikasi internal seharusnya menjadi dua prinsipal yang berbeda. Server publik tidak membutuhkan administrasi internal hanya karena harus mengirimkan data formulir, dan satu akun bersama untuk kedua sisi mengubah setiap bug web menjadi penulisan internal. Terbitkan kredensial sendiri untuk pekerja, batasi pada satu operasi impor itu, dan catat prinsipal mana yang melakukan setiap impor. Pemisahan itulah yang membuat batas terowongan bermakna, bukan sekadar hiasan.

Batasi juga dari sumber mana pekerja boleh membaca. Jika implementasi memakai antrean atau layanan transfer, layanan itu mempertahankan autentikasi dan kebijakan aksesnya sendiri, karena VPN tidak mengautentikasi apa pun di dalam muatan.

Fungsi berumur pendek tidak dikecualikan dari tinjauan yang sama. Selama berjalan, posisi jaringannya dan kredensialnya tetap memberikan wewenang, dan masa hidup yang lebih pendek hanya mempersempit jendela. Masa hidup bukan pengganti keputusan tentang operasi apa yang boleh dilakukan identitas.

Validasi sebelum ada yang berubah di sisi internal

Bidang formulir publik adalah teks yang dikendalikan penyerang sampai terbukti sebaliknya, dan panduan validasi masukan OWASP memasukkan umpan backend ke dalam sumber tak tepercaya justru karena alasan itu. Transfer terenkripsi mengatakan byte tiba utuh, bukan bahwa byte itu menggambarkan permintaan yang diizinkan. Urai dan validasi sebelum langkah berhak istimewa apa pun, agar baris buruk tidak pernah mencapai jalur kode yang dapat bertindak.

Tentukan bidang yang diizinkan, formatnya, ukurannya, dan aturan bisnis yang harus dipenuhi. Tanggal dapat berbentuk baik dan tetap salah untuk operasi yang diminta, dan muatan yang menyebut akun internal atau status persetujuan tidak boleh mampu memberikan salah satu dari keduanya kepada dirinya sendiri.

Kirim baris yang ditolak ke hasil tinjauan alih-alih menebak koreksi atau meneruskannya ke shell atau antarmuka basis data mentah. Catat pengenal catatan dan aturan yang gagal, bukan setiap bidang yang diketik pemohon.

Buat titik percobaan ulang pada satu operasi

Jika catatan submission-1042 ditarik dua kali karena tanda terima pertama hilang, pekerja membutuhkan cara yang tahan lama untuk mengenali catatan sumber dan hasilnya yang sudah ditetapkan. Jadwal yang menjalankan tugas sekali tidak membuktikan bahwa setiap baris diterapkan sekali. Pengiriman ganda itu normal, jadi rancangan harus menyerapnya.

Gunakan mekanisme transaksi dan penanganan duplikat milik aplikasi internal itu sendiri, dan simpan pengenal sumber, hasil, serta tanda terima dalam satu urutan yang koheren. Beri tanda terima hanya setelah operasi yang dimaksud ditetapkan atau ditugaskan secara tahan lama, dan jangan pernah menghapus baris penerimaan hanya karena byte sudah diunduh.

Lalu buktikan dengan tiga berkas uji: baris valid, baris cacat, dan pengenal sumber terkendali yang sama dikirim dua kali. Masing-masing melewati titik akhir yang sama dengan yang dipakai pekerja.

for f in fixtures/valid-submission.json fixtures/bad-date.json; do
  curl --silent --fail --cert /etc/importer/client.crt \
    -X POST --data @"$f" https://intake.corp.internal/api/records
done
curl --silent --fail --cert /etc/importer/client.crt \
  -X POST --data @fixtures/valid-submission.json https://intake.corp.internal/api/records

Dua baris pertama harus berakhir pada keadaan internal yang berbeda, dan baris ketiga harus mengembalikan pengenal yang sudah ditetapkan untuk catatan sumber itu alih-alih membuat yang kedua. Apa pun yang lain berarti impor belum dapat diulang.

Artikel terkait