0% menganggap dokumen ini bermanfaat (0 suara)
18 tayangan10 halaman

KPL 1

Dokumen tersebut membahas berbagai anti-pattern dalam praktik keamanan aplikasi web yang dapat memengaruhi keamanan sistem, termasuk penanganan input dan output data yang tidak tepat, desain kode yang berantakan, dan kegagalan dalam menerapkan praktik keamanan sejak awal proses pengembangan."

Diunggah oleh

Kray Man
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai DOCX, PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
18 tayangan10 halaman

KPL 1

Dokumen tersebut membahas berbagai anti-pattern dalam praktik keamanan aplikasi web yang dapat memengaruhi keamanan sistem, termasuk penanganan input dan output data yang tidak tepat, desain kode yang berantakan, dan kegagalan dalam menerapkan praktik keamanan sejak awal proses pengembangan."

Diunggah oleh

Kray Man
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai DOCX, PDF, TXT atau baca online di Scribd
Anda di halaman 1/ 10

All Incoming HTTP Data Are Strings

- Pendahuluan

Semua data yang masuk dari permintaan http adalah string.

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.

- Treating Variables by Type

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.

- Variable Type and Filter Relationship

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

Keadaan variabel yang dihasilkan setelah sanitasi adalah sebagai berikut.

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).

Bilangan bulat yang sebenarnya aman untuk digema langsung ke HTML

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.

Ada banyak masalah dengan ini.

1. Tidak ada perbedaan antara GET, POST, dan COOKIE


2. Tidak memperhitungkan jenis variable
3. Tidak memperhitungkan pengkodean set karakter
4. Tidak ada pencocokan set karakter dengan set karakter database
5. Hanya tag HTML yang dihapus

Design Practices Anti Pattern

- 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.

- No Clear Separation of HTML and PHP Code Anti-Pattern

Banyak string yang digabungkan sehingga sulit untuk mengetahui apakah data sudah dibersihkan
dengan benar.

- Too Many Database Function Calls

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).

- Misleading Filtering Anti-Pattern

Hindari kode yang membuat klaim keamanan yang menyesatkan, dan/atau membersihkan filter
secara tidak benar, dan hindari nama yang menyiratkan rasa aman yang salah.

- Too Many Quotes Anti-Pattern

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.

Raw Request Variables as Application Variables

Ada dua masalah yang muncul dari kode ini.

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.

- Common Direct URL Input Anti-Pattern

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.

- Poor Error Management Practices

Penanganan pesan kesalahan yang tidak tepat menciptakan dua kategori masalah.

Pertama, mereka menciptakan masalah kepuasan pengguna.

Kedua, mereka menciptakan masalah keamanan.

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."

- Poor Error Handling Practice

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.

- Poor Cryptography Practices

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.

Metode pengacakan enkripsi yang benar adalah CSPRNG:

 openssl_random_pseudo_bytes ()

 mcrypt_create_iv()

 /dev/urand source

Metode hashing yang benar:

 hash('sha256')
 hash('sha512')

- Poor Cookie Expiration

Cookie yang kedaluwarsa secara tidak benar menyebabkan serangan terhadap paparan jendela.

Metode yang salah:

1. setcookie("cookieID", "", 0);


2. setcookie("cookieID", "", time()-3600);

Contoh satu kedaluwarsa cookie saat browser ditutup.

Kedaluwarsa cookie dengan mengaturnya ke satu detik melewati waktu Unix epoch, yang akan
menyegerakan kedaluwarsa cookie.

- Poor Session Management

Anti-pattern ini tidak pernah mengaktifkan atau mengatur pengaturan sesi aman yang tersedia untuk
pengembang PHP. Ini termasuk, misalnya,

1. Tidak menggunakan halaman landing SSL


2. Tidak masuk melalui SSL
3. Tidak mengirim ID sesi yang divalidasi hanya melalui SSL
4. Tidak membatasi cookie penting lainnya hanya untuk SSL
5. Tidak membuat ulang ID sesi secara teratur

- Overcoming Anti-Patterns: Patterns, Testing, Automation

Test driven development (TDD) membantu memastikan bahwa langkah-langkah keamanan


diberlakukan sejak awal.

