JavaRush /Блоги Java /Random-TG /Амният дар Java: таҷрибаҳои беҳтарин
Roman Beekeeper
Сатҳи

Амният дар Java: таҷрибаҳои беҳтарин

Дар гурӯҳ нашр шудааст
Дар барномаҳои server, яке аз муҳимтарин нишондиҳандаҳо амният аст. Ин яке аз намудҳои Талаботҳои ғайрифунксионалӣ мебошад . Амният дар Java: таҷрибаҳои беҳтарин - 1Амният ҷузъҳои зиёде дорад. Албатта, барои пурра фаро гирифтани ҳамаи он принсипҳо ва амалҳои муҳофизатии маълум, шумо бояд зиёда аз як мақола нависед, аз ин рӯ биёед ба муҳимтаринаш тамаркуз кунем. Шахсе, ки дар ин мавзӯъ хуб огоҳ аст, қодир аст, ки тамоми равандҳоро танзим кунад ва боварӣ ҳосил кунад, ки онҳо сӯрохиҳои нави амниятӣ эҷод намекунанд, дар ҳама гуна даста лозим аст. Албатта, шумо набояд фикр кунед, ки агар шумо ин амалҳоро риоя кунед, барнома комилан бехатар хоҳад буд. Не! Аммо бо онҳо бешубҳа бехатартар хоҳад буд. Бирав.

1. Амниятро дар сатҳи забони Java таъмин кунед

Пеш аз ҳама, амният дар Java аз сатҳи хусусиятҳои забон оғоз мешавад. Ин аст, ки мо чӣ кор мекардем, агар тағирдиҳандаҳои дастрасӣ намебуданд?... Анархия, камтар нест. Забони барномасозӣ ба мо кӯмак мекунад, ки codeи бехатарро нависем ва инчунин аз бисёр хусусиятҳои бехатарӣ бартарӣ диҳем:
  1. Навиштани қавӣ. Java забони ба таври статикӣ чопшуда мебошад, ки қобorяти муайян кардани хатогиҳои навъиро дар вақти кор таъмин мекунад.
  2. Тағирдиҳандаҳои дастрасӣ. Ба шарофати онҳо, мо метавонем дастрасӣ ба синфҳо, усулҳо ва майдонҳои синфро тавре танзим кунем, ки ба мо лозим аст.
  3. Идоракунии худкори хотира. Бо ин мақсад, мо (Javaists;)) Ҷамъоварии партовҳо дорем, ки шуморо аз конфигуратсияи дастӣ озод мекунад. Бале, баъзан мушкилот ба миён меоянд.
  4. Санҷиши bytecode: Java ба bytecode тартиб медиҳад, ки пеш аз ба кор андохтани он аз рӯи вақти кор тафтиш карда мешавад .
Дар байни чизҳои дигар, тавсияҳои Oracle оид ба амният мавҷуданд . Албатта, он бо услуби баланд навишта нашудааст ва шумо метавонед ҳангоми хондани он якчанд маротиба хоб равед, аммо ин меарзад. Ҳуҷҷати махсусан муҳим дастури рамзгузории бехатар барои Java SE мебошад , ки маслиҳатҳоро оид ба навиштани рамзи бехатар медиҳад. Ин ҳуҷҷат бисёр маълумоти муфидро дар бар мегирад. Агар имконпазир бошад, он бешубҳа сазовори хондан аст. Барои ҷалби таваҷҷӯҳ ба ин мавод, инҳоянд чанд маслиҳатҳои ҷолиб:
  1. Аз сериализатсияи синфҳои ҳассос худдорӣ кунед. Дар ин ҳолат, шумо метавонед интерфейси синфро аз файли сериализатсияшуда ба даст оред, на аз маълумоте, ки сериализатсия карда мешавад.
  2. Кӯшиш кунед, ки аз синфҳои маълумотҳои тағирёбанда канорагирӣ кунед. Ин ҳама бартариҳои синфҳои тағирнашавандаро медиҳад (масалан, бехатарии ришта). Агар an objectи тағирёбанда мавҷуд бошад, ин метавонад ба рафтори ғайричашмдошт оварда расонад.
  3. Нусхаҳои an objectҳои тағирёбандаи баргардонидашударо эҷод кунед. Агар метод истинодро ба an objectи тағирёбандаи дохилӣ баргардонад, он гоҳ рамзи муштарӣ метавонад ҳолати дохorи an objectро тағир диҳад.
  4. Ва ғайра…
