Akhir Lengkapnya Sederhana 4. Fakta Menarik Tentang Seks Tidak Ada Yang Memberitahu Anda Sebelumnya

Halo. Nama saya Sasha Barannik. Di Mail.Ru Group saya mengepalai departemen pengembangan web, yang terdiri dari 15 karyawan. Kami telah mempelajari cara membuat situs web untuk puluhan juta pengguna dan dapat dengan mudah menangani beberapa juta pemirsa setiap hari. Saya sendiri telah melakukan pengembangan web selama kurang lebih 20 tahun, dan selama 15 tahun terakhir saya telah memprogram terutama dalam PHP untuk pekerjaan saya. Meskipun kemampuan bahasa dan pendekatan pengembangan telah banyak berubah selama ini, memahami kerentanan utama dan kemampuan untuk melindunginya tetap menjadi keterampilan utama bagi pengembang mana pun.

Anda dapat menemukan banyak artikel dan panduan keselamatan di Internet. Menurut saya buku ini cukup detail, namun ringkas dan mudah dipahami. Saya harap ini akan membantu Anda mempelajari sesuatu yang baru dan membuat situs Anda lebih andal dan aman.

P.S. Bukunya panjang, jadi terjemahannya akan diterbitkan dalam beberapa artikel. Jadi mari kita mulai...

Buku lain tentang keamanan PHP? Ada banyak cara untuk memulai buku tentang keamanan PHP. Sayangnya, saya belum membaca satupun, jadi saya harus memikirkannya sambil menulis. Mungkin saya akan mulai dengan yang paling mendasar dan berharap semuanya akan berhasil.

