KodeGym/Blog Jawa/Acak/Keamanan ing Jawa: praktik paling apik
John Squirrels
tingkat
San Francisco

Keamanan ing Jawa: praktik paling apik

Diterbitake ing grup
Salah sawijining metrik paling penting ing aplikasi server yaiku keamanan. Iki minangka jinis syarat non-fungsi . Keamanan ing Jawa: praktik paling apik - 1Keamanan kalebu akeh komponen. Mesthi wae, butuh luwih saka siji artikel kanggo nyakup kabeh prinsip keamanan lan langkah-langkah keamanan sing wis dingerteni, mula kita bakal mikir babagan sing paling penting. Wong sing ngerti babagan topik iki bisa nyiyapake kabeh proses sing cocog, supaya ora nggawe bolongan keamanan anyar, lan bakal dibutuhake ing tim apa wae. Mesthine, sampeyan ora kudu mikir manawa aplikasi sampeyan bakal 100% aman yen sampeyan ngetutake praktik kasebut. Ora! Nanging mesthi bakal luwih aman karo wong-wong mau. Ayo budal.

1. Nyedhiyakake keamanan ing tataran basa Jawa

Kaping pisanan, keamanan ing Jawa diwiwiti saka tingkat kemampuan basa kasebut. Apa sing bakal ditindakake yen ora ana modifikasi akses? Ora ana apa-apa kajaba anarki. Basa pamrograman mbantu kita nulis kode aman lan uga nggunakake akeh fitur keamanan implisit:
  1. Ketik sing kuwat. Basa Jawa iku basa sing diketik statis. Iki ndadekake iku bisa kanggo nyekel jinis-related kasalahan ing runtime.
  2. Akses modifiers. Iki ngidini kita ngatur akses menyang kelas, metode, lan kolom yen perlu.
  3. Manajemen memori otomatis. Kanggo iki, pangembang Java duwe kolektor sampah sing mbebasake kita saka kudu ngatur kabeh kanthi manual. Ya, masalah kadhangkala muncul.
  4. Verifikasi bytecode : Java dikompilasi dadi bytecode, sing dicenthang dening runtime sadurunge dieksekusi.
Kajaba iku, ana rekomendasi keamanan Oracle . Mesthine, ora ditulis nganggo basa sing dhuwur lan sampeyan bisa uga ngantuk kaping pirang-pirang nalika maca, nanging ora ana gunane. Utamane, dokumen kanthi judhul Secure Coding Guidelines for Java SE penting. Iki menehi saran babagan carane nulis kode aman. Dokumen iki nyedhiyakake akeh informasi sing migunani banget. Yen sampeyan duwe kesempatan, sampeyan kudu maca. Kanggo narik minat sampeyan ing materi iki, ana sawetara tips sing menarik:
  1. Aja nggawe seri kelas sensitif keamanan. Serialization mbukak antarmuka kelas ing file serialized, ora kanggo sebutno data sing serialized.
  2. Coba ngindhari kelas sing bisa diganti kanggo data. Iki menehi kabeh keuntungan saka kelas immutable (contone safety thread). Yen sampeyan duwe obyek sing bisa diowahi, bisa nyebabake prilaku sing ora dikarepake.
  3. Gawe salinan obyek sing bisa diganti. Yen cara ngasilake referensi menyang obyek sing bisa diowahi internal, kode klien bisa ngganti kahanan internal obyek kasebut.
  4. Lan sakteruse…
Sejatine, Pedoman Coding Aman kanggo Java SE minangka kumpulan tips lan trik babagan carane nulis kode Jawa kanthi bener lan aman.

2. Ngilangi kerentanan injeksi SQL

Iki minangka kerentanan khusus. Iku khusus amarga iku loro sing paling misuwur lan salah siji saka vulnerabilities paling umum. Yen sampeyan ora tau kasengsem ing keamanan komputer, sampeyan ora bakal ngerti babagan iki. Apa injeksi SQL? Iki minangka serangan database sing kalebu nyuntikake kode SQL tambahan sing ora dikarepake. Upaminipun kita duwe cara sing nampa sawetara jinis parameter kanggo query database. Contone, jeneng panganggo. Kode sing rawan bakal katon kaya iki:
// This method retrieves from the database all users with a certain name
public List findByFirstName(String firstName) throws SQLException {
   // Connect to the database
   Connection connection = DriverManager.getConnection(DB_URL, USER, PASS);

   // Compose a SQL database query with our firstName
   String query = "SELECT * FROM USERS WHERE firstName = " + firstName;

   // Execute the query
   Statement statement = connection.createStatement();
   ResultSet result = statement.executeQuery(query);

   // Use mapToUsers to convert the ResultSet into a collection of users.
   return mapToUsers(result);
}

private List mapToUsers(ResultSet resultSet) {
   // Converts to a collection of users
}
Ing conto iki, query SQL wis disiapake ing advance ing baris kapisah. Dadi apa masalahe, ta? Mungkin masalah iku bakal luwih apik kanggo nggunakake String.format ? ora? Nah, banjur apa? Ayo dadi panguji lan pikirake apa sing bisa ditindakake minangka nilai firstName . Tuladhane:
  1. Kita bisa ngliwati apa sing dikarepake - jeneng panganggo. Banjur database bakal ngasilake kabeh pangguna kanthi jeneng kasebut.
  2. Kita bisa ngliwati string kosong. Banjur kabeh pangguna bakal bali.
  3. Nanging kita uga bisa ngliwati ing ngisor iki: "'; DROP TABLE USERS;". Lan ing kene kita saiki duwe masalah huuuuuuge. Pitakonan iki bakal mbusak tabel saka database. Bebarengan karo kabeh data. KABEH.
Apa sampeyan bisa mbayangno masalah sing bakal ditindakake? Kajaba iku, sampeyan bisa nulis apa wae sing dikarepake. Sampeyan bisa ngganti jeneng kabeh pangguna. Sampeyan bisa mbusak alamate. Ruang lingkup sabotase iku gedhe banget. Kanggo ngindhari iki, sampeyan kudu nyegah injeksi pitakon sing wis siap lan nggawe pitakon nggunakake paramèter. Iki kudu dadi siji-sijine cara kanggo nggawe pitakon database. Iki carane sampeyan bisa ngilangi kerentanan iki. Tuladhane:
// This method retrieves from the database all users with a certain name
public List findByFirstName(String firstName) throws SQLException {
   // Connect to the database
   Connection connection = DriverManager.getConnection(DB_URL, USER, PASS);

   // Create a parameterized query.
   String query = "SELECT * FROM USERS WHERE firstName = ?";

   // Create a prepared statement with the parameterized query
   PreparedStatement statement = connection.prepareStatement(query);

   // Pass the parameter's value
   statement.setString(1, firstName);

   // Execute the query
   ResultSet result = statement.executeQuery(query);

   // Use mapToUsers to convert the ResultSet into a collection of users.
   return mapToUsers(result);
}

private List mapToUsers(ResultSet resultSet) {
   // Converts to a collection of users
}
Kanthi cara iki, kerentanan bisa dihindari. Kanggo sing pengin nyilem luwih jero menyang artikel iki, iki conto sing apik . Kepiye sampeyan ngerti yen sampeyan ngerti kerentanan iki? Yen sampeyan entuk lelucon ing komik ing ngisor iki, mula sampeyan bisa uga ngerti babagan kerentanan iki: DKeamanan ing Jawa: praktik paling apik - 2

3. Scan dependensi lan tetep nganyari

Apa tegese? Yen sampeyan ora ngerti apa dependensi, aku bakal nerangake. Ketergantungan minangka arsip JAR kanthi kode sing disambungake menyang proyek nggunakake sistem mbangun otomatis (Maven, Gradle, Ant) kanggo nggunakake maneh solusi wong liya. Contone, Project Lombok , kang ngasilake getter, setter, etc kanggo kita ing runtime. Aplikasi gedhe bisa duwe akeh lan akeh dependensi. Sawetara iku transitif (yaiku, saben dependensi bisa duwe dependensi dhewe, lan liya-liyane). Akibaté, panyerang saya tambah akeh perhatian marang dependensi open-source, amarga asring digunakake lan akeh klien bisa ngalami masalah. Penting kanggo mesthekake yen ora ana kerentanan sing dikenal ing kabeh wit dependensi (ya, katon kaya wit). Ana sawetara cara kanggo nindakake iki.

Gunakake Snyk kanggo ngawasi dependensi

Snyk mriksa kabeh dependensi proyek lan tandha kerentanan sing dikenal. Sampeyan bisa ndhaptar ing Snyk lan ngimpor proyek liwat GitHub. Keamanan ing Jawa: praktik paling apik - 3Uga, kaya sing bisa dideleng saka gambar ing ndhuwur, yen kerentanan diatasi ing versi sing luwih anyar, Snyk bakal menehi perbaikan lan nggawe panjaluk tarik. Sampeyan bisa nggunakake gratis kanggo proyek sumber terbuka. Proyek dipindai kanthi interval reguler, contone seminggu sepisan, sasi sepisan. Aku ndhaptar lan nambah kabeh repositori umum menyang scan Snyk (ora ana sing mbebayani, amarga wis umum kanggo kabeh wong). Snyk banjur nuduhake asil scan: Keamanan ing Jawa: praktik paling apik - 4Lan sawise sawetara wektu, Snyk-bot nyiapake sawetara panjalukan narik ing proyek ngendi dependensi kudu dianyari: Keamanan ing Jawa: praktik paling apik - 5Lan uga:Keamanan ing Jawa: praktik paling apik - 6Iki minangka alat sing apik kanggo nemokake kerentanan lan ngawasi nganyari kanggo versi anyar.

Gunakake Lab Keamanan GitHub

Sapa wae sing makarya ing GitHub bisa njupuk kauntungan saka piranti sing dibangun. Sampeyan bisa maca liyane babagan pendekatan iki ing postingan blog kanthi judhul Ngumumake Lab Keamanan GitHub . Alat iki, mesthi, luwih gampang tinimbang Snyk, nanging sampeyan ora kudu nglirwakake. Apa maneh, jumlah kerentanan sing dikenal mung bakal tuwuh, mula Snyk lan Lab Keamanan GitHub bakal terus berkembang lan nambah.

Aktifake Sonatype DepShield

Yen sampeyan nggunakake GitHub kanggo nyimpen repositori, sampeyan bisa nambah Sonatype DepShield, salah sawijining aplikasi ing MarketPlace, menyang proyek sampeyan. Uga bisa digunakake kanggo mindhai proyek kanggo dependensi. Kajaba iku, yen nemokake apa wae, Masalah GitHub bakal digawe kanthi katrangan sing cocog kaya ing ngisor iki:Keamanan ing Jawa: praktik paling apik - 7

4. Nangani data rahasia kanthi ati-ati

Kita bisa uga nggunakake tembung "data sensitif". Bocor informasi pribadhi pelanggan, nomer kertu kredit, lan informasi sensitif liyane bisa nyebabake cilaka sing ora bisa didandani. Kaping pisanan, priksa desain aplikasi sampeyan lan temtokake yen sampeyan pancene butuh data iki utawa kasebut. Mbok menawa sampeyan ora butuh sawetara data sing sampeyan duwe - data sing ditambahake kanggo masa depan sing durung teka lan ora bakal teka. Kajaba iku, sampeyan akeh sing ora sengaja bocor data kasebut liwat logging. Cara sing gampang kanggo nyegah data sensitif mlebu log sampeyan yaiku nggosok metode toString() saka entitas domain (kayata Panganggo, Siswa, Guru, lsp.). Iki bakal nyegah sampeyan ora sengaja ngetokake lapangan rahasia. Yen sampeyan nggunakake Lombok kanggo ngasilake toString()cara, sampeyan bisa nggunakake @ToString.Exclude anotasi kanggo nyegah lapangan saka digunakake ing output saka toString () cara. Uga, ati-ati banget nalika ngirim data menyang jagad njaba. Contone, kita duwe titik pungkasan HTTP sing nuduhake jeneng kabeh pangguna. Ora perlu nuduhake ID internal unik pangguna. Kenging punapa? Amarga panyerang bisa nggunakake aplikasi kasebut kanggo njupuk informasi liyane sing luwih sensitif babagan pangguna. Contone, yen sampeyan nggunakake Jackson kanggo serialize / deserialize POJO menyang / saka JSON , sampeyan bisa nggunakake @JsonIgnore lan @JsonIgnorePropertiesanotasi kanggo nyegah serialisasi / deserialisasi lapangan tartamtu. Umumé, sampeyan kudu nggunakake kelas POJO beda ing macem-macem panggonan. Apa tegese?
  1. Nalika nggarap database, gunakake siji jinis POJO (entitas).
  2. Nalika nggarap logika bisnis, ngowahi entitas dadi model.
  3. Nalika nggarap jagad njaba lan ngirim panjalukan HTTP, gunakake entitas sing beda (DTO).
Kanthi cara iki sampeyan bisa nemtokake kanthi jelas lapangan sing bakal katon saka njaba lan sing ora bakal katon.

Gunakake algoritma enkripsi lan hashing sing kuat

Data rahasia pelanggan kudu disimpen kanthi aman. Kanggo nindakake iki, kita kudu nggunakake enkripsi. Gumantung ing tugas, sampeyan kudu mutusake jinis enkripsi sing bakal digunakake. Kajaba iku, enkripsi sing luwih kuat mbutuhake wektu luwih akeh, mula maneh sampeyan kudu nimbang sepira kabutuhan kanggo mbenerake wektu sing ditindakake. Mesthi, sampeyan bisa nulis algoritma enkripsi dhewe. Nanging iki ora perlu. Sampeyan bisa nggunakake solusi sing ana ing wilayah iki. Contone, Google Tink :
<!-- https://mvnrepository.com/artifact/com.google.crypto.tink/tink -->
<dependency>
   <groupid>com.google.crypto.tink</groupid>
   <artifactid>tink</artifactid>
   <version>1.3.0</version>
</dependency>
Ayo ndeleng apa sing kudu ditindakake, nggunakake conto iki sing nglibatake enkripsi lan dekripsi:
private static void encryptDecryptExample() {
   AeadConfig.register();
   KeysetHandle handle = KeysetHandle.generateNew(AeadKeyTemplates.AES128_CTR_HMAC_SHA256);

   String plaintext = "Elvis lives!";
   String aad = "Buddy Holly";

   Aead aead = handle.getPrimitive(Aead.class);
   byte[] encrypted = aead.encrypt(plaintext.getBytes(), aad.getBytes());
   String encryptedString = Base64.getEncoder().encodeToString(encrypted);
   System.out.println(encryptedString);

   byte[] decrypted = aead.decrypt(Base64.getDecoder().decode(encrypted), aad.getBytes());
   System.out.println(new String(decrypted));
}

Enkripsi sandhi

Kanggo tugas iki, paling aman nggunakake enkripsi asimetris. Kenging punapa? Amarga aplikasi kasebut ora mbutuhake dekripsi sandhi. Iki minangka pendekatan standar. Ing kasunyatan, nalika pangguna ngetik sandhi, sistem enkripsi lan mbandhingake karo apa sing ana ing toko sandi. Proses enkripsi padha dileksanakake, supaya kita bisa nyana sing padha bakal cocog, yen sandi bener wis ngetik, mesthi :) BCrypt lan SCrypt cocok kene. Loro-lorone minangka fungsi siji arah (hash kriptografi) kanthi algoritma komputasi sing rumit sing mbutuhake wektu suwe. Iki persis sing kita butuhake, amarga komputasi langsung bakal selawase (uga, suwe, suwe). Spring Security ndhukung macem-macem algoritma. Kita bisa nggunakake SCryptPasswordEncoder lan BCryptPasswordEncoder. Apa sing saiki dianggep minangka algoritma enkripsi sing kuwat bisa uga dianggep lemah ing taun ngarep. Akibaté, kita nyimpulake yen kita kudu rutin mriksa algoritma sing digunakake lan, yen perlu, nganyari perpustakaan sing ngemot algoritma enkripsi.

Tinimbang kesimpulan

Dina iki kita ngomong babagan keamanan lan, mesthi, akeh perkara sing ditinggalake. Aku mung mbukak lawang kanggo donya anyar kanggo sampeyan, donya sing wis urip dhewe. Keamanan iku kaya politik: yen sampeyan ora sibuk karo politik, politik bakal sibuk karo sampeyan. Aku tradisional suggest sampeyan tindakake kula ing akun GitHub . Ing kana aku ngirim kreasiku sing nglibatake macem-macem teknologi sing daksinaoni lan ditrapake ing karya.

pranala migunani

  1. Guru99: Tutorial Injeksi SQL
  2. Oracle: Java Security Resource Center
  3. Oracle: Pedoman Coding Aman kanggo Java SE
  4. Baeldung: Dasar Keamanan Jawa
  5. Sedheng: 10 tips kanggo nguatake keamanan Java
  6. Snyk: 10 praktik paling apik keamanan Java
  7. GitHub: Ngumumake Lab Keamanan GitHub: ngamanake kode donya, bebarengan
Komentar
  • Popular
  • Anyar
  • lawas
Sampeyan kudu mlebu kanggo ninggalake komentar
Kaca iki durung duwe komentar