Дар маҷмӯъ, Роҳнамои рамзгузории бехатар барои Java SE маҷмӯи маслиҳатҳо ва ҳилаҳоро дар бораи дуруст ва бехатар навиштани code дар Java дар бар мегирад.

2. Бартараф кардани осебпазирии тазриқи SQL

осебпазирии беназир. Беҳамтоии он дар он аст, ки он ҳам яке аз маъруфтарин ва ҳам яке аз осебпазирии маъмултарин аст. Агар шумо ба масъалаи амният таваҷҷӯҳ надошта бошед, пас шумо дар ин бора намедонед. Инъекцияи SQL чист? Ин ҳамла ба пойгоҳи додаҳо тавассути ворид кардани рамзи иловагии SQL мебошад, ки дар он ҷо интизор нест. Фарз мекунем, ки мо усуле дорем, ки барои пурсиши пойгоҳи додаҳо баъзе параметрҳоро мегирад. Масалан, номи корбар. Рамзи осебпазирӣ чунин хоҳад буд:
// Метод достает из базы данных всех пользователей с определенным именем
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) {
   //переводит в коллекцию юзеров
}
Дар ин мисол, дархости sql пешакӣ дар сатри алоҳида омода карда шудааст. Чунин ба назар мерасад, ки мушкилот дар чист, дуруст? Шояд мушкилот дар он аст, ки истифодаи он беҳтар аст String.format? Не? Пас чӣ? Биёед худро ба ҷои озмоишгар гузорем ва дар бораи он фикр кунем, ки дар арзиш чӣ гуфтан мумкин аст firstName. Барои намуна:
  1. Шумо метавонед он чизеро, ки интизор аст, гузаред - номи корбар. Он гоҳ пойгоҳи додаҳо ҳамаи корбаронро бо ин ном бармегардонад.
  2. Шумо метавонед як сатри холӣ гузаред: пас ҳамаи корбарон баргардонида мешаванд.
  3. Ё шумо метавонед инҳоро гузаронед: “''; ИСТИФОДАБАРАНДАГОНИ ЦАДВАЛРО ДОРЕД;». Ва дар ин ҷо мушкилоти калонтар хоҳанд буд. Ин дархост ҷадвалро аз базаи маълумот хориҷ мекунад. Бо тамоми маълумот. ХАМА.
Оё шумо тасаввур карда метавонед, ки ин чӣ гуна мушкилотро ба вуҷуд оварда метавонад? Пас шумо метавонед ҳар чизе ки мехоҳед нависед. Шумо метавонед номи ҳамаи корбаронро тағир диҳед, шумо метавонед суроғаҳои онҳоро нест кунед. Доираи саботаж васеъ аст. Барои пешгирӣ кардани ин, шумо бояд воридкунии дархости тайёрро қатъ кунед ва ба ҷои он бо истифода аз параметрҳо созед. Ин бояд ягона роҳи пурсиши базаи маълумот бошад. Бо ин роҳ шумо метавонед ин осебпазириро бартараф кунед. Мисол:
// Метод достает из базы данных всех пользователей с определенным именем
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) {
   //переводим в коллекцию юзеров
}
Бо ин роҳ, ин осебпазирӣ пешгирӣ карда мешавад. Барои онҳое, ки мехоҳанд ба ин мақола амиқтар ғарқ шаванд, ин як мисоли олист . Чӣ тавр шумо медонед, ки оё ин қисматро мефаҳмед? Агар шӯхӣ дар зер равшан шуда бошад, пас ин нишонаи дақиқи он аст, ки моҳияти осебпазирӣ равшан аст: D Амният дар Java: таҷрибаҳои беҳтарин - 2

3. Вобастагиҳоро скан кунед ва навсозӣ кунед

Ин чӣ маъно дорад? Барои онҳое, ки вобастагӣ чӣ будани онро намедонанд, ман мефаҳмонам: ин як бойгонии кӯза бо codeест, ки ба лоиҳа бо истифода аз системаҳои сохтани худкор (Maven, Gradle, Ant) пайваст карда шудааст, то ҳалли ягон каси дигарро дубора истифода кунад. Масалан, Лоиҳаи Ломбок , ки дар вақти корӣ барои мо гетерҳо, сеттерҳо ва ғайра тавлид мекунад. Ва агар дар бораи замимаҳои калон сухан ронем, онҳо вобастагии зиёди гуногунро истифода мебаранд. Баъзеҳо гузаранда мебошанд (яъне ҳар як вобастагӣ метавонад вобастагии худро дошта бошад ва ғайра). Аз ин рӯ, ҳамлагарон ба вобастагӣ аз сарчашмаҳои кушода бештар таваҷҷӯҳ зоҳир мекунанд, зеро онҳо мунтазам истифода мешаванд ва метавонанд барои бисёре аз муштариён мушкилот эҷод кунанд. Боварӣ ҳосил кардан муҳим аст, ки дар тамоми дарахти вобастагӣ осебпазирии маълум вуҷуд надорад (ки маҳз ҳамон чизест, ки он ба назар мерасад). Ва якчанд роҳҳо барои ин кор вуҷуд доранд.

Барои мониторинг Snyk-ро истифода баред

Воситаи Snyk ҳама вобастагии лоиҳаро тафтиш мекунад ва осебпазириҳои маълумро нишон медиҳад. Дар он ҷо шумо метавонед лоиҳаҳои худро тавассути GitHub сабти ном кунед ва ворид кунед, масалан. Амният дар Java: таҷрибаҳои беҳтарин - 3Инчунин, тавре ки шумо аз расми боло мебинед, агар versionи навтар ҳалли ин осебпазириро дошта бошад, Snyk пешниҳод мекунад, ки ин корро кунад ва як Pull-Request эҷод кунад. Он метавонад барои лоиҳаҳои кушодаасос ройгон истифода шавад. Лоиҳаҳо дар баъзе басомадҳо скан карда мешаванд: як маротиба дар як ҳафта, як маротиба дар як моҳ. Ман сабти ном кардам ва ҳамаи анборҳои ҷамъиятии худро ба сканери Snyk илова кардам (дар ин ҳеҷ чизи хатарнок нест: онҳо аллакай барои ҳама кушодаанд). Баъдан, Snyk натиҷаи сканро нишон дод: Амният дар Java: таҷрибаҳои беҳтарин - 4Ва пас аз чанде, Snyk-bot дар лоиҳаҳое, ки вобастагӣ бояд нав карда шаванд, якчанд Pull-Request-ро омода кард: Амният дар Java: таҷрибаҳои беҳтарин - 5Ва ин ҷо дигар аст: Амният дар Java: таҷрибаҳои беҳтарин - 6Ҳамин тавр, ин як воситаи олӣ барои ҷустуҷӯи осебпазирӣ ва мониторинги навсозӣ аст. versionҳои нав.

GitHub Security Lab-ро истифода баред

Онҳое, ки дар GitHub кор мекунанд, инчунин метавонанд аз асбобҳои дарунсохташон истифода баранд. Шумо метавонед бештар дар бораи ин равиш дар тарҷумаи ман аз блоги онҳо Эълони GitHub Security Lab хонед . Ин асбоб, албатта, нисбат ба Snyk соддатар аст, аммо шумо бешубҳа набояд онро сарфи назар кунед. Илова бар ин, шумораи осебпазириҳои маълум танҳо афзоиш хоҳад ёфт, аз ин рӯ ҳам Snyk ва ҳам GitHub Security Lab васеъ ва такмил меёбанд.

Sonatype DepShield -ро фаъол созед

Агар шумо GitHub-ро барои нигоҳ доштани анбори худ истифода баред, шумо метавонед яке аз барномаҳоро ба лоиҳаҳои худ аз MarketPlace - Sonatype DepShield илова кунед. Бо ёрии он, шумо инчунин метавонед лоиҳаҳоро барои вобастагӣ скан кунед. Ғайр аз он, агар он чизе пайдо кунад, GitHub Issue бо тавсифи мувофиқ сохта мешавад, тавре ки дар зер нишон дода шудааст: Амният дар Java: таҷрибаҳои беҳтарин - 7

4. Маълумоти ҳассосро бо эҳтиёт кор кунед

Амният дар Java: таҷрибаҳои беҳтарин - 8Дар суханронии англисӣ ибораи "маълумоти ҳассос" бештар маъмул аст. Фош кардани маълумоти шахсӣ, рақамҳои корти кредитӣ ва дигар маълумоти шахсии муштарӣ метавонад зарари ҷуброннопазир расонад. Пеш аз ҳама, шумо бояд тарҳи барномаро бодиққат аз назар гузаронед ва муайян кунед, ки оё ягон маълумот воқеан лозим аст. Шояд ба баъзеи онҳо эҳтиёҷ надошта бошад, аммо онҳо барои ояндае, ки наомадааст ва ба гумон аст, илова карда шудаанд. Илова бар ин, ҳангоми бақайдгирии лоиҳа, чунин маълумот метавонад ифшо шавад. Роҳи оддии пешгирии воридшавии маълумоти ҳассос ба гузоришҳои шумо ин тоза кардани усулҳои toString()an objectҳои домен (ба монанди корбар, донишҷӯ, муаллим ва ғайра) мебошад. Ин аз чопи тасодуфии майдонҳои ҳассос пешгирӣ мекунад. Агар шумо Lombok-ро барои тавлиди усул истифода баред toString(), шумо метавонед эзоҳро истифода баред @ToString.Exclude, то аз истифодаи майдон дар баромад тавассути метод пешгирӣ кунад toString(). Инчунин, ҳангоми мубодилаи маълумот бо ҷаҳони беруна хеле эҳтиёт бошед. Масалан, нуқтаи ниҳоии http мавҷуд аст, ки номи ҳамаи корбаронро нишон медиҳад. Ҳоҷат ба нишон додани ID ягонаи дохorи корбар нест. Чаро? Азбаски бо истифода аз он ҳамлакунанда метавонад маълумоти дигари махфӣтарро дар бораи ҳар як корбар ба даст орад. Масалан, агар шумо Ҷексонро барои сериализатсия ва ғайрисериализатсияи POJO-ҳо ба JSON истифода баред , шумо метавонед @JsonIgnoreва эзоҳҳоро истифода баред @JsonIgnoreProperties, то аз сериализатсия ва ғайрисериализатсияи майдонҳои мушаххас пешгирӣ кунед. Умуман, шумо бояд синфҳои гуногуни POJO-ро барои ҷойҳои гуногун истифода баред. Ин чӣ маъно дорад?
  1. Барои кор бо пойгоҳи додаҳо, танҳо POJO - Entity -ро истифода баред.
  2. Барои кор бо мантиқи тиҷорат, Entity-ро ба модел интиқол диҳед.
  3. Барои кор бо ҷаҳони беруна ва ирсоли http дархостҳо, шахсони сеюм - DTO -ро истифода баред.
Бо ин роҳ шумо метавонед ба таври возеҳ муайян кунед, ки кадом майдонҳо аз берун намоён мешаванд ва кадомаш не.

Алгоритмҳои рамзгузорӣ ва ҳашингҳои қавӣ истифода баред

Маълумоти махфии муштарӣ бояд бехатар нигоҳ дошта шавад. Барои ин ба шумо лозим аст, ки рамзгузорӣ истифода баред. Вобаста аз вазифа, шумо бояд муайян кунед, ки кадом намуди рамзгузориро истифода баред. Ғайр аз он, рамзгузории қавитар вақти бештарро талаб мекунад, аз ин рӯ шумо бояд бори дигар фикр кунед, ки то чӣ андоза эҳтиёҷ ба он вақти сарфшударо асоснок мекунад. Албатта, шумо метавонед алгоритмро худатон нависед. Аммо ин нолозим аст. Шумо метавонед аз қарорҳои мавҷуда дар ин соҳа истифода баред. Масалан, 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>
Биёед бубинем, ки чӣ тавр онро истифода бурдан мумкин аст, бо истифода аз мисоли рамзгузории як ва дигар:
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));
}

Рамзгузории парол

Барои ин вазифа истифода бурдани рамзгузории асимметрӣ бехатартар аст. Чаро? Зеро ба барнома воқеан лозим нест, ки паролҳоро баргардонад. Ин усули умумӣ аст. Дар асл, вақте ки корбар паролро ворид мекунад, система онро рамзгузорӣ мекунад ва бо он чизе, ки дар анбори парол мавҷуд аст, муқоиса мекунад. Рамзгузорӣ бо ҳамон восита анҷом дода мешавад, бинобар ин шумо метавонед интизор шавед, ки онҳо мувофиқат мекунанд (агар шумо пароли дурустро ворид кунед;), албатта). BCrypt ва SCrypt барои ин мақсад мувофиқанд. Ҳарду функсияҳои якҷониба (хэшҳои криптографӣ) бо алгоритмҳои аз ҷиҳати ҳисоббарорӣ мураккаб мебошанд, ки вақти зиёдро талаб мекунанд. Ин маҳз он чизест, ки ба шумо лозим аст, зеро рамзкушоии он то абад мегирад. Масалан, Spring Security як қатор алгоритмҳоро дастгирӣ мекунад. SCryptPasswordEncoderШумо инчунин метавонед истифода баред BCryptPasswordEncoder. Чӣ алгоритми рамзгузории қавӣ ҳоло метавонад соли оянда заиф бошад. Дар натиҷа, мо ба хулосае омадем, ки алгоритмҳои истифодашударо тафтиш кардан ва китобхонаҳоро бо алгоритмҳо нав кардан лозим аст.

Ба чои баромад

Имрӯз мо дар бораи бехатарӣ сӯҳбат кардем ва албатта, бисёр чизҳо паси парда монданд. Ман наваHow дари дунёи навро барои шумо кушодам: ҷаҳоне, ки зиндагии худро дорад. Бо амният он мисли сиёсат аст: агар шумо ба сиёсат машғул нашавед, сиёсат бо шумо машғул мешавад. Одатан, ман пешниҳод мекунам, ки ба ҳисоби Github-и худ обуна шавам . Дар он ҷо ман кори худро дар бораи технологияҳои гуногун, ки ман меомӯзам ва дар ҷои кор татбиқ мекунам, ҷойгир мекунам.

истинодҳои муфид

Бале, қариб ҳама мақолаҳо дар сайт бо забони англисӣ навишта шудаанд. Новобаста аз он ки мо мехоҳем ё не, забони англисӣ забони муоширати барномасозон аст. Ҳама мақолаҳо, китобҳо ва маҷаллаҳои навтарин оид ба барномасозӣ ба забони англисӣ навишта шудаанд. Аз ин рӯ, истинодҳои ман ба тавсияҳо асосан бо забони англисӣ мебошанд:
  1. Habr: Injection SQL барои шурӯъкунандагон
  2. Oracle: Маркази захираҳои амнияти Java
  3. Oracle: Дастурҳои бехатарии рамзгузорӣ барои Java SE
  4. Baeldung: Асосҳои амнияти Java
  5. Миёна: 10 маслиҳат барои пурзӯр кардани амнияти Java
  6. Snyk: 10 таҷрибаи беҳтарини амнияти java
  7. JR: Эълони GitHub Security Lab: муҳофизат кардани ҳама рамзи шумо якҷоя
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION