Дар барномаҳои server, яке аз муҳимтарин нишондиҳандаҳо амният аст. Ин яке аз намудҳои Талаботҳои ғайрифунксионалӣ мебошад . Амният ҷузъҳои зиёде дорад. Албатта, барои пурра фаро гирифтани ҳамаи он принсипҳо ва амалҳои муҳофизатии маълум, шумо бояд зиёда аз як мақола нависед, аз ин рӯ биёед ба муҳимтаринаш тамаркуз кунем. Шахсе, ки дар ин мавзӯъ хуб огоҳ аст, қодир аст, ки тамоми равандҳоро танзим кунад ва боварӣ ҳосил кунад, ки онҳо сӯрохиҳои нави амниятӣ эҷод намекунанд, дар ҳама гуна даста лозим аст. Албатта, шумо набояд фикр кунед, ки агар шумо ин амалҳоро риоя кунед, барнома комилан бехатар хоҳад буд. Не! Аммо бо онҳо бешубҳа бехатартар хоҳад буд. Бирав.
1. Амниятро дар сатҳи забони Java таъмин кунед
Пеш аз ҳама, амният дар Java аз сатҳи хусусиятҳои забон оғоз мешавад. Ин аст, ки мо чӣ кор мекардем, агар тағирдиҳандаҳои дастрасӣ намебуданд?... Анархия, камтар нест. Забони барномасозӣ ба мо кӯмак мекунад, ки codeи бехатарро нависем ва инчунин аз бисёр хусусиятҳои бехатарӣ бартарӣ диҳем:- Навиштани қавӣ. Java забони ба таври статикӣ чопшуда мебошад, ки қобorяти муайян кардани хатогиҳои навъиро дар вақти кор таъмин мекунад.
- Тағирдиҳандаҳои дастрасӣ. Ба шарофати онҳо, мо метавонем дастрасӣ ба синфҳо, усулҳо ва майдонҳои синфро тавре танзим кунем, ки ба мо лозим аст.
- Идоракунии худкори хотира. Бо ин мақсад, мо (Javaists;)) Ҷамъоварии партовҳо дорем, ки шуморо аз конфигуратсияи дастӣ озод мекунад. Бале, баъзан мушкилот ба миён меоянд.
- Санҷиши bytecode: Java ба bytecode тартиб медиҳад, ки пеш аз ба кор андохтани он аз рӯи вақти кор тафтиш карда мешавад .
- Аз сериализатсияи синфҳои ҳассос худдорӣ кунед. Дар ин ҳолат, шумо метавонед интерфейси синфро аз файли сериализатсияшуда ба даст оред, на аз маълумоте, ки сериализатсия карда мешавад.
- Кӯшиш кунед, ки аз синфҳои маълумотҳои тағирёбанда канорагирӣ кунед. Ин ҳама бартариҳои синфҳои тағирнашавандаро медиҳад (масалан, бехатарии ришта). Агар an objectи тағирёбанда мавҷуд бошад, ин метавонад ба рафтори ғайричашмдошт оварда расонад.
- Нусхаҳои an objectҳои тағирёбандаи баргардонидашударо эҷод кунед. Агар метод истинодро ба an objectи тағирёбандаи дохилӣ баргардонад, он гоҳ рамзи муштарӣ метавонад ҳолати дохorи an objectро тағир диҳад.
- Ва ғайра…
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
. Барои намуна:
- Шумо метавонед он чизеро, ки интизор аст, гузаред - номи корбар. Он гоҳ пойгоҳи додаҳо ҳамаи корбаронро бо ин ном бармегардонад.
- Шумо метавонед як сатри холӣ гузаред: пас ҳамаи корбарон баргардонида мешаванд.
- Ё шумо метавонед инҳоро гузаронед: “''; ИСТИФОДАБАРАНДАГОНИ ЦАДВАЛРО ДОРЕД;». Ва дар ин ҷо мушкилоти калонтар хоҳанд буд. Ин дархост ҷадвалро аз базаи маълумот хориҷ мекунад. Бо тамоми маълумот. ХАМА.
// Метод достает из базы данных всех пользователей с определенным именем
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
3. Вобастагиҳоро скан кунед ва навсозӣ кунед
Ин чӣ маъно дорад? Барои онҳое, ки вобастагӣ чӣ будани онро намедонанд, ман мефаҳмонам: ин як бойгонии кӯза бо codeест, ки ба лоиҳа бо истифода аз системаҳои сохтани худкор (Maven, Gradle, Ant) пайваст карда шудааст, то ҳалли ягон каси дигарро дубора истифода кунад. Масалан, Лоиҳаи Ломбок , ки дар вақти корӣ барои мо гетерҳо, сеттерҳо ва ғайра тавлид мекунад. Ва агар дар бораи замимаҳои калон сухан ронем, онҳо вобастагии зиёди гуногунро истифода мебаранд. Баъзеҳо гузаранда мебошанд (яъне ҳар як вобастагӣ метавонад вобастагии худро дошта бошад ва ғайра). Аз ин рӯ, ҳамлагарон ба вобастагӣ аз сарчашмаҳои кушода бештар таваҷҷӯҳ зоҳир мекунанд, зеро онҳо мунтазам истифода мешаванд ва метавонанд барои бисёре аз муштариён мушкилот эҷод кунанд. Боварӣ ҳосил кардан муҳим аст, ки дар тамоми дарахти вобастагӣ осебпазирии маълум вуҷуд надорад (ки маҳз ҳамон чизест, ки он ба назар мерасад). Ва якчанд роҳҳо барои ин кор вуҷуд доранд.Барои мониторинг Snyk-ро истифода баред
Воситаи Snyk ҳама вобастагии лоиҳаро тафтиш мекунад ва осебпазириҳои маълумро нишон медиҳад. Дар он ҷо шумо метавонед лоиҳаҳои худро тавассути GitHub сабти ном кунед ва ворид кунед, масалан. Инчунин, тавре ки шумо аз расми боло мебинед, агар versionи навтар ҳалли ин осебпазириро дошта бошад, Snyk пешниҳод мекунад, ки ин корро кунад ва як Pull-Request эҷод кунад. Он метавонад барои лоиҳаҳои кушодаасос ройгон истифода шавад. Лоиҳаҳо дар баъзе басомадҳо скан карда мешаванд: як маротиба дар як ҳафта, як маротиба дар як моҳ. Ман сабти ном кардам ва ҳамаи анборҳои ҷамъиятии худро ба сканери Snyk илова кардам (дар ин ҳеҷ чизи хатарнок нест: онҳо аллакай барои ҳама кушодаанд). Баъдан, Snyk натиҷаи сканро нишон дод: Ва пас аз чанде, Snyk-bot дар лоиҳаҳое, ки вобастагӣ бояд нав карда шаванд, якчанд Pull-Request-ро омода кард: Ва ин ҷо дигар аст: Ҳамин тавр, ин як воситаи олӣ барои ҷустуҷӯи осебпазирӣ ва мониторинги навсозӣ аст. versionҳои нав.GitHub Security Lab-ро истифода баред
Онҳое, ки дар GitHub кор мекунанд, инчунин метавонанд аз асбобҳои дарунсохташон истифода баранд. Шумо метавонед бештар дар бораи ин равиш дар тарҷумаи ман аз блоги онҳо Эълони GitHub Security Lab хонед . Ин асбоб, албатта, нисбат ба Snyk соддатар аст, аммо шумо бешубҳа набояд онро сарфи назар кунед. Илова бар ин, шумораи осебпазириҳои маълум танҳо афзоиш хоҳад ёфт, аз ин рӯ ҳам Snyk ва ҳам GitHub Security Lab васеъ ва такмил меёбанд.Sonatype DepShield -ро фаъол созед
Агар шумо GitHub-ро барои нигоҳ доштани анбори худ истифода баред, шумо метавонед яке аз барномаҳоро ба лоиҳаҳои худ аз MarketPlace - Sonatype DepShield илова кунед. Бо ёрии он, шумо инчунин метавонед лоиҳаҳоро барои вобастагӣ скан кунед. Ғайр аз он, агар он чизе пайдо кунад, GitHub Issue бо тавсифи мувофиқ сохта мешавад, тавре ки дар зер нишон дода шудааст:4. Маълумоти ҳассосро бо эҳтиёт кор кунед
Дар суханронии англисӣ ибораи "маълумоти ҳассос" бештар маъмул аст. Фош кардани маълумоти шахсӣ, рақамҳои корти кредитӣ ва дигар маълумоти шахсии муштарӣ метавонад зарари ҷуброннопазир расонад. Пеш аз ҳама, шумо бояд тарҳи барномаро бодиққат аз назар гузаронед ва муайян кунед, ки оё ягон маълумот воқеан лозим аст. Шояд ба баъзеи онҳо эҳтиёҷ надошта бошад, аммо онҳо барои ояндае, ки наомадааст ва ба гумон аст, илова карда шудаанд. Илова бар ин, ҳангоми бақайдгирии лоиҳа, чунин маълумот метавонад ифшо шавад. Роҳи оддии пешгирии воридшавии маълумоти ҳассос ба гузоришҳои шумо ин тоза кардани усулҳоиtoString()
an objectҳои домен (ба монанди корбар, донишҷӯ, муаллим ва ғайра) мебошад. Ин аз чопи тасодуфии майдонҳои ҳассос пешгирӣ мекунад. Агар шумо Lombok-ро барои тавлиди усул истифода баред toString()
, шумо метавонед эзоҳро истифода баред @ToString.Exclude
, то аз истифодаи майдон дар баромад тавассути метод пешгирӣ кунад toString()
. Инчунин, ҳангоми мубодилаи маълумот бо ҷаҳони беруна хеле эҳтиёт бошед. Масалан, нуқтаи ниҳоии http мавҷуд аст, ки номи ҳамаи корбаронро нишон медиҳад. Ҳоҷат ба нишон додани ID ягонаи дохorи корбар нест. Чаро? Азбаски бо истифода аз он ҳамлакунанда метавонад маълумоти дигари махфӣтарро дар бораи ҳар як корбар ба даст орад. Масалан, агар шумо Ҷексонро барои сериализатсия ва ғайрисериализатсияи POJO-ҳо ба JSON истифода баред , шумо метавонед @JsonIgnore
ва эзоҳҳоро истифода баред @JsonIgnoreProperties
, то аз сериализатсия ва ғайрисериализатсияи майдонҳои мушаххас пешгирӣ кунед. Умуман, шумо бояд синфҳои гуногуни POJO-ро барои ҷойҳои гуногун истифода баред. Ин чӣ маъно дорад?
- Барои кор бо пойгоҳи додаҳо, танҳо POJO - Entity -ро истифода баред.
- Барои кор бо мантиқи тиҷорат, Entity-ро ба модел интиқол диҳед.
- Барои кор бо ҷаҳони беруна ва ирсоли 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-и худ обуна шавам . Дар он ҷо ман кори худро дар бораи технологияҳои гуногун, ки ман меомӯзам ва дар ҷои кор татбиқ мекунам, ҷойгир мекунам.истинодҳои муфид
Бале, қариб ҳама мақолаҳо дар сайт бо забони англисӣ навишта шудаанд. Новобаста аз он ки мо мехоҳем ё не, забони англисӣ забони муоширати барномасозон аст. Ҳама мақолаҳо, китобҳо ва маҷаллаҳои навтарин оид ба барномасозӣ ба забони англисӣ навишта шудаанд. Аз ин рӯ, истинодҳои ман ба тавсияҳо асосан бо забони англисӣ мебошанд:- Habr: Injection SQL барои шурӯъкунандагон
- Oracle: Маркази захираҳои амнияти Java
- Oracle: Дастурҳои бехатарии рамзгузорӣ барои Java SE
- Baeldung: Асосҳои амнияти Java
- Миёна: 10 маслиҳат барои пурзӯр кардани амнияти Java
- Snyk: 10 таҷрибаи беҳтарини амнияти java
- JR: Эълони GitHub Security Lab: муҳофизат кардани ҳама рамзи шумо якҷоя
GO TO FULL VERSION