Pola desain perangkat lunak membantu membuat kode yang dapat digunakan kembali yang
konsisten dari proyek ke proyek.

Design Practices Anti Pattern 2

- Filtering versus Escaping versus Encoding

Filtering biasanya menghapus data dari aliran.

Fungsi ini adalah escaper untuk konteks database. Fungsi tersebut melakukan escaping untuk
karakter yang dilemparkan.

Fungsi htmlentities() adalah encoder.

Fungsi ini bisa jadi merusak atau tidak merusak data tergantung kapan digunakannya.

Jika kita menyimpan data setelah HTML di-encode, data diubah.

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.

Only One Output Context Anti-Pattern

- Lack of Planning Anti-Patterns

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.

- Mistakes of Process Omission

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.

- Mistakes of Simple Forgetfulness

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.

- Parameter Omission Anti-Pattern

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.

Validasi dan Sanitasi Input pada Java

- Prevent SQL injection

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.

- Normalize strings before validating them


Banyak aplikasi yang menerima string input yang tidak tepercaya menggunakan mekanisme
pemfilteran dan validasi input berdasarkan data karakter string.

- Do not log unsanitized user input

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.

- Exclude unsanitized user input from format strings

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.

- Sanitize untrusted data passed to the Runtime.exec() method

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.

Expressions, Character, dan String

- Ekspresi (EXP)

Jangan gunakan metode Object.equals () untuk membandingkan dua array, Jangan menggunakan
operator equals saat membandingkan nilai primitive

- Jangan gunakan Object.equals () metode untuk membandingkan dua array (1)

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

Contoh kode tidak patuh ini menggunakan metode Object.equals () untuk membandingkan dua larik:

int[] arr1 = new int[20]; // Initialized to 0

int[] arr2 = new int[20]; // Initialized to 0

System.out.println(arr1.equals(arr2)); // false

- Solusi yang sesuai (Arrays.equals())


Solusi yang sesuai ini membandingkan isi dua larik menggunakan metode Array.equals () dua
argumen:

int[] arr1 = new int[20]; // Initialized to 0

int[] arr2 = new int[20]; // Initialized to 0

System.out.println(Arrays.equals(arr1, arr2)); // Prints true

- Solusi yang sesuai (operator ==)

Solusi yang sesuai ini membandingkan referensi array menggunakan operator persamaan referensi
==:

int[] arr1 = new int[20]; // Initialized to 0

int[] arr2 = new int[20]; // Initialized to 0

System.out.println(arr1 == arr2); // Prints false

- Jangan gunakan operator kesetaraan saat membandingkan nilai primitif kotak (2)

- Karakter dan String (STR)

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.

- Contoh Kode Tidak Patuh (Tanggal)

Konsep hari dan tahun bersifat universal, tetapi cara di mana tanggal terwakili bervariasi antar
budaya dan karena itu khusus untuk lokal.

Jangan menyandikan data noncharacter sebagai string (3)

Semakin, programmer melihat string sebagai sarana portabel menyimpan dan mengkomunikasikan
data arbitrer, seperti nilai numerik.

-Deklarasi dan Inisialisasi

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.

Sebagai contoh, satu-satunya tujuan dari metode ProcessBuilder.redirectErrorStream () adalah


melaporkan melalui nilai kembali apakah pembangun proses berhasil menggabungkan kesalahan
standar dan output standar.

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

- Mendeteksi atau mencegah overflow bilangan bulat

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]:

Tabel berikut menunjukkan perilaku overflow integer dari operator integer.


Karena rentang jenis Java tidak simetris, bahkan operasi seperti negasi yang tidak beraturan dapat
meluap jika diterapkan ke nilai minimum.

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.

Perbandingan Teknik Compliant

• 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.

- Jangan gunakan angka floating-point jika perhitungan yang tepat diperlukan


Bahasa Java menyediakan dua tipe floating-point primitif, float dan double, yang terkait dengan
presisi tunggal 32-bit dan presisi ganda 64-bit nilai-nilai dan operasi yang ditentukan oleh IEEE 754
[IEEE 754].

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].

long num1, num2, result;

/* Initialize num1 and num2 */

if (num2 !=0) {

result = num1 % num2;

} else {

// handle error

Anda mungkin juga menyukai