Jika kita mempertimbangkan aplikasi web abstrak yang diluncurkan secara online oleh Perusahaan X, kita dapat berasumsi bahwa aplikasi tersebut berisi sejumlah komponen yang, jika diretas, dapat menyebabkan kerugian yang signifikan. Misalnya yang mana?

  • Bahaya bagi pengguna: mendapatkan akses ke email, kata sandi, data pribadi, detail kartu bank, rahasia bisnis, daftar kontak, riwayat transaksi, dan rahasia yang dijaga ketat (seperti seseorang yang menamai anjingnya Sparkle). Kebocoran data ini merugikan pengguna (perorangan dan perusahaan). Aplikasi web yang menyalahgunakan data dan host yang memanfaatkan kepercayaan pengguna juga dapat menyebabkan kerugian.
  • Kerugian bagi perusahaan X itu sendiri: karena kerusakan yang ditimbulkan pada pengguna, reputasi memburuk, kompensasi harus dibayar, informasi bisnis penting hilang, biaya tambahan muncul - untuk infrastruktur, peningkatan keamanan, likuidasi konsekuensi, biaya hukum, manfaat besar bagi memberhentikan manajer puncak, dll.
  • Saya akan fokus pada dua kategori ini karena keduanya mencakup sebagian besar masalah yang harus dicegah oleh keamanan aplikasi web. Semua perusahaan yang mengalami pelanggaran keamanan serius dengan cepat menulis dalam siaran pers dan di situs web mereka betapa sensitifnya mereka terhadap hal tersebut. Jadi saya menyarankan Anda untuk merasakan pentingnya masalah ini dengan sepenuh hati sebelum Anda menghadapinya dalam praktik.

    Sayangnya, masalah keamanan sering kali terselesaikan setelah kejadian tersebut terjadi. Hal terpenting diyakini adalah membuat aplikasi berfungsi yang memenuhi kebutuhan pengguna, dalam anggaran dan jangka waktu yang dapat diterima. Ini adalah serangkaian prioritas yang dapat dimengerti, namun keamanan tidak dapat diabaikan selamanya. Jauh lebih baik untuk mengingat hal ini terus-menerus, menerapkan solusi spesifik selama pengembangan, ketika biaya perubahan masih kecil.

    Sifat sekunder dari keamanan sebagian besar merupakan hasil dari budaya pemrograman. Beberapa pemrogram mengeluarkan keringat dingin saat memikirkan kerentanan, sementara yang lain mungkin membantah keberadaan kerentanan hingga mereka dapat membuktikan bahwa kerentanan tersebut sama sekali bukan kerentanan. Di antara kedua ekstrem ini, ada banyak programmer yang hanya akan mengangkat bahu karena belum terjadi masalah pada mereka. Sulit bagi mereka untuk memahami dunia yang aneh ini.

    Karena keamanan aplikasi web harus melindungi pengguna yang mempercayai layanan aplikasi, maka perlu diketahui jawaban atas pertanyaan-pertanyaan berikut:

  • Siapa yang ingin menyerang kita?
  • Bagaimana mereka bisa menyerang kita?
  • Bagaimana kita bisa menghentikan mereka?
  • Siapa yang ingin menyerang kita? Jawaban atas pertanyaan pertama sangat sederhana: segalanya. Ya, seluruh alam semesta ingin memberi Anda pelajaran. Seorang pria dengan komputer overclock yang menjalankan Kali Linux? Dia mungkin sudah menyerangmu. Pria mencurigakan yang suka berbicara di depan umum? Dia mungkin sudah menyewa seseorang untuk menyerang Anda. REST API tepercaya yang memberi Anda data setiap jam? Itu mungkin diretas sebulan yang lalu untuk memberi Anda data yang terinfeksi. Bahkan aku bisa menyerangmu! Jadi Anda tidak perlu begitu saja mempercayai buku ini. Anggap saja aku berbohong. Dan temukan seorang programmer yang akan membawa saya ke air bersih dan membeberkan nasihat berbahaya saya. Di sisi lain, mungkin dia juga akan meretas Anda...

    Inti dari paranoia ini adalah untuk mempermudah mengkategorikan secara mental segala sesuatu yang berinteraksi dengan aplikasi web Anda (“Pengguna”, “Peretas”, “Database”, “Input Tidak Tepercaya”, “Manajer”, “REST API”). , dan lalu tetapkan setiap kategori indeks kepercayaan. Jelas sekali, “Peretas” tidak bisa dipercaya, tapi bagaimana dengan “Database”? “Input tidak tepercaya” mendapatkan namanya karena suatu alasan, tetapi apakah Anda benar-benar memfilter postingan blog dari feed Atom tepercaya rekan Anda?

    Mereka yang serius melakukan peretasan aplikasi web belajar memanfaatkan pemikiran ini, sering kali menyerang sumber data tepercaya dibandingkan sumber data yang rentan, yang cenderung tidak memiliki keamanan yang baik. Ini bukan keputusan acak: dalam kehidupan nyata, subjek dengan indeks kepercayaan lebih tinggi tidak terlalu curiga. Sumber data inilah yang pertama kali saya perhatikan ketika menganalisis suatu aplikasi.

    Mari kembali ke “Database”. Dengan asumsi bahwa seorang hacker bisa mendapatkan akses ke database (dan kami paranoid selalu berasumsi demikian), maka database tersebut tidak akan pernah bisa dipercaya. Sebagian besar aplikasi mempercayai database tanpa pertanyaan apa pun. Dari luar, aplikasi web tampak seperti satu kesatuan, tetapi di dalamnya terdapat sistem komponen individual yang bertukar data. Jika kita menganggap semua komponen ini dapat dipercaya, maka jika salah satu dari mereka diretas, semua komponen lainnya akan segera disusupi. Masalah keamanan yang sangat besar seperti itu tidak dapat diselesaikan dengan kalimat “Jika database diretas, maka kita tetap kalah.” Anda dapat mengatakan demikian, tetapi itu sama sekali bukan fakta bahwa Anda harus melakukan ini jika Anda tidak mempercayai pangkalan tersebut pada awalnya dan bertindak sesuai dengan itu!

    Bagaimana mereka bisa menyerang kita? Jawaban atas pertanyaan kedua adalah daftar yang cukup luas. Anda dapat diserang dari mana pun setiap komponen atau lapisan aplikasi web menerima data. Pada dasarnya, aplikasi web hanya memproses data dan memindahkannya dari satu tempat ke tempat lain. Permintaan pengguna, database, API, feed blog, formulir, cookie, repositori, variabel lingkungan PHP, file konfigurasi, file konfigurasi, bahkan file PHP yang Anda jalankan - semuanya berpotensi terkontaminasi data hingga melanggar keamanan dan menyebabkan kerusakan. . Pada dasarnya, jika data berbahaya tidak secara eksplisit ada dalam kode PHP yang digunakan untuk membuat permintaan, maka kemungkinan besar data tersebut akan diterima sebagai “payload”. Hal ini mengasumsikan bahwa a) Anda menulis kode sumber PHP, b) kode tersebut telah ditinjau oleh rekan sejawat dengan benar, dan c) Anda belum dibayar oleh organisasi kriminal.

    Jika Anda menggunakan sumber data tanpa memeriksa apakah data tersebut benar-benar aman dan cocok untuk digunakan, maka Anda berpotensi terkena serangan. Anda juga perlu memeriksa apakah data yang Anda terima cocok dengan data yang Anda kirimkan. Jika data tidak dibuat sepenuhnya aman untuk dikeluarkan, Anda juga akan mengalami masalah serius. Semua ini dapat dinyatakan sebagai aturan untuk PHP “Validasi input; lolos dari hasilnya."

    Ini jelas merupakan sumber data yang harus kita kendalikan. Sumber mungkin juga mencakup penyimpanan sisi klien. Misalnya, sebagian besar aplikasi mengenali pengguna dengan memberikan mereka ID sesi unik, yang dapat disimpan dalam cookie. Jika penyerang mendapatkan nilai dari cookie, dia dapat menyamar sebagai pengguna lain. Meskipun kami dapat memitigasi beberapa risiko yang terkait dengan intersepsi atau gangguan data pengguna, kami tidak dapat menjamin keamanan fisik komputer pengguna. Kami bahkan tidak dapat menjamin bahwa pengguna akan menganggap "123456" sebagai kata sandi paling bodoh setelah "kata sandi". Hal yang lebih menarik diberikan oleh fakta bahwa saat ini cookie bukan satu-satunya jenis penyimpanan di sisi pengguna.

    Risiko lain yang sering diabaikan adalah integritas kode sumber Anda. Dalam PHP, pengembangan aplikasi berdasarkan sejumlah besar pustaka, modul, dan paket kerangka kerja yang digabungkan secara longgar menjadi semakin populer. Banyak di antaranya diunduh dari repositori publik seperti Github, dan diinstal menggunakan penginstal paket seperti Composer dan pendamping webnya Packagist.org. Oleh karena itu, keamanan kode sumber sepenuhnya bergantung pada keamanan semua layanan dan komponen pihak ketiga tersebut. Jika Github disusupi, kemungkinan besar Github akan digunakan untuk mendistribusikan kode dengan aditif berbahaya. Jika Packagist.org - maka penyerang akan dapat mengarahkan permintaan paket ke paket jahatnya sendiri.

    Saat ini, Composer dan Packagist.org memiliki kerentanan yang diketahui dalam deteksi ketergantungan dan distribusi paket, jadi selalu periksa ulang semua yang ada di lingkungan produksi Anda dan verifikasi sumber semua paket dari Packagist.org.

    Bagaimana kita bisa menghentikan mereka? Menerobos keamanan aplikasi web bisa menjadi tugas yang sangat sederhana hingga sangat memakan waktu. Wajar untuk berasumsi bahwa setiap aplikasi web memiliki kerentanan di suatu tempat. Alasannya sederhana: semua aplikasi dibuat oleh manusia, dan manusia membuat kesalahan. Jadi keamanan yang sempurna adalah impian belaka. Semua aplikasi mungkin mengandung kerentanan, dan tugas pemrogram adalah meminimalkan risiko.

    Anda harus berpikir hati-hati untuk mengurangi kemungkinan kerusakan akibat serangan terhadap aplikasi web. Seiring berjalannya cerita, saya akan berbicara tentang kemungkinan metode serangan. Beberapa di antaranya terlihat jelas, yang lainnya tidak. Namun bagaimanapun juga, untuk mengatasi masalah ini, Anda perlu mempertimbangkan beberapa prinsip keamanan dasar.

    Prinsip-Prinsip Keamanan Dasar Ketika mengembangkan langkah-langkah keamanan, efektivitasnya dapat dinilai dengan menggunakan pertimbangan berikut. Saya sudah mengutip beberapa di atas.
  • Jangan percaya siapa pun atau apa pun.
  • Selalu asumsikan skenario terburuk.
  • Menerapkan perlindungan bertingkat (Defence-in-Depth).
  • Tetap berpegang pada prinsip “Keep It Simple Stupid” (KISS).
  • Patuhi prinsip “hak istimewa yang paling kecil.”
  • Penyerang mencium ambiguitas.
  • Baca dokumentasinya (RTFM), tapi jangan pernah mempercayainya.
  • Kalau belum dites, tidak bisa.
  • Itu selalu salahmu!
  • Mari kita bahas secara singkat semua poinnya.1. Jangan mempercayai siapa pun atau apa pun Seperti disebutkan di atas, posisi yang benar adalah berasumsi bahwa segala sesuatu dan semua orang yang berinteraksi dengan aplikasi web Anda ingin meretasnya. Ini mencakup komponen atau lapisan aplikasi lain yang diperlukan untuk memproses permintaan. Apa pun dan segalanya. Tidak ada pengecualian.2. Selalu asumsikan skenario terburuk Banyak sistem keamanan memiliki satu kesamaan: tidak peduli seberapa baik sistem tersebut dibuat, masing-masing sistem dapat dibobol. Jika Anda mempertimbangkan hal ini, Anda akan segera memahami keuntungan dari poin kedua. Berfokus pada skenario terburuk akan membantu Anda menilai cakupan dan tingkat keparahan serangan. Dan jika hal ini benar-benar terjadi, Anda mungkin dapat mengurangi konsekuensi yang tidak menyenangkan dengan langkah-langkah keamanan tambahan dan perubahan arsitektur. Mungkin solusi tradisional yang Anda gunakan sudah digantikan oleh sesuatu yang lebih baik?3. Gunakan perlindungan bertingkat (Defense-in-Depth) Perlindungan bertingkat dipinjam dari ilmu militer, karena orang telah lama menyadari bahwa banyak dinding, karung pasir, peralatan, pelindung tubuh, dan termos yang menutupi organ vital dari peluru dan bilah musuh adalah hak yang tepat. pendekatan terhadap keselamatan. Anda tidak pernah tahu mana di atas yang tidak akan melindungi, dan Anda perlu memastikan bahwa beberapa lapisan perlindungan memungkinkan Anda mengandalkan lebih dari sekadar benteng lapangan atau formasi pertempuran. Tentu saja, ini bukan hanya kegagalan tunggal. Bayangkan seorang penyerang menaiki tangga ke tembok raksasa abad pertengahan hanya untuk menemukan ada tembok lain di belakangnya tempat dia dihujani anak panah. Peretas akan merasakan hal yang sama.4. Keep It Simple Stupid (KISS) Pertahanan terbaik selalu sederhana. Mereka mudah untuk dikembangkan, diimplementasikan, dipahami, digunakan dan diuji. Kesederhanaan mengurangi kesalahan, mendorong kinerja aplikasi yang benar, dan memfasilitasi implementasi bahkan di lingkungan yang paling kompleks dan tidak bersahabat.5. Mematuhi prinsip “hak istimewa paling rendah” Setiap peserta dalam pertukaran informasi (pengguna, proses, program) hanya boleh memiliki hak akses yang diperlukan untuk menjalankan fungsinya.6. Penyerang Mencium Ketidakjelasan Keamanan oleh Ketidakjelasan didasarkan pada asumsi bahwa jika Anda menggunakan Pertahanan A dan tidak memberi tahu siapa pun apa itu, cara kerjanya, atau apakah itu ada, itu akan secara ajaib membantu Anda karena penyerang menjadi bingung. Kenyataannya, hal ini hanya memberikan sedikit keuntungan. Seringkali, penyerang yang berpengalaman akan dapat mengetahui tindakan yang telah Anda ambil, jadi Anda perlu menggunakan pertahanan yang jelas. Mereka yang terlalu yakin bahwa perlindungan yang tidak jelas meniadakan kebutuhan akan perlindungan yang nyata harus dihukum secara khusus untuk menghilangkan ilusi.7. Baca dokumentasinya (RTFM), tapi jangan pernah mempercayainya.Manual PHP adalah Alkitab. Tentu saja, ini tidak ditulis oleh Monster Spageti Terbang, jadi secara teknis mungkin ada setengah kebenaran, kelalaian, salah tafsir, atau kesalahan yang belum diperhatikan atau diperbaiki. Hal yang sama berlaku untuk Stack Overflow.

    Sumber kebijaksanaan keamanan khusus (berfokus pada PHP dan lainnya) umumnya memberikan pengetahuan yang lebih rinci. Hal yang paling mirip dengan Alkitab tentang keamanan PHP adalah OWASP, yang menawarkan artikel, panduan, dan tip. Jika tidak disarankan melakukan sesuatu di OWASP, jangan pernah melakukannya!

    8. Jika belum diuji, tidak berfungsi. Saat menerapkan langkah-langkah keamanan, Anda harus menulis semua tes kerja yang diperlukan untuk verifikasi. Termasuk berpura-pura bahwa Anda adalah seorang hacker yang ditangisi oleh penjara. Ini mungkin tampak tidak masuk akal, namun mengenal teknik peretasan aplikasi web adalah praktik yang baik; Anda akan belajar tentang kemungkinan kerentanan, dan paranoia Anda akan meningkat. Pada saat yang sama, tidak perlu memberi tahu manajemen tentang rasa terima kasih Anda yang baru diperoleh karena meretas aplikasi web. Pastikan untuk menggunakan alat otomatis untuk mengidentifikasi kerentanan. Mereka berguna, tetapi tentu saja tidak menggantikan tinjauan kode berkualitas tinggi dan bahkan pengujian aplikasi secara manual. Semakin banyak sumber daya yang Anda keluarkan untuk pengujian, semakin andal aplikasi Anda.9. Itu selalu salahmu! Pemrogram terbiasa berpikir bahwa kerentanan keamanan akan ditemukan dalam serangan yang terisolasi, dan konsekuensinya dapat diabaikan.

    Misalnya, pelanggaran data (jenis peretasan yang terdokumentasi dengan baik dan tersebar luas) sering kali dipandang sebagai masalah keamanan kecil karena tidak berdampak langsung pada pengguna. Namun, kebocoran informasi tentang versi perangkat lunak, bahasa pengembangan, lokasi kode sumber, logika aplikasi dan bisnis, struktur database, dan aspek lain dari lingkungan aplikasi web dan operasi internal seringkali penting untuk keberhasilan serangan.

    Pada saat yang sama, serangan terhadap sistem keamanan sering kali merupakan kombinasi serangan. Secara individual, mereka tidak signifikan, tapi kadang-kadang mereka membuka jalan bagi serangan lainnya. Misalnya, injeksi SQL terkadang memerlukan nama pengguna tertentu, yang dapat diperoleh dengan menggunakan Timing Attack terhadap antarmuka administratif, alih-alih menggunakan kekerasan yang jauh lebih mahal dan terlihat. Pada gilirannya, injeksi SQL memungkinkan Anda menerapkan serangan XSS pada akun administratif tertentu tanpa menarik perhatian dengan sejumlah besar entri mencurigakan di log.

    Bahaya jika mempertimbangkan kerentanan secara terpisah adalah meremehkan ancaman yang ada, dan karena itu terlalu ceroboh terhadapnya. Seringkali programmer malas memperbaiki suatu kerentanan karena menganggapnya terlalu kecil. Hal ini juga merupakan praktik umum untuk mengalihkan tanggung jawab pengembangan yang aman kepada pemrogram atau pengguna akhir, seringkali tanpa mendokumentasikan masalah spesifik: bahkan keberadaan kerentanan ini tidak diketahui.

    Hal yang tampaknya tidak penting ini tidaklah penting. Tidak bertanggung jawab memaksa pemrogram atau pengguna untuk memperbaiki kerentanan Anda, terutama jika Anda tidak diberitahu tentang kerentanan tersebut.

    Validasi Input Validasi Input adalah perimeter pertahanan luar aplikasi web Anda. Ini melindungi logika bisnis inti, pemrosesan data, dan pembuatan keluaran. Secara harfiah, segala sesuatu di luar batas ini, kecuali kode yang dijalankan oleh permintaan saat ini, dianggap sebagai wilayah musuh. Semua kemungkinan pintu masuk dan keluar dari perimeter dijaga siang dan malam oleh penjaga militan yang menembak terlebih dahulu dan kemudian mengajukan pertanyaan. “Sekutu” yang dijaga secara terpisah (dan tampak sangat mencurigakan) terhubung ke perimeter, termasuk “Model”, “Database”, dan “Sistem File”. Tidak ada yang mau menembak mereka, tapi jika mereka mencoba peruntungan... bang. Setiap sekutu memiliki perimeternya sendiri, yang mungkin mempercayai perimeter kita atau tidak.

    Ingat apa yang saya katakan tentang siapa yang bisa Anda percayai? Tidak kepada siapa pun dan tidak kepada siapa pun. Di dunia PHP, saran untuk tidak mempercayai “input pengguna” ada dimana-mana. Ini adalah salah satu kategori menurut tingkat kepercayaannya. Dengan asumsi bahwa pengguna tidak dapat dipercaya, kami berasumsi bahwa segala sesuatu yang lain dapat dipercaya. Ini salah. Pengguna adalah sumber masukan yang paling tidak dapat diandalkan karena kita tidak mengenal mereka dan tidak dapat mengendalikan mereka.

    Kriteria validasi Validasi data masukan adalah perlindungan aplikasi web yang paling jelas dan paling tidak dapat diandalkan. Sebagian besar kerentanan terjadi karena kegagalan sistem verifikasi, jadi sangat penting agar bagian perlindungan ini berfungsi dengan benar. Boleh saja gagal, namun tetap berpegang pada pertimbangan berikut. Ingatlah selalu saat menerapkan validator khusus dan menggunakan pustaka validasi pihak ketiga bahwa solusi pihak ketiga cenderung melakukan tugas umum dan menghilangkan prosedur validasi utama yang mungkin diperlukan aplikasi Anda. Saat menggunakan perpustakaan apa pun yang ditujukan untuk kebutuhan keamanan, pastikan untuk memeriksa kerentanan dan pengoperasian yang benar secara mandiri. Saya juga menyarankan untuk mengingat bahwa PHP dapat menunjukkan perilaku yang aneh dan mungkin tidak aman. Lihatlah contoh yang diambil dari fungsi pemfilteran:

    Filter_var("php://example.org", FILTER_VALIDATE_URL);
    Filternya lolos tanpa pertanyaan apa pun. Masalahnya adalah URL php:// yang diterima dapat diteruskan ke fungsi PHP yang mengharapkan untuk menerima alamat HTTP jarak jauh daripada mengembalikan data dari skrip PHP yang sedang dijalankan (melalui pengendali PHP). Kerentanan terjadi karena opsi pemfilteran tidak memiliki metode untuk membatasi URI yang valid. Meskipun aplikasi mengharapkan tautan http, https atau mailto dan bukan URI khusus PHP. Pendekatan pengujian yang terlalu umum ini harus dihindari dengan cara apa pun.

    Hati-hati dengan konteks Validasi input harus mencegah data yang tidak aman dimasukkan ke dalam aplikasi web. Batu sandungan utama: Pengujian keamanan data biasanya hanya dilakukan untuk penggunaan pertama.

    Katakanlah saya menerima data yang berisi nama. Saya dapat memeriksanya dengan cukup mudah untuk tanda kutip, tanda hubung, tanda kurung, spasi, dan sejumlah karakter alfanumerik Unicode. Nama adalah data valid yang dapat digunakan untuk tampilan (tujuan penggunaan pertama). Namun jika Anda menggunakannya di tempat lain (misalnya, dalam kueri database), itu akan berakhir dalam konteks baru. Dan beberapa karakter yang sah dalam sebuah nama akan berubah menjadi berbahaya dalam konteks ini: jika nama tersebut diubah menjadi string untuk melakukan injeksi SQL.

    Ternyata verifikasi data masukan pada dasarnya tidak dapat diandalkan. Ini paling efektif untuk memotong nilai yang jelas-jelas tidak valid. Katakanlah ketika sesuatu harus berupa bilangan bulat, atau string alfanumerik, atau URL HTTP. Format dan nilai-nilai tersebut memiliki keterbatasan dan, jika diverifikasi dengan benar, kecil kemungkinannya menimbulkan ancaman. Nilai lain (teks tidak terbatas, array GET/POST, dan HTML) lebih sulit diverifikasi dan lebih cenderung berisi data berbahaya.

    Karena sebagian besar waktu aplikasi kita akan mentransfer data antar konteks, kita tidak bisa hanya memeriksa semua data masukan dan menghentikannya sehari saja. Pemeriksaan di pintu masuk hanyalah garis perlindungan pertama, tetapi bukan satu-satunya.

    Selain pengecekan data masukan, metode proteksi seperti shielding sangat sering digunakan. Dengan bantuannya, data diperiksa keamanannya saat memasuki setiap konteks baru. Metode ini biasanya digunakan untuk melindungi terhadap skrip lintas situs (XSS), tetapi juga digunakan dalam banyak tugas lainnya, sebagai alat pemfilteran.

    Shielding melindungi terhadap salah tafsir oleh penerima data keluar. Namun ini tidak cukup - ketika data memasuki konteks baru, diperlukan pemeriksaan khusus untuk konteks tertentu.

    Meskipun hal ini mungkin dianggap menduplikasi validasi masukan awal, langkah-langkah validasi tambahan sebenarnya lebih mampu mengatasi konteks spesifik saat ini di mana persyaratan data sangat berbeda. Misalnya, data yang berasal dari formulir mungkin berisi angka persentase. Pertama kali kami menggunakannya, kami memeriksa apakah nilainya memang bilangan bulat. Namun ketika ditransfer ke model aplikasi kita, persyaratan baru mungkin muncul: nilainya harus sesuai dengan rentang tertentu, yang diperlukan agar logika bisnis aplikasi dapat berfungsi. Dan jika pemeriksaan tambahan ini tidak dilakukan dalam konteks baru, maka masalah serius bisa timbul.

    Gunakan hanya daftar putih, bukan daftar hitam Daftar hitam dan daftar putih adalah dua pendekatan utama untuk memvalidasi data masukan. Hitam berarti memeriksa data yang tidak valid, dan putih berarti memeriksa data yang valid. Daftar putih lebih disukai karena hanya data yang kami harapkan yang dikirimkan selama verifikasi. Pada gilirannya, daftar hitam hanya memperhitungkan asumsi pemrogram tentang semua kemungkinan data yang salah, sehingga lebih mudah untuk menjadi bingung, melewatkan sesuatu, atau membuat kesalahan.

    Contoh yang baik adalah prosedur validasi apa pun yang dirancang untuk membuat HTML aman dalam hal keluaran yang tidak lolos dalam templat. Jika kita menggunakan daftar hitam, maka kita perlu memeriksa bahwa HTML tidak mengandung elemen, atribut, gaya, dan JavaScript yang dapat dieksekusi yang berbahaya. Ini membutuhkan banyak pekerjaan, dan pembersih HTML berbasis daftar hitam selalu berhasil melewatkan kombinasi kode berbahaya. Dan alat yang memasukkan daftar putih menghilangkan ambiguitas ini dengan hanya mengizinkan elemen dan atribut yang diketahui dan diizinkan. Semua yang lain akan dipisahkan, diasingkan atau disingkirkan, apapun mereka.

    Jadi daftar putih lebih disukai untuk prosedur verifikasi apa pun karena keamanan dan keandalannya lebih tinggi.

    Jangan sekali-kali mencoba mengoreksi data masukan Verifikasi data masukan sering kali disertai dengan pemfilteran. Jika pada saat verifikasi kita hanya mengevaluasi kebenaran data (memberikan hasil positif atau negatif), maka pemfilteran akan mengubah data yang diperiksa sehingga memenuhi aturan tertentu.

    Hal ini biasanya agak berbahaya. Filter tradisional mencakup, misalnya, menghapus semua karakter kecuali angka dari nomor telepon (termasuk tanda kurung dan tanda hubung tambahan), atau memangkas spasi horizontal atau vertikal yang tidak diperlukan. Dalam situasi seperti ini, pembersihan minimal dilakukan untuk menghilangkan kesalahan dalam tampilan atau transmisi. Namun, Anda mungkin terlalu terbawa dengan penggunaan pemfilteran untuk memblokir data berbahaya.

    Salah satu konsekuensi dari upaya mengoreksi data masukan adalah penyerang dapat memprediksi dampak koreksi Anda. Katakanlah ada beberapa nilai string yang tidak valid. Anda mencarinya, menghapusnya dan menyelesaikan pemfilteran. Bagaimana jika penyerang membuat nilai yang dipisahkan string untuk mengecoh filter Anda?

    alert(dokumen.cookie);
    Dalam contoh ini, memfilter berdasarkan tag saja tidak akan menghasilkan apa-apa: menghapus tag eksplisit akan mengakibatkan data dianggap sebagai elemen skrip HTML yang sepenuhnya valid. Hal yang sama dapat dikatakan tentang pemfilteran menurut format tertentu. Semua ini dengan jelas menunjukkan mengapa pemeriksaan data masukan tidak boleh menjadi putaran keamanan terakhir aplikasi.

    Daripada mencoba memperbaiki masukan, cukup gunakan validator berbasis daftar putih dan tolak seluruh upaya masukan tersebut. Dan jika Anda perlu memfilter, selalu filter sebelum melakukan pemeriksaan, jangan pernah setelahnya.

    Jangan pernah mempercayai alat validasi eksternal dan terus memantau kerentanan yang saya sebutkan sebelumnya bahwa validasi diperlukan setiap kali data ditransfer ke konteks baru. Hal ini juga berlaku untuk validasi yang dilakukan di luar aplikasi web itu sendiri. Ini termasuk validasi atau pembatasan lain yang diterapkan pada formulir HTML di browser. Lihatlah formulir ini dari HTML 5 (label dihilangkan):

    Reputasi. Irlandia Britania Raya
    Formulir HTML dapat memberikan batasan pada data yang dimasukkan. Anda dapat membatasi pilihan menggunakan daftar item tetap, menetapkan nilai minimum dan maksimum, dan juga membatasi panjang teks. Kemungkinan HTML 5 bahkan lebih luas. Browser dapat memeriksa URL dan alamat email, serta mengontrol tanggal, angka, dan rentang (walaupun dukungan untuk dua yang terakhir cukup buruk). Browser juga dapat memvalidasi input menggunakan ekspresi reguler JavaScript yang disertakan dalam atribut template.

    Dengan semua kontrol ini, penting untuk diingat bahwa tujuannya adalah untuk meningkatkan kegunaan aplikasi Anda. Penyerang mana pun dapat membuat formulir yang tidak mengandung batasan dari formulir asli Anda. Anda bahkan dapat membuat klien HTTP untuk pengisian formulir otomatis!

    Contoh lain alat validasi eksternal adalah menerima data dari API pihak ketiga, seperti Twitter. Jejaring sosial ini memiliki reputasi yang baik dan biasanya dipercaya tanpa ragu. Tapi karena kita paranoid, kita seharusnya tidak mempercayai Twitter. Jika dikompromikan, responsnya akan berisi data tidak aman yang tidak kami persiapkan. Oleh karena itu, di sini pun gunakan cek Anda sendiri agar tidak berdaya jika terjadi sesuatu.

    Jika kami yakin pada alat verifikasi eksternal, akan lebih mudah untuk memantau kerentanan. Misalnya, jika formulir HTML menetapkan batas panjang maksimum dan kami menerima masukan yang ukurannya telah mencapai batas tersebut, maka logis untuk berasumsi bahwa pengguna mencoba melewati pemeriksaan tersebut. Dengan cara ini kami dapat mencatat pelanggaran pada alat eksternal dan mengambil tindakan lebih lanjut terhadap potensi serangan dengan membatasi akses atau jumlah permintaan.

    Hindari konversi tipe di PHP PHP bukanlah bahasa yang sangat mengetik, dan sebagian besar fungsi dan operasinya tidak aman untuk mengetik. Hal ini dapat menimbulkan masalah yang serius. Selain itu, bukan nilai-nilai itu sendiri yang paling rentan, melainkan validatornya. Misalnya:

    Tegaskan(0 == "0ABC"); //mengembalikan pernyataan BENAR(0 == "ABC"); //mengembalikan BENAR (walaupun tanpa angka di awal!) menegaskan(0 === "0ABC"); //mengembalikan NULL/Memberikan peringatan tentang ketidakmungkinan memeriksa pernyataan
    Saat mendesain validator, pastikan Anda menggunakan perbandingan ketat dan konversi tipe manual ketika nilai input atau output mungkin berupa string. Misalnya, formulir bisa mengembalikan string, jadi jika Anda bekerja dengan data yang harus berupa bilangan bulat, pastikan untuk memeriksa jenisnya:

    Fungsi checkIntegerRange($int, $min, $max) ( if (is_string($int) && !ctype_digit($int)) ( return false; // berisi karakter non-digit ) if (!is_int((int) $int )) ( return false; // nilai non-integer lain atau lebih besar PHP_MAX_INT ) return ($int >= $min && $int = $min && $int array("verify_peer" => TRUE))); $body = file_get_contents("https://api.example.com/search?q=sphinx", false, $context);
    UPD. Di PHP 5.6+, opsi ssl.verify_peer diatur ke TRUE secara default.

    Ekstensi cURL menyertakan pemeriksaan server secara langsung, jadi Anda tidak perlu mengonfigurasi apa pun. Namun, pemrogram terkadang mengambil pendekatan yang tidak bijaksana terhadap keamanan perpustakaan dan aplikasi mereka. Pendekatan ini dapat ditemukan di perpustakaan mana pun yang menjadi sandaran aplikasi Anda.

    Curl_setopt(CURLOPT_SSL_VERIFYPEER, salah);
    Menonaktifkan verifikasi server dalam konteks SSL atau saat menggunakan curl_setopt() akan mengakibatkan kerentanan terhadap serangan man-in-the-middle. Tapi itu dinonaktifkan justru untuk mengatasi masalah kesalahan mengganggu yang mengindikasikan serangan atau aplikasi mencoba menghubungi host yang sertifikat SSLnya tidak dikonfigurasi dengan benar atau telah kedaluwarsa.

    Aplikasi web seringkali dapat bertindak sebagai proxy untuk aktivitas pengguna, seperti klien Twitter. Paling tidak yang bisa kami lakukan adalah menjaga aplikasi kami sesuai standar tinggi yang ditetapkan oleh browser yang memperingatkan pengguna dan mencoba melindungi mereka agar tidak terhubung ke server yang mencurigakan.

    Kesimpulan Seringkali kita memiliki semua kemampuan untuk membuat aplikasi yang aman. Namun kami sendiri melewati beberapa batasan yang masuk akal untuk memfasilitasi pengembangan, debugging, dan menonaktifkan keluaran kesalahan yang mengganggu. Atau, karena niat baik, kami mencoba mempersulit logika aplikasi secara tidak perlu.

    Namun para peretas juga tidak memakan rotinya dengan sia-sia. Mereka mencari cara baru untuk menerobos perlindungan kami yang tidak sempurna dan mempelajari kerentanan dalam modul dan perpustakaan yang kami gunakan. Dan jika tujuan kami adalah membuat aplikasi web yang aman, maka tujuan mereka adalah membahayakan layanan dan data kami. Pada akhirnya, kita semua berupaya untuk meningkatkan produk kita.

    Apakah Anda perlu menentukan waktu terbaik untuk hamil, mencegah kehamilan yang tidak diinginkan, atau mencari tahu kapan waktu terbaik untuk berhubungan seks dengan pasangan? Sebelumnya, perempuan harus pergi ke dokter untuk berkonsultasi, namun kini mereka punya sahabat baru – smartphone.

    Dalam beberapa tahun terakhir, beragam aplikasi untuk wanita telah bermunculan yang memudahkan untuk melacak hari subur dan waktu ovulasi, serta membuat catatan pribadi. Selain itu, mereka memiliki banyak fitur lainnya. Salah satu aplikasi tersebut adalah Glow yang sudah digunakan oleh 47 juta wanita. Cahaya memungkinkan Anda melacak hal-hal seperti suasana hati wanita serta kualitas dan frekuensi seks. Berkat aplikasi ini, Anda bisa mendapatkan fakta menarik tentang kehidupan intim wanita dari seluruh dunia.

    Negara terbaik untuk wanita

    1. Apakah Anda kurang keintiman? Pergi ke Kanada. Ternyata wanita Kanada berhubungan seks 45% lebih sering dibandingkan rata-rata pengguna aplikasi.

    2. Namun hati-hati: Kanada adalah tempat yang bagus untuk hamil. Wanita Kanada bisa hamil 21% lebih mudah dibandingkan wanita lain.

    3. Wanita Australia juga sering berhubungan seks - 37% lebih banyak dibandingkan rata-rata pengguna aplikasi.

    4. Apakah wanita di Australia juga punya peluang besar untuk hamil? Mereka 14% lebih tinggi dari pengguna lain.

    5. Amerika adalah tempat yang baik untuk berbahagia. Wanita Amerika 16% lebih mungkin melakukan hubungan seks dibandingkan wanita lain.

    6. Tempat terburuk untuk berbahagia? Amerika Latin. Di sini, perempuan berhubungan seks 4% lebih jarang dibandingkan rata-rata pengguna aplikasi.

    Nafsu seksual

    1. Nafsu seksual seorang wanita berhubungan dengan siklus bulanannya. Hari pertama siklus adalah hari pertama haid yang berlangsung kurang lebih lima hari. Oleh karena itu, wanita paling tidak tertarik pada seks satu hingga lima hari dalam sebulan.

    2. Banyak wanita melaporkan perubahan tingkat energi atau suasana hati selama masa ini, dan hal ini biasanya dikaitkan dengan penurunan hasrat seksual. Wanita juga kurang tertarik berhubungan seks selama seminggu penuh setelah menstruasi.

    3. Kebanyakan wanita mulai berhubungan seks lagi pada hari ke 12 siklusnya.

    4. Banyak wanita melakukan hubungan seksual secara teratur pada hari ke 12 hingga 14 siklus. Aplikasi Glow menyebut hari-hari ini sebagai "puncak seksi".

    5. Wanita sebenarnya merasa paling seksi pada hari ke 13 dan 14 siklusnya. Namun ada hal yang menarik: mereka belum tentu mendapatkan seks terbaik dan memuaskan saat ini.

    6. Wanita paling menikmati seks pada hari ke-30 terakhir dari siklusnya. Hari ini di Glow ditetapkan sebagai "puncak orgasme".

    Apakah wanita puas?

    1. Wanita merasa paling bahagia pada hari ke 15 dan 16 siklusnya, dan juga jika sudah banyak berhubungan seks pada hari-hari sebelumnya.

    2. Pengguna Glow mencatat 7,6 juta hubungan seksual selama dua tahun.

    3. Artinya setiap menit setidaknya tujuh wanita yang menggunakan aplikasi Glow melakukan hubungan seks.

    4. Omong-omong, pengguna juga melaporkan kesukaan mereka sebanyak 2 juta kali. Aplikasi ini juga melacak siklus seks dan kesuburan 88.000 pasangan.

    5. Sayangnya, meski sudah melakukan hubungan seksual, tidak semua wanita merasa puas. Hampir sepertiga wanita lebih memilih berhenti berhubungan seks dibandingkan menggunakan ponsel pintar.

    6. Tapi itu berarti dua pertiga lebih memilih melepaskan ponsel mereka daripada berhubungan seks.

    Tampilan