Apa saja yang sebenarnya tersentuh saat penghitung dihapus
Menghapus penghitung di sini mengosongkan 33 tabel. Kemarin yang dikosongkan 25.
Delapan tabel yang terlewat semuanya dibuat sehari sebelumnya, antara pukul 11:10 pagi dan 15:10 sore.
Cara kerja penghapusan
Pemilik dapat menghapus penghitungnya. Untuk itu diperlukan POST, token pemilik, dan nomor penghitung yang diketik secara manual, karena penghapusan tidak bisa dibatalkan. Tidak ada yang disisihkan: salinan bayangan justru berlawanan dengan apa yang diminta, dan tautan ekspor tersedia di atas tombol bagi siapa pun yang menginginkannya.
Lalu sederet tabel dikosongkan dalam satu transaksi, tabel utama paling akhir, dan sebuah tanda nisan dimasukkan ke arsip agar nomor itu tidak pernah diberikan kepada orang lain. Jika ada bagian yang gagal, semuanya dibatalkan. Tidak terhapus sama sekali lebih baik daripada terhapus separuh.
Di atas daftar itu, di dalam berkas, ada komentar ini:
“Setiap tabel yang mengetahui sesuatu tentang penghitung ini. Sebagai daftar dan tidak tersebar di seluruh kode: apa pun yang tidak ada di sini tertinggal sebagai baris yatim, dan tidak ada yang menyadarinya.”
Komentar itu menggambarkan celahnya sehari sebelum celah itu terbuka
Kemarin, enam tabel baru muncul untuk sebuah fitur baru — waktu di halaman, kedalaman gulir, halaman keluar — ditambah dua tabel lainnya. Antara pukul 11:10 dan 15:10.
Daftar penghapusan diedit pada hari yang sama, untuk menambahkan tabel baru yang lain. Kedelapan tabel itu datang sesudahnya, dan daftar itu tidak diubah lagi. Jadi selama satu sore, menghapus penghitung meninggalkan 4.840 baris data perilaku, tersebar di delapan tabel. Celah itu ditemukan keesokan harinya dan ditutup; yang terungkap adalah bahwa daftar itu membutuhkan sesuatu selain ingatan agar tetap lengkap.
Ini bukan cerita tentang kecerobohan. Seseorang menulis daftar itu, memahami betul mengapa bentuknya daftar, mencatat apa yang terjadi jika daftar itu tertinggal, dan memperbaruinya pada hari itu juga untuk satu tabel. Dan daftar itu tetap tertinggal, karena menjaga dua hal tetap selaras dengan mengandalkan ingatan adalah hal yang dilakukan manusia dengan andal, sampai tiba sore hari ketika mereka tidak melakukannya.
Perbaikannya, dan perbaikan yang lain
Kedelapan nama itu kini ada di daftar. Nama-nama itu disisipkan di posisi alfabetisnya, bukan ditempel di akhir, karena daftar yang terurut membuat celah terlihat, sedangkan daftar yang hanya ditambah di akhir tidak.
Itu perbaikan kecilnya. Yang penting adalah sebuah skrip yang menanyakan kepada basis data tabel mana saja yang memuat nomor penghitung, membaca daftar itu langsung dari berkas sumber alih-alih mengulanginya, lalu membandingkan. Siapa pun yang menambahkan tabel menjalankannya sekali. Skrip itu tidak bisa terlupakan seperti halnya daftar, karena ia tidak menyimpan apa pun — ia menurunkan jawabannya dari skema setiap kali.
Pada jalannya yang pertama, skrip itu menemukan hal lain: 25 baris di delapan tabel lain yang nomor penghitungnya tidak ada di tabel aktif maupun di arsip. Bukan penghitung yang dihapus — penghitung seperti itu meninggalkan tanda nisan. Nomor-nomor yang sama sekali bukan milik apa pun, sebagian besar jelas nomor uji dari masa sebelum pemeriksaan arsip ada. Baris-baris itu ditulis ke sebuah berkas di luar web root lalu dihapus.
Apa yang dapat ditarik secara umum
Setiap daftar yang harus diselaraskan dengan hal lain pada akhirnya akan tidak selaras, dan celahnya tidak akan terlihat, karena daftar yang kehilangan satu entri tampak persis seperti daftar yang lengkap.
Pertahanannya bukan disiplin. Pertahanannya adalah menurunkan satu sisi dari sisi lainnya dan memeriksa bahwa keduanya sesuai — serta menjalankan pemeriksaan itu pada saat seseorang menambahkan sesuatu, bukan pada saat seseorang mulai bertanya-tanya.
Komentar di atas daftar itu benar dalam segala hal kecuali satu kata. Komentar itu bilang tidak ada yang menyadari. Ternyata ada yang menyadarinya, sehari kemudian, karena ia mencari dengan skrip, bukan dengan ingatannya.