KPL 1
KPL 1
- Pendahuluan
Data yang diambil dalam array super global $_post, $_get, dan $_request adalah string, bukan tipe
data lain.
Dua kategori utama data adalah string yang mewakili segalanya seperti nama, teks, tanggal, ID
alfanumerik, dll ..., dan string yang mewakili angka.
Setelah representasi string dari bilangan bulat secara eksplisit dikonversi menjadi bilangan bulat,
melalui intval(), atau dilemparkan melalui (int), perlu diperlakukan sebagai jenis bilangan bulat yang
sebenarnya.
Tugas logika aplikasi untuk menentukan penggunaan nilai aktual mereka dalam aplikasi sebagai
string, bilangan bulat, dan mengkonversi ke tipe eksplisit sesuai kebutuhan.
Karena $id sekarang adalah bilangan bulat aktual setelah konversi, dan bukan string, itu dapat
dengan aman dikeluarkan ke HTML atau database tanpa perlu escape. Tidak ada karakter berbahaya
di dalamnya.
Ada hubungan yang sangat penting antara tipe kolom tabel SQL yang didefinisikan dalam database
dan variabel yang digunakan dalam aplikasi. Tipe data variabel dan pemfilteran harus diterapkan
berdasarkan pemetaan tipe kolom table.
- Analisis Validasi
Tiga variabel pertama, $userName, $passHash, dan $pageID, sangat tidak berbahaya. Hasilnya
adalah bahwa ini dapat ditampilkan ke HTML dengan aman tanpa escaping.
Meskipun melakukan hal itu akan menjadi praktik keamanan yang buruk, dan tidak akan
direkomendasikan, itu akan aman.
$passHash juga hanya akan berisi karakter hexit huruf kecil yang tidak berbahaya (0–9, a–f).
Variabel $email berbeda dan lebih kompleks untuk diproses. $email harus menjalani empat proses
terpisah:
1. Email sanitization
2. Email validation
3. Database escaping
4. HTML escaping
- Input Same as Output Anti-Pattern
Pemfilteran input dan pelarian output adalah dua aspek keamanan aplikasi web yang berbeda dan
penting. Masing-masing harus ditangani dan masing-masing harus ditangani secara berbeda.
Anti-pattern adalah ketika keduanya diperlakukan sama, atau hanya tidak membuat perbedaan
antara keduanya.
- Pendahuluan
Kode yang menawarkan terlalu banyak duplikasi, kode yang tidak memisahkan logika ke dalam fungsi
atau kelas yang berbeda, dan kode yang tidak mengatur data dengan cara yang baik akan sulit untuk
menerapkan langkah-langkah keamanan yang konsisten.
Banyak string yang digabungkan sehingga sulit untuk mengetahui apakah data sudah dibersihkan
dengan benar.
Ada terlalu banyak pernyataan SQL yang harus dilindungi. Konteks output, dan konten data lebih sulit
ditentukan. Perubahan kode menjadi lebih melelahkan. Ada terlalu banyak tempat di mana data
output perlu disaring, sehingga pengembang dapat kehilangan kendali atas langkah-langkah
keamanan. Solusi untuk ini adalah pemisahan masalah (separation of concerns).
Hindari kode yang membuat klaim keamanan yang menyesatkan, dan/atau membersihkan filter
secara tidak benar, dan hindari nama yang menyiratkan rasa aman yang salah.
Penanganan kutipan cukup sulit dilakukan. Kode seperti di bawah ini, yang menggabungkan tanda
kutip tunggal dan ganda, meningkatkan kesulitan memeriksa dan melacak kutipan secara visual
dengan benar.
Pertama, penggunaan variabel tersebar di seluruh skrip dan tidak dilokalkan. Mencampur POST dan
GET untuk data menambah kompleksitas pemrosesan.
Masalah lainnya adalah akan rumit untuk melacak maksud pemrosesan atau membuat perubahan
dengan cara ini. Data mentah perlu diabstraksikan.
Dalam PHP, menggunakan URL langsung dari tautan halaman HTML untuk menyertakan kode atau
mengalihkan pengguna adalah praktik yang sangat luas karena sangat mudah untuk membangun
sistem navigasi menggunakan metode ini.
Penanganan pesan kesalahan yang tidak tepat menciptakan dua kategori masalah.
Praktik terbaik adalah memberikan arahan yang berarti bagi pengguna untuk situasi saat ini dan
menampilkan arahan tersebut alih-alih kesalahan yang sebenarnya,
Contohnya mungkin, pada kegagalan koneksi database, memberi tahu pengguna bahwa, "Situs
sedang dalam pemeliharaan, Silakan kembali dalam dua jam."
Masing-masing praktik ini mengabaikan kedua poin tentang pengguna yang mengganggu dengan
informasi yang tidak berguna dan mengungkapkan terlalu banyak informasi sistem.
Praktik yang lebih baik adalah mencatat pesan kesalahan dengan aman dan menampilkan
instruksi yang sopan dan berguna kepada pengguna tentang apa yang harus mereka lakukan
selanjutnya.
Masalah di sini adalah cipher kriptografi yang kedaluwarsa, md5() dan sha1(), dan keacakan yang
tidak memadai dari rand() dan uniqid().
Semua ini adalah mode enkripsi yang dapat diprediksi, terbuka untuk serangan tabel pelangi
yang telah ditentukan, dan memberikan rasa perlindungan yang salah.
Hashing ganda juga dikenal sebagai praktik yang buruk karena meningkatkan kemungkinan
tabrakan hash dan menghasilkan hash yang sama dua waktu yang berbeda.
openssl_random_pseudo_bytes ()
mcrypt_create_iv()
/dev/urand source
hash('sha256')
hash('sha512')
Cookie yang kedaluwarsa secara tidak benar menyebabkan serangan terhadap paparan jendela.
Kedaluwarsa cookie dengan mengaturnya ke satu detik melewati waktu Unix epoch, yang akan
menyegerakan kedaluwarsa cookie.
Anti-pattern ini tidak pernah mengaktifkan atau mengatur pengaturan sesi aman yang tersedia untuk
pengembang PHP. Ini termasuk, misalnya,
Pola desain perangkat lunak membantu membuat kode yang dapat digunakan kembali yang
konsisten dari proyek ke proyek.
Fungsi ini adalah escaper untuk konteks database. Fungsi tersebut melakukan escaping untuk
karakter yang dilemparkan.
Fungsi ini bisa jadi merusak atau tidak merusak data tergantung kapan digunakannya.
Jika kita mengirim data yang dikodekan HTML ke browser, data yang telah diubah yang dikirimkan
tetapi browser menerjemahkannya kembali, untuk mempertahankan data sebelum diubah.
Jika data dikodekan entitas, disimpan ke database, dan kemudian entitas dikodekan lagi untuk output
ke HTML, maka data dikodekan ganda.
Waktu adalah uang, aplikasi yang belum pernah dirilis tidak menghasilkan uang, dan semakin lama
sesuatu berlangsung, semakin rendah margin keuntungannya.
Salah satu hal pertama yang harus dilakukan adalah waktu yang dihabiskan untuk keamanan.
Secara praktis, salah satu cara utama untuk mengatasi hal ini adalah dengan membuat kerangka kerja
yang dapat digunakan kembali untuk masalah yang kita tahu akan muncul dan dengan demikian siap
sebelumnya.
Karena keamanan biasanya tidak direncanakan sejak awal proyek, itu menjadi proses tambahan yang
biasanya dilakukan terakhir jika ada waktu.
Dari pengalaman, mencoba meninjau kode dan mengidentifikasi semua vektor serangan, filter input
yang tepat, dan filter output yang tepat, tidak menyenangkan atau 100% akurat.
Saat melakukan hal hanya untuk "hanya ingin membuatnya bekerja" dengan cepat, sangat
mengejutkan untuk menyadari berapa banyak kode produksi yang dihasilkan dari implementasi cepat
sederhana ini, dan setelah berhasil, tidak ada yang ingat untuk kembali dan memeriksanya.
Ketergantungan pada fungsi default seperti htmlentities() dapat menyebabkan masalah. Secara
default, fungsi ini tidak meng-encode tanda kutip tunggal, yang dapat menjadi bencana jika
digunakan dalam situasi yang tepat, misalnya, sebagai bagian dari string atribut HTML.
Dalam setiap kasus di bawah ini, panggilan fungsi tidak aman ditampilkan terlebih dahulu, lalu
dibandingkan dengan panggilan fungsi aman yang dibuat dengan parameter aman nondefault.
Untuk membuat objek JSON yang aman untuk konsumsi JavaScript dengan parameter default,
elemen array bernama harus digunakan saat membangun array.
Kerentanan injeksi SQL muncul dalam aplikasi di mana elemen kueri SQL berasal dari sumber
yang tidak tepercaya. Tanpa tindakan pencegahan, data yang tidak tepercaya dapat mengubah kueri
dengan jahat, yang mengakibatkan kebocoran informasi atau modifikasi data.
Cara utama untuk mencegah injeksi SQL adalah sanitasi dan validasi, yang biasanya
diimplementasikan sebagai kueri parameter dan prosedur tersimpan.
Kerentanan injeksi log muncul ketika entri log berisi input pengguna yang tidak bersih. Serangan
injeksi log dapat dicegah dengan membersihkan dan memvalidasi input yang tidak tepercaya yang
dikirim ke log. Mencatat input pengguna yang tidak bersih juga dapat mengakibatkan kebocoran data
sensitif melintasi batas kepercayaan.
Memungkinkan metode PrintStream dipanggil pada output standar dan aliran kesalahan.
Akibatnya, input yang tidak bersih dari sumber yang tidak tepercaya tidak boleh dimasukkan ke
dalam string format.
Program eksternal biasanya dipanggil untuk melakukan fungsi yang dibutuhkan oleh keseluruhan
sistem. Praktik ini adalah bentuk penggunaan kembali dan bahkan dapat dianggap sebagai bentuk
kasar dari rekayasa perangkat lunak berbasis komponen.
Kerentanan injeksi perintah dan argumen terjadi ketika aplikasi gagal untuk membersihkan input
terpercaya dan menggunakannya dalam pelaksanaan program eksternal. Runtime saat ini dapat
diperoleh dari metode Runtime.getRuntime(). Akibatnya, serangan injeksi perintah tidak dapat
berhasil kecuali interpreter perintah secara eksplisit dipanggil.
- Ekspresi (EXP)
Jangan gunakan metode Object.equals () untuk membandingkan dua array, Jangan menggunakan
operator equals saat membandingkan nilai primitive
Di Java, array adalah objek dan mendukung metode objek seperti Object.equals (). Namun, array
tidak mendukung metode apa pun selain yang disediakan oleh Object. Akibatnya, menggunakan
Object.equals () pada array manapun hanya membandingkan referensi array, bukan isinya.
Contoh kode tidak patuh ini menggunakan metode Object.equals () untuk membandingkan dua larik:
System.out.println(arr1.equals(arr2)); // false
Solusi yang sesuai ini membandingkan referensi array menggunakan operator persamaan referensi
==:
- Jangan gunakan operator kesetaraan saat membandingkan nilai primitif kotak (2)
Jangan berasumsi bahwa java char sepenuhnya mewakili titik kode Unicode, Jangan mengkodekan
data noncharacter sebagai string
- Jangan berasumsi bahwa java char sepenuhnya mewakili titik kode Unicode (1)
Tipe data char didasarkan pada spesifikasi Unicode asli, yang mendefinisikan karakter sebagai entitas
16-bit dengan lebar tetap. Standar Unicode sejak itu telah diubah untuk memungkinkan karakter
yang representasinya membutuhkan lebih dari 16 bit.
Konsep hari dan tahun bersifat universal, tetapi cara di mana tanggal terwakili bervariasi antar
budaya dan karena itu khusus untuk lokal.
Semakin, programmer melihat string sebagai sarana portabel menyimpan dan mengkomunikasikan
data arbitrer, seperti nilai numerik.
Inisialisasi kelas terdiri dari mengeksekusi initializers statis dan penginisialisasi untuk bidang statis
(variabel kelas) yang dideklarasikan di kelas.
Saat dijalankan, variabel statis yang bersifat final dan yang diinisialisasi dengan nilai konstanta waktu
kompilasi diinisialisasi terlebih dahulu.
Contoh kode tidak patuh ini mengimplementasikan kelas yang menggunakan kembali nama kelas
java.util.Vector.
Object Orientation 2
Metode dapat mengembalikan nilai untuk mengomunikasikan kegagalan atau keberhasilan
atau memperbarui objek atau bidang lokal.
Risiko keamanan dapat muncul ketika metode mengembalikan nilai diabaikan atau ketika metode
pemohon gagal untuk mengambil tindakan yang sesuai. Akibatnya, program tidak boleh
mengabaikan nilai kembali metode.
Ketika metode pengambil dinamai setelah tindakan, programmer bisa gagal untuk menyadari bahwa
nilai kembali diharapkan.
Metode yang benar-benar melakukan pengalihan aliran kesalahan adalah metode argumen tunggal
yang kelebihan beban ProcessBuilder.redirectErrorStream (boolean).
- Operasi Numerik
1. Deteksi atau cegah bilangan bulat integer
2. Pastikan pembagian dan operasi sisanya tidak menghasilkan kesalahan divide-by-zero
3. Jangan gunakan angka floating-point jika perhitungan yang tepat diperlukan
4. Jangan coba perbandingan dengan NaN
5. Periksa input titik-mengambang untuk nilai luar biasa
Operator integer bawaan tidak menunjukkan overflow atau underflow dengan cara apa pun.
Operator integer dapat melempar NullPointerException jika konversi unboxing dari referensi null
diperlukan.
Selain itu, satu-satunya operator integer yang dapat melempar pengecualian adalah operator
pembagian integer / dan operator sisa integer%, yang melempar ArithmeticException jika operan
kanan adalah nol, dan operator penambahan dan pengurangan ++ dan - yang dapat membuang
OutOfMemoryError jika konversi tinju diperlukan dan tidak cukup memori untuk melakukan konversi.
Tipe data integer di Java, representasi, dan rentang inklusif ditunjukkan dalam tabel berikut yang
diambil dari JLS, §4.2.1, "Jenis dan Nilai Integer" [JLS 2015]:
Karena metode java.lang.math.abs () mengembalikan nilai absolut dari angka apa pun, itu juga dapat
melimpah jika diberi int minimum atau panjang sebagai argumen.
Ketika operasi matematika tidak dapat direpresentasikan dengan menggunakan tipe integer yang
disediakan, operator integer terintegrasi Java diam-diam membungkus hasil tanpa menunjukkan
limpahan.
Membungkus diam dapat menghasilkan perhitungan yang salah dan hasil yang tidak terduga.
Kegagalan untuk memperhitungkan overflow bilangan bulat telah mengakibatkan kegagalan sistem
nyata, misalnya, ketika menerapkan metode compareTo ().
Akibatnya, optimasi yang jelas tetapi tidak benar adalah dengan mengurangi operan dan
mengembalikan hasilnya.
• Pengujian prekondisi . Periksa input ke setiap operator aritmatika untuk memastikan bahwa
limpahan tidak dapat terjadi. Lempar ArithmeticException ketika operasi akan meluap jika
dilakukan; jika tidak, lakukan operasi.
• Upcasting . Cast input ke tipe integer primitif lebih besar berikutnya dan lakukan aritmatika
dalam ukuran yang lebih besar. Periksa setiap hasil antara untuk overflow dari tipe asli yang
lebih kecil dan lempar ArithmeticException jika pemeriksaan rentang gagal.
• BigInteger . Konversi input ke objek-objek bertipe BigInteger dan lakukan semua aritmatika
menggunakan metode BigInteger. Tipe BigInteger adalah tipe integer presisi-presisi standar
yang disediakan oleh pustaka standar Java. Operasi aritmatika diimplementasikan sebagai
metode jenis ini tidak dapat melimpah Pastikan pembagian dan operasi sisanya tidak
menghasilkan kesalahan divide-by-zero
Pembagian dan operasi sisanya rentan terhadap kesalahan divide-by-zero. Akibatnya, pembagi dalam
divisi atau operasi sisa harus diperiksa untuk nol sebelum operasi.
Lebih lanjut, karena jenis ini menggunakan mantissa biner, mereka tidak dapat secara tepat mewakili
banyak angka desimal, seperti 0,1, karena angka-angka ini memiliki representasi biner berulang.
Ketika perhitungan yang tepat diperlukan, seperti ketika melakukan perhitungan mata uang, jenis
floating-point tidak boleh digunakan. Sebaliknya, gunakan representasi alternatif yang benar-benar
dapat mewakili nilai-nilai yang diperlukan.
Ketika perhitungan yang tepat tidak diperlukan, representasi floating-point dapat digunakan. Dalam
Pertimbangkan untuk menggunakan analisis numerik untuk memahami masalah dengan benar. Lihat
karya Goldberg untuk pengenalan topik ini [Goldberg 1991].
if (num2 !=0) {
} else {
// handle error