JavaRush /Java Blog /Random-TK /Java-da howpsuzlyk: iň oňat tejribe

Java-da howpsuzlyk: iň oňat tejribe

Toparda çap edildi
Serwer programmalarynda iň möhüm görkezijileriň biri howpsuzlykdyr. Bu , işlemeýän talaplaryň görnüşlerinden biridir . Java-da howpsuzlyk: iň oňat tejribe - 1Howpsuzlygyň köp bölekleri bar. Elbetde, belli bolan gorag ýörelgelerini we hereketlerini doly öz içine almak üçin birden köp makala ýazmaly, şonuň üçin iň möhümlerine üns bereliň. Bu mowzugy gowy bilýän adam, ähli amallary gurup biler we täze howpsuzlyk deşiklerini döretmezligini üpjün eder, islendik toparda zerur bolar. Elbetde, bu amallary ýerine ýetirseňiz, programma doly howpsuz bolar diýip pikir etmeli dälsiňiz. ! Ok! Themöne olar bilen has ygtybarly bolar. Bar.

1. Java dili derejesinde howpsuzlygy üpjün ediň

Ilki bilen Java-da howpsuzlyk dil aýratynlygy derejesinde başlaýar. Giriş üýtgedijileri bolmadyk bolsa näme ederdik? ... Anarhiýa, az däl. Programmirleme dili ygtybarly kod ýazmaga we köp sanly aç-açan howpsuzlyk aýratynlyklaryndan peýdalanmaga kömek edýär:
  1. Güýçli ýazmak. Java , statiki görnüşde ýazylan dil, iş wagtynda görnüşdäki ýalňyşlyklary ýüze çykarmak mümkinçiligini berýär.
  2. Üýtgeýjilere giriň. Olaryň kömegi bilen synplara, usullara we synp meýdanlaryna girişi zerur görnüşde düzüp bileris.
  3. Memoryady awtomatiki dolandyrmak. Bu maksat bilen, bizde (Javaists;)) el bilen konfigurasiýadan azat edýän zibil ýygnaýjy bar. Hawa, käwagt problemalar ýüze çykýar.
  4. Baýtkody barlamak: Java bytecode düzýär, ony işletmezden ozal iş wagty bilen barlanýar.
Beýleki zatlaryň arasynda Oracle-dan howpsuzlyk barada teklipler bar . Elbetde, bu "ýokary stilde" ýazylmandyr we ony okaýarka birnäçe gezek uklap bilersiňiz, ýöne muňa mynasyp. Aýratyn möhüm resminama, ygtybarly kod ýazmak barada maslahatlar berýän Java SE üçin Howpsuz kodlaşdyryş görkezmeleri . Bu resminamada köp peýdaly maglumatlar bar. Mümkin bolsa, hökman okamaga mynasyp. Bu material bilen gyzyklanma döretmek üçin, gyzykly maslahatlar:
  1. Howpsuz duýgur synplary seriýalamakdan gaça duruň. Bu ýagdaýda, seriýalaşdyrylan maglumatlary aýtman, seriýalaşdyrylan faýldan synp interfeýsini alyp bilersiňiz.
  2. Üýtgeýän maglumat sapaklaryndan gaça durmaga synanyşyň. Bu üýtgewsiz synplaryň ähli artykmaçlyklaryny berýär (meselem, sapaklaryň howpsuzlygy). Üýtgeýän bir zat bar bolsa, bu garaşylmadyk gylyk-häsiýetlere sebäp bolup biler.
  3. Yza gaýtarylýan üýtgeýän zatlaryň nusgalaryny ediň. Eger bir usul içerki üýtgäp bilýän obýekte salgylanmany yzyna gaýtarsa, müşderi kody obýektiň içki ýagdaýyny üýtgedip biler.
  4. We ş.m.
Umuman aýdanyňda, Java SE üçin Howpsuz kodlaşdyryş görkezmelerinde Java-da kody nädip dogry we ygtybarly ýazmalydygy barada birnäçe maslahatlar bar.

2. SQL sanjym gowşaklygyny ýok ediň

Üýtgeşik gowşaklyk. Özboluşlylygy, iň meşhurlaryň we iň köp ýaýran gowşaklyklaryň biri bolmagydyr. Howpsuzlyk meselesi bilen gyzyklanmaýan bolsaňyz, bu hakda bilmersiňiz. SQL sanjym näme? Bu, garaşylmadyk ýerde goşmaça SQL kody girizip, maglumatlar bazasyna edilen hüjüm. Maglumatlar bazasyny gözlemek üçin käbir parametrleri alýan usulymyz bar diýeliň. Mysal üçin, ulanyjy ady. Gowşaklygy bolan kod şuňa meňzeýär:
// Метод достает из базы данных всех пользователей с определенным именем
public List<User> findByFirstName(String firstName) throws SQLException {
   // Создается связь с базой данных
   Connection connection = DriverManager.getConnection(DB_URL, USER, PASS);

   // Пишем sql request в базу данных с нашим firstName
   String query = "SELECT * FROM USERS WHERE firstName = " + firstName;

   // выполняем request
   Statement statement = connection.createStatement();
   ResultSet result = statement.executeQuery(query);

   // при помощи mapToUsers переводит ResultSet в коллекцию юзеров.
   return mapToUsers(result);
}

private List<User> mapToUsers(ResultSet resultSet) {
   //переводит в коллекцию юзеров
}
Bu mysalda sql soragy aýratyn setirde öňünden taýýarlanýar. Meseläniň nämedigi görünýär, şeýlemi? Belki mesele ulanmak has gowy bolarmyka String.format? ? Ok? Onda näme? Geliň, synagçynyň ýerine goýalyň we bahada nämäni ýetirip boljakdygyny pikirleneliň firstName. Mysal üçin:
  1. Garaşylýan zady - ulanyjy adyny geçip bilersiňiz. Soňra maglumat bazasy ähli ulanyjylary şol at bilen yzyna getirer.
  2. Boş setirden geçip bilersiňiz: şonda ähli ulanyjylar yzyna gaýtarylar.
  3. Ora-da aşakdakylardan geçip bilersiňiz: “''; Jetwel ulanyjylaryny taşlaň; ”. Bu ýerde has uly problemalar bolar. Bu talap tablisany maglumatlar bazasyndan aýyrar. Allhli maglumatlar bilen. HER KIM.
Munuň haýsy problemalara sebäp bolup biljekdigini göz öňüne getirip bilersiňizmi? Soň islän zadyňyzy ýazyp bilersiňiz. Usershli ulanyjylaryň adyny üýtgedip bilersiňiz, salgylaryny pozup bilersiňiz. Päsgelçilik üçin giňişlik giň. Munuň öňüni almak üçin, taýýar soragy sanjymy bes etmeli we ýerine parametrleri ulanyp gurmaly. Maglumatlar bazasyny soramagyň ýeke-täk usuly bolmaly. Şeýlelik bilen bu gowşaklygy ýok edip bilersiňiz. Mysal:
// Метод достает из базы данных всех пользователей с определенным именем
public List<User> findByFirstName(String firstName) throws SQLException {
   // Создается связь с базой данных
   Connection connection = DriverManager.getConnection(DB_URL, USER, PASS);

   // Создаем параметризированный request.
   String query = "SELECT * FROM USERS WHERE firstName = ?";

   // Создаем подготовленный стейтмент с параметризованным requestом
   PreparedStatement statement = connection.prepareStatement(query);

   // Передаем meaning параметра
   statement.setString(1, firstName);

   // выполняем request
   ResultSet result = statement.executeQuery(query);

   // при помощи mapToUsers переводим ResultSet в коллекцию юзеров.
   return mapToUsers(result);
}

private List<User> mapToUsers(ResultSet resultSet) {
   //переводим в коллекцию юзеров
}
Şeýlelik bilen, bu gowşaklykdan gaça durýarlar. Mesele bu makaladan has çuňňur öwrenmek isleýänler üçin ajaýyp mysal . Bu bölüme düşünýändigiňizi nädip bilýärsiňiz? Aşakdaky degişme aýdyň bolsa, bu gowşaklygyň düýp manysynyň aýdyň alamaty: D. Java-da howpsuzlyk: iň oňat tejribe - 2

3. Garaşlyklary skanirläň we täzeläň

Bu näme many berýär? Garaşlylygyň nämedigini bilmeýänler üçin düşündirerin: bu başga biriniň çözgüdini gaýtadan ulanmak üçin awtomatiki gurluşyk ulgamlaryny (Maven, Gradle, Ant) ulanyp, taslama birikdirilen kody bolan arhiw. Mysal üçin, iş wagty bize getterler, sazlaýjylar we ş.m. döredýän “Lombok” taslamasy . Uly programmalar hakda aýtsak, köp dürli baglylyklary ulanýarlar. Käbirleri geçişlidir (ýagny, her garaşlylygyň öz garaşlylygy bolup biler we ş.m.). Şonuň üçin hüjümçiler yzygiderli ulanylýandygy we köp müşderi üçin kynçylyk döredip biljekdigi sebäpli açyk çeşmelere baglylyga has köp üns berýärler. Tutuş garaşlylyk agajynda belli bir gowşaklygyň ýokdugyna göz ýetirmek möhümdir (edil görnüşine meňzeýär). Munuň üçin birnäçe ýol bar.

Gözegçilik üçin Snyk ulanyň

Snyk guraly ähli taslama baglylyklary barlaýar we belli gowşak goralanlyklary görkezýär. Şol ýerde, mysal üçin GitHub arkaly taslamalaryňyzy hasaba alyp we import edip bilersiňiz. Java-da howpsuzlyk: iň oňat tejribe - 3Mundan başga-da, ýokardaky suratdan görnüşi ýaly, täze wersiýada bu gowşaklygy çözmek mümkin bolsa, Snyk muny etmegi we Pull-Talap döretmegi teklip eder. Açyk çeşme taslamalary üçin mugt ulanylyp bilner. Taslamalar käbir ýygylykda skanirlener: hepdede bir gezek, aýda bir gezek. Snyk skanerine ähli açyk ammarlarymy hasaba aldym we goşdum (bu ýerde howply zat ýok: olar eýýäm hemmeler üçin açyk). Ondan soň, Snyk gözlegiň netijesini görkezdi: Java-da howpsuzlyk: iň oňat tejribe - 4Birneme wagt geçensoň, Snyk-bot garaşlylyklaryň täzelenmeli taslamalarynda birnäçe Pull-Talap taýýarlady: Java-da howpsuzlyk: iň oňat tejribe - 5Ine, başga bir zat: Java-da howpsuzlyk: iň oňat tejribe - 6Şonuň üçin gowşak ýerleri gözlemek we täzelenmek üçin gözegçilik etmek üçin ajaýyp gural. täze wersiýalary.

GitHub howpsuzlyk laboratoriýasyny ulanyň

GitHub-da işleýänler, gurlan gurallaryndan peýdalanyp bilerler. Bu çemeleşme hakda has giňişleýin maglumaty GitHub howpsuzlyk laboratoriýasynyň bildirişlerinden alyp bilersiňiz . Bu gural, elbetde, Snykdan has ýönekeý, ýöne hökman äsgermezlik etmeli dälsiňiz. Mundan başga-da, belli gowşak goralanlyklaryň sany diňe köpeler, şonuň üçin Snyk hem, GitHub Howpsuzlyk laboratoriýasy hem giňeler we gowulaşar.

Sonatype DepShield-i işjeňleşdiriň

Ammarlaryňyzy saklamak üçin GitHub-dan peýdalanýan bolsaňyz, “MarketPlace - Sonatype DepShield” -den taslamalaryňyza goşundylardan birini goşup bilersiňiz. Onuň kömegi bilen garaşlylyk üçin taslamalary hem skanirläp bilersiňiz. Mundan başga-da, bir zat tapsa, aşakda görkezilişi ýaly degişli düşündiriş bilen GitHub Issue dörediler: Java-da howpsuzlyk: iň oňat tejribe - 7

4. Duýgur maglumatlary seresaplylyk bilen dolandyryň

Java-da howpsuzlyk: iň oňat tejribe - 8Iňlis dilinde “duýgur maglumatlar” jümlesi has ýygy duş gelýär. Şahsy maglumatlaryň, kredit kartoçkalarynyň belgileriniň we müşderiniň beýleki şahsy maglumatlarynyň aýan edilmegi düzedip bolmajak zyýan getirip biler. Ilki bilen, programma dizaýnyna ýakyndan göz aýlamaly we haýsydyr bir maglumatlaryň hakykatdanam zerurdygyny anyklamaly. Belki, olaryň käbiri üçin zerurlyk ýok, ýöne gelmedik we gelmejek gelejek üçin goşuldy. Mundan başga-da, taslama ýazylanda şeýle maglumatlar syzyp biler. Duýgur maglumatlaryň gündeligiňize girmeginiň öňüni almagyň ýönekeý usuly, toString()domen guramalarynyň (Ulanyjy, Talyp, Mugallym we ş.m.) usullaryny arassalamakdyr. Bu duýgur meýdanlaryň tötänleýin çap edilmeginiň öňüni alar. Bir usul döretmek üçin “Lombok” -dan peýdalanýan bolsaňyz , meýdançanyň usul arkaly çykyşda ulanylmagynyň öňüni almak üçin toString()düşündiriş ulanyp bilersiňiz . Şeýle hem, daşarky dünýä bilen maglumatlary paýlaşanyňyzda gaty seresap boluň. Mysal üçin, ähli ulanyjylaryň atlaryny görkezýän http ahyrky nokady bar. Ulanyjynyň içerki özboluşly şahsyýetini görkezmegiň zerurlygy ýok. Näme üçin? Sebäbi ony ulanýan hüjümçi, her ulanyjy hakda başga, has gizlin maglumatlary alyp biler. Mysal üçin, POJO-lary JSON- a seriallaşdyrmak we deserializasiýa etmek üçin Jekson ulanýan bolsaňyz , belli bir meýdanlaryň seriallaşdyrylmagynyň we deserializasiýa edilmeginiň öňüni almak üçin bellikleri we bellikleri ulanyp bilersiňiz . Umuman, dürli ýerler üçin dürli POJO sapaklaryny ulanmaly. Bu näme many berýär? @ToString.ExcludetoString()@JsonIgnore@JsonIgnoreProperties
  1. Maglumat bazasy bilen işlemek üçin diňe POJO - Entity ulanyň.
  2. Iş logikasy bilen işlemek üçin Entity Model-e geçiriň.
  3. Daşarky dünýä bilen işlemek we http haýyşlaryny ibermek üçin üçünji guramalary - DTO ulanyň.
Şeýlelik bilen haýsy meýdanlaryň daşardan görünjekdigini we haýsysynyň görünmejekdigini anyk kesgitläp bilersiňiz.

Güýçli şifrlemek we ýuwmak algoritmlerini ulanyň

Müşderiniň gizlin maglumatlary ygtybarly saklanmalydyr. Munuň üçin şifrlemäni ulanmaly. Wezipe baglylykda haýsy şifrlemäni ulanmalydygyny çözmeli. Mundan başga-da, has güýçli şifrlemek has köp wagt alýar, şonuň üçin oňa zerurlygyň näçeräk wagt sarp edilendigini göz öňünde tutmaly. Elbetde, algoritmi özüňiz ýazyp bilersiňiz. Emma bu zerur däl. Bu ugurda bar bolan çözgütlerden peýdalanyp bilersiňiz. Mysal üçin, 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>
Bir ýoly we beýlekisini nädip şifrlemelidiginiň mysalyny ulanyp, ony nädip ulanmalydygyny göreliň:
private static void encryptDecryptExample() {
   AeadConfig.register();
   KeysetHandle handle = KeysetHandle.generateNew(AeadKeyTemplates.AES128_CTR_HMAC_SHA256);

   String plaintext = "Цой жив!";
   String aad = "Юрий Клинских";

   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));
}

Parol şifrlemek

Bu mesele üçin asimmetrik şifrlemäni ulanmak iň ygtybarlydyr. Näme üçin? Sebäbi programma hakykatdanam parollary açarlamak zerurlygy ýok. Bu umumy çemeleşme. Aslynda, ulanyjy paroly girizeninde ulgam ony şifrleýär we parol depesindäki zatlar bilen deňeşdirýär. Şifrlemek şol bir serişdeleri ulanmak arkaly amala aşyrylýar, şonuň üçin olaryň gabat gelmegine garaşyp bilersiňiz (dogry paroly girizseňiz;). BCrypt we SCrypt bu maksat üçin amatlydyr. Bularyň ikisi hem köp wagt talap edýän hasaplaýyş çylşyrymly algoritmleri bilen bir taraplaýyn funksiýalar (kriptografiki heşler). Bu size gerek zat, sebäbi başyňy kesgitlemek hemişelik dowam eder. Mysal üçin, Bahar Howpsuzlygy birnäçe algoritmleri goldaýar. SCryptPasswordEncoderŞeýle hem ulanyp bilersiňiz BCryptPasswordEncoder. Güýçli şifrlemek algoritmi näme, indiki ýyl gowşak bolup biler. Netijede, ulanylýan algoritmleri barlamaly we kitaphanalary algoritmler bilen täzelemeli diýen netijä gelýäris.

Çykyşyň ýerine

Bu gün howpsuzlyk barada gürleşdik we elbetde köp zat perdäniň aňyrsynda galdy. Justaňy siziň üçin täze dünýä: öz durmuşyny ýaşaýan dünýä üçin gapy açdym. Howpsuzlyk bilen syýasat bilen deňdir: syýasata goşulmasaň, syýasat saňa goşular. Däp bolşy ýaly, Github hasabyma ýazylmagy maslahat berýärin . Şol ýerde işimi öwrenýän we ulanýan dürli tehnologiýalarymda ýerleşdirýärin.

peýdaly baglanyşyklar

Hawa, sahypadaky makalalaryň hemmesi diýen ýaly iňlis dilinde ýazylan. Islesek-islemesek-de, iňlisler programmistleriň aragatnaşyk saklamagy üçin dil. Programmirlemek boýunça iň täze makalalar, kitaplar we magazinesurnallar iňlis dilinde ýazylýar. Şonuň üçin tekliplere baglanyşyklarym esasan iňlis dilinde:
  1. Habr: Täze başlanlar üçin SQL sanjym
  2. Oracle: Java Howpsuzlyk Resurs Merkezi
  3. Oracle: Java SE üçin ygtybarly kodlaşdyryş görkezmeleri
  4. Baeldung: Java howpsuzlygynyň esaslary
  5. Orta: Java howpsuzlygyňyzy güýçlendirmek üçin 10 maslahat
  6. Snyk: 10 java howpsuzlygy boýunça iň oňat tejribe
  7. JR: GitHub Howpsuzlyk Laboratoriýasynyň bildirişi: ähli koduňyzy bilelikde goramak
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION