7. 🔒 Аюулгүй байдлын удирдамж
7.1 Аюулгүй байдлын тойм
HONGIKINGAN CMS нь олон төрлийн аюулгүй байдлын заналхийлэлээс системийг хамгаалах олон төрлийн аюулгүй байдлын функцийг үзүүлдэг. Энэ бүлэгт HONGIKINGAN CMS-ийн одоо хэрэгжүүлсэн аюулгүй байдлын функц болон нэмж дэмжих боломжтой функц, мөн хөгжүүлэлтийн үед дагаж мөрдөх аюулгүй байдлын удирдамжийг тайлбарлана.
7.1.1 Аюулгүй байдлын архитектур
HONGIKINGAN CMS-ийн аюулгүй байдлын архитектур нь дараах давхаргаас бүрдэнэ:
Одоо хэрэгжүүлсэн аюулгүй байдлын функц
- HTTP аюулгүй байдлын толгой тохиргоо
- XSS хамгаалалт шүүлтүүр
- Үндсэн шифрлэлт/тайлалт (AES, SHA-256)
- Хувийн мэдээлэл хандалтын түүх удирдлага
- Сэшн удирдлага
- Оролтын утга шалгах утилит (HumanValidatorUtil)
Дэмжих боломжтой аюулгүй байдлын функц
- Spring Security суурьтай баталгаажуулалт
- Үүрэг суурьтай хандалт хяналт (RBAC)
- CSRF хамгаалалт
- Дээд түвшний шифрлэлт арга (BCrypt, PBKDF2)
- Bean Validation-аар дамжуулан оролтын утга шалгах
Аюулгүй байдлын хүрээ
- Баталгаажуулалт болон эрх удирдлага
- Өгөгдөл аюулгүй байдал
- Аппликейшн аюулгүй байдал
- Логгинг болон аудит
7.2 Одоо хэрэгжүүлсэн аюулгүй байдлын функц
7.2.1 XSS (Cross-Site Scripting) хамгаалалт
HONGIKINGAN CMS нь XSS халдлагаас хамгаалах шүүлтүүр үзүүлдэг. Энэ шүүлтүүр нь хэрэглэгчийн оролтын утгаас хортой скриптийг устгаж XSS халдлагаас хамгаалдаг.
Үндсэн функц
- HTML таг шүүлтүүр
- Хэрэглэгчийн оролтын утга шалгах
- Гаралтын утга escape боловсруулалт
XSSWebFilter.java - бодитоор хэрэгжүүлсэн код
public class XSSWebFilter implements Filter {
// ...
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// ...
if (isRequestCheck) {
// Параметрт тусгай тэмдэгт агуулагдсан үед устгах
chain.doFilter(new HTMLTagFilterRequestWrapper(req), response);
} else {
chain.doFilter(request, response);
}
// ...
}
}
Бодитоор хэрэгжүүлсэн XSS шүүлтүүр тохиргоо
<filter>
<filter-name>XSSWebFilter</filter-name>
<filter-class>humanframe.web.filter.XSSWebFilter</filter-class>
<async-supported>true</async-supported>
</filter>
<filter-mapping>
<filter-name>XSSWebFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
7.2.2 Шифрлэлт/тайлалт
HONGIKINGAN CMS нь үндсэн шифрлэлт/тайлалт функцийг үзүүлдэг. Энэ функц нь хувийн мэдээлэл болон нууц үг зэрэг мэдрэмтгий мэдээллийг хамгаалахад ашиглагддаг.
Үндсэн функц
- ARIA шифрлэлт/тайлалт
- SHA-256 суурьтай нууц үг шифрлэлт
- AES-256 шифрлэлт/тайлалт (HumanAES256Util)
- Тохиргоо суурьтай шифрлэлт түлхүүр удирдлага
HumanCryptoServiceImpl.java - бодитоор хэрэгжүүлсэн код
@Service("humanCryptoService")
public class HumanCryptoServiceImpl extends HumanAbstractServiceImpl implements HumanCryptoService {
@Resource(name="propertiesService")
private EgovPropertyService properties;
@Resource(name="ARIACryptoService")
private EgovCryptoService cryptoService;
@Resource(name="passwordEncoder")
public EgovPasswordEncoder egovPasswordEncoder;
@Override
public String encrypt(String str) throws Exception {
byte[] encrypted = cryptoService.encrypt(str.getBytes("UTF-8"), properties.getString("CRYPTO_KEY"));
String encryptStr = new String(Base64.encodeBase64(encrypted));
return encryptStr;
}
@Override
public String decrypt(String str) throws Exception {
byte[] decrypted = cryptoService.decrypt(Base64.decodeBase64(str.getBytes()), properties.getString("CRYPTO_KEY"));
return new String(decrypted, "UTF-8");
}
/**
* Нууц үгийг шифрлэх функц (тайлагдах ёсгүй тул SHA-256 кодчилолын арга хэрэглэх)
*/
@Override
public String encryptPassword(String password, String id) throws Exception {
if (password == null) {
return "";
}
byte[] hashValue = null; // хэш утга
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.reset();
md.update(id.getBytes());
hashValue = md.digest(password.getBytes());
return new String(Base64.encodeBase64(hashValue));
}
}
7.2.3 Хувийн мэдээлэл хандалтын түүх удирдлага
HONGIKINGAN CMS нь хувийн мэдээлэл хандалтын түүхийг удирдах функцийг үзүүлдэг. Энэ функц нь хувийн мэдээлэл хамгаалах хуулийг дагаж мөрдөхөд чухал юм.
Үндсэн функц
- Хувийн мэдээлэл хандалтын түүх бүртгэх
- Цэс тус бүрийн хувийн мэдээлэл хандалтын эсэх тохируулах
- Хандалтын төрөл бүрээр логлох (харах, засах, устгах гэх мэт)
AdminPrivacyAspect.java - бодитоор хэрэгжүүлсэн код
@Aspect
@Order(2)
@Component
public class AdminPrivacyAspect {
@Resource(name = "mngPrivacyService")
private MngPrivacyService mngPrivacyService;
// Админ эрх шалгах
@Pointcut("execution(* humanframe.backoffice..Admin*Controller.form(..))"
+ "|| execution(* humanframe.backoffice..Admin*Controller.list(..))"
+ "|| execution(* humanframe.backoffice..Admin*Controller.view(..))"
+ "|| execution(* humanframe.backoffice..Admin*Controller.action(..))"
+ "|| execution(* humanframe.web.controller.admin..Admin*Controller.list(..))"
+ "|| execution(* humanframe.web.controller.admin..Admin*Controller.view(..))"
+ "|| execution(* humanframe.web.controller.admin..Admin*Controller.form(..))"
+ "|| execution(* humanframe.web.controller.admin..Admin*Controller.action(..))")
private void checkAdminPrivacy() {}
@Before(value = "checkAdminPrivacy()")
private void beforeCheckAdminPrivacy(JoinPoint joinPoint) throws Exception {
HttpServletRequest request = null;
for (Object o : joinPoint.getArgs()) {
if (o instanceof HttpServletRequest)
request = (HttpServletRequest)o;
}
if(request != null) {
// Хувийн мэдээлэл хандалтын түүх хадгалах
String logTxt = "IP:" + request.getRemoteAddr() + ", " + className + "." + methodName;
for(MngMenuVO sessMenuVO : mngrSession.getMngMenuList()){
if(sessMenuVO.getMenuUrl().contains(request.getServletPath().substring(0,request.getServletPath().lastIndexOf("/")))){
if(sessMenuVO.getPrivacyAt().equals("Y")) {
mngPrivacyService.createMngPriacyAccess(logTy, request.getServletPath(), logTxt);
}
}
}
}
}
}
7.2.4 HTTP аюулгүй байдлын толгой тохиргоо
HONGIKINGAN CMS нь HTTP аюулгүй байдлын толгойгоор дамжуулан үндсэн веб аюулгүй байдлыг сайжруулдаг.
Үндсэн функц
- Күүки аюулгүй байдлын тохиргоо (HttpOnly)
- Хязгаарлагдсан HTTP аргын тохиргоо
- Сэшн удирдлага
Бодитоор хэрэгжүүлсэн HTTP аюулгүй байдлын тохиргоо
<session-config>
<session-timeout>60</session-timeout>
<cookie-config>
<http-only>true</http-only> <!-- Серверийн хүсэлт байх үед л күүки дамжуулагдах тохиргоо -->
<!-- <secure>true</secure> --> <!-- SSL харилцааны суваг холбогдох үед л күүки илгээх тохиргоо -->
</cookie-config>
<tracking-mode>COOKIE</tracking-mode>
</session-config>
<security-constraint>
<display-name></display-name>
<web-resource-collection>
<web-resource-name>хязгаарлагдсан аргууд</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>TRACE</http-method>
<http-method>DELETE</http-method>
<http-method>PUT</http-method>
<http-method>HEAD</http-method>
<http-method>OPTIONS</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>nobody</role-name>
</auth-constraint>
</security-constraint>
7.2.5 Оролтын утга шалгах утилит
HONGIKINGAN CMS нь humanframe.core сангаар дамжуулан төрөл бүрийн оролтын утга шалгах утилитийг үзүүлдэг.
Үндсэн функц
- Имэйл, URL хэлбэр шалгах
- Тоо, үсэг, монгол үсэг зэрэг тэмдэгтийн төрөл шалгах
- Нууц үгийн нарийн төвөгтэй байдал шалгах
- Мөрийн урт шалгах
HumanValidatorUtil.java - бодит кодын хэсэг
public class HumanValidatorUtil {
// Тогтмол илэрхийлэлийн загвар
final static private String pattern_alpha = "^[A-Za-z]*$";
final static private String pattern_numeric = "^[0-9]*$";
final static private String pattern_korean = "^[ㄱ-ㅎ|가-힣]*$";
final static private String pattern_email = "^[-A-Za-z0-9_]+[-A-Za-z0-9_.]*[@]{1}[-A-Za-z0-9_]+[-A-Za-z0-9_.]*[.]{1}[A-Za-z]{2,5}$";
final static private String pattern_url = "^(https?)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]";
final static private String pattern_invalid_password = "^(?=.*?[a-zA-Z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,25}$";
// Имэйл шалгах
public static boolean isEmail(String value) {
return nullChecker(5, value);
}
// URL шалгах
public static boolean isUrl(String value) {
return nullChecker(6, value);
}
// Нууц үгийн нарийн төвөгтэй байдал шалгах
public static boolean isValidPassword(String value){
return nullChecker(10, value);
}
// Үсэг+тоо хослол шалгах
public static boolean isAlphaNumeric(String value) {
if (!nullChecker(value)) {
boolean bReturn = true;
char[] cArr = value.toCharArray();
int alphaLen = 0;
int numericLen = 0;
for (char c : cArr) {
if (isAlpha(String.valueOf(c))) {
alphaLen++;
}
if (isNumeric(String.valueOf(c))) {
numericLen++;
}
}
if ((alphaLen == 0) || (numericLen == 0) || (cArr.length != (alphaLen + numericLen))){
bReturn = false;
}
return bReturn;
} else {
return false;
}
}
}
7.3 Аюулгүй байдлын кодчилолын дүрэм
HONGIKINGAN CMS хөгжүүлэх үед дагаж мөрдөх аюулгүй байдлын кодчилолын дүрэм нь дараах байдалтай.
7.3.1 Алдааны мессеж гаргах мэдээлэл ил болгохоос сэргийлэх
Алдааны мессежид мэдрэмтгий мэдээлэл ил болохгүй байхад анхаарах хэрэгтэй.
Буруу жишээ
try {
// Өгөгдлийн сангийн ажил
} catch (SQLException e) {
e.printStackTrace(); // Алдааны стек трейс ил болгох
return "Өгөгдлийн сангийн алдаа: " + e.getMessage(); // Алдааны мессеж ил болгох
}
Зөв жишээ
try {
// Өгөгдлийн сангийн ажил
} catch (SQLException e) {
logger.error("Өгөгдлийн сангийн алдаа", e); // Логт л бүртгэх
return "Системийн алдаа гарлаа. Админтай холбогдоно уу."; // Ерөнхий алдааны мессеж
}
7.3.2 Алдааны нөхцөл байдлын хариу арга дутагдахаас сэргийлэх
Бүх онцгой нөхцөл байдалд тохирох боловсруулалт шаардлагатай.
Буруу жишээ
public void processData(String data) {
// Онцгой нөхцөл боловсруулалт байхгүй
int value = Integer.parseInt(data); // NumberFormatException гарч болно
// Боловсруулах логик
}
Зөв жишээ
public void processData(String data) {
try {
int value = Integer.parseInt(data);
// Боловсруулах логик
} catch (NumberFormatException e) {
logger.error("Тоо хөрвүүлэх алдаа", e);
throw new BusinessException("Хүчинтэй бус өгөгдөл байна.");
}
}
7.3.3 Тохиромжгүй онцгой нөхцөл боловсруулахаас сэргийлэх
Онцгой нөхцөлийг үл тоомсорлох эсвэл буруу боловсруулахгүй байхад анхаарах хэрэгтэй.
Буруу жишээ
try {
// Файлын ажил
} catch (Exception e) {
// Ямар ч боловсруулалт байхгүй (онцгой нөхцөл үл тоомсорлох)
}
Зөв жишээ
try {
// Файлын ажил
} catch (IOException e) {
logger.error("Файл боловсруулах алдаа", e);
throw new BusinessException("Файл боловсруулах үед алдаа гарлаа.");
}
7.3.4 Тодорхой онцгой нөхцөл боловсруулах
Онцгой нөхцөл боловсруулах үед ерөнхий Exception классаас илүү тодорхой онцгой нөхцөлийн классыг ашиглах хэрэгтэй.
Буруу жишээ
try {
// Файл унших, сүлжээний хүсэлт, өгөгдлийн сангийн асуулга зэрэг олон төрлийн ажил
} catch (Exception e) {
logger.error("Алдаа гарлаа", e);
throw new RuntimeException("Боловсруулах үед алдаа гарлаа.");
}
Зөв жишээ
try {
// Файл унших ажил
} catch (FileNotFoundException e) {
logger.error("Файл олдсонгүй", e);
throw new BusinessException("Хүссэн файлыг олж чадсангүй.");
} catch (IOException e) {
logger.error("Файл унших алдаа", e);
throw new BusinessException("Файл унших үед алдаа гарлаа.");
} catch (SQLException e) {
logger.error("Өгөгдлийн сангийн алдаа", e);
throw new SystemException("Өгөгдлийн сан боловсруулах үед алдаа гарлаа.");
} catch (RuntimeException e) {
logger.error("Ажиллах үеийн алдаа", e);
throw new SystemException("Систем боловсруулах үед алдаа гарлаа.");
}
Тодорхой онцгой нөхцөл боловсруулалтын давуу тал
- Тодорхой алдааны шалтгаан олох: Тодорхой онцгой нөхцөлийн класс ашиглавал алдааны шалтгааныг илүү тодорхой олж болно.
- Тохиромжтой хариу арга боломжтой: Онцгой нөхцөлийн төрлөөр тохиромжтой хариу аргыг сонгож болно.
- Кодын уншигдах чанар сайжрах: Ямар онцгой нөхцөл гарч болохыг тодорхой илэрхийлж кодын уншигдах чанар сайжирна.
- Засвар үйлчилгээний чанар сайжрах: Тодорхой онцгой нөхцөл боловсруулах логикийг засах үед бусад онцгой нөхцөл боловсруулалтад нөлөөлөхгүй.
- Аюулгүй байдал сайжрах: Онцгой нөхцөлийн төрлөөр тохиромжтой алдааны мессеж өгч мэдрэмтгий мэдээлэл ил болохоос сэргийлж болно.
7.3.5 SQL инжекшн сэргийлэх
SQL инжекшн халдлагаас сэргийлэх кодчилолын дүрмийг дагаж мөрдөх хэрэгтэй. HONGIKINGAN CMS нь MyBatis ашиглан SQL асуулгыг удирддаг тул параметр холбох замаар SQL инжекшнээс сэргийлж болно.
Буруу жишээ
public BbsVO selectBbsVulnerable(String bbsNo) {
String sqlId = "bbs.selectBbs";
String dynamicSql = sqlId + "_" + bbsNo; // Аюултай: хэрэглэгчийн оролт SQL ID-д шууд орно
return (BbsVO) selectOne(dynamicSql);
}
Зөв жишээ (MyBatis маппинг ашиглах)
public BbsVO selectBbs(int bbsNo) {
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("bbsNo", bbsNo);
return (BbsVO) selectOne("bbs.selectBbs", paramMap);
}
<select id="bbs.selectBbs" parameterType="java.util.Map" resultType="humanframe.web.vo.BbsVO">
SELECT
bbs_no,
title,
content,
reg_dt
FROM
tn_bbs
WHERE
bbs_no = #{bbsNo}
</select>
7.3.6 Кодчилолын конвенци дагаж мөрдөх
Тогтвортой кодчилолын хэв маягийг хадгалахын тулд кодчилолын конвенцийг дагаж мөрдөх хэрэгтэй.
Үндсэн дүрэм
- Класс, метод, хувьсагч зэрэг нэрлэх дүрэм дагаж мөрдөх
- Догол мөр болон хоосон зай ашиглах дүрэм дагаж мөрдөх
- Тайлбар бичих дүрэм дагаж мөрдөх
- Багцын бүтцийн дүрэм дагаж мөрдөх
7.4 Аюулгүй байдлын сул тал шалгах болон удирдах
7.4.1 Аюулгүй байдлын сул тал шалгах зүйлс
Дараах аюулгүй байдлын сул тал шалгах зүйлсийг тогтмол шалгах нь зүйтэй:
🔐 Баталгаажуулалт болон эрх удирдлага
- Баталгаажуулалт тойрч гарах сул тал
- Эрх шалгах дутагдал
- Сэшн удирдлагын сул тал
✅ Оролтын утга шалгах
- XSS сул тал
- SQL инжекшн сул тал
- Тушаал инжекшн сул тал
📤 Гаралтын утга боловсруулах
- Мэдрэмтгий мэдээлэл ил болгох
- Алдааны мессеж ил болгох
📁 Файл боловсруулах
- Зам өөрчлөх сул тал
- Файл оруулах сул тал
🔒 Шифрлэлт
- Сул шифрлэлтийн алгоритм ашиглах
- Шифрлэлтийн түлхүүр удирдлагын сул тал
7.4.2 Аюулгүй байдлын засвар болон шинэчлэлт
HONGIKINGAN CMS-ийн аюулгүй байдлыг хадгалахын тулд тогтмол аюулгүй байдлын засвар болон шинэчлэлт шаардлагатай.
Засвар хэрэглэх журам
🔍 Аюулгүй байдлын сул тал шалгах
Системд нөлөөлж болох аюулгүй байдлын сул тал шалгах
📋 Засварын агуулга хянах
Засварын агуулга болон нөлөөллийн хүрээг хянах
🧪 Туршилтын орчинд хэрэглэх
Туршилтын орчинд засвар хэрэглэж турших
🚀 Үйл ажиллагааны орчинд хэрэглэх
Үйл ажиллагааны орчинд засвар хэрэглэх
📊 Үр дүн хянах
Засвар хэрэглэсний үр дүнг хянах
Хамаарлын сангийн удирдлага
📋 Сангийн жагсаалт удирдах
Хамаарлын сангийн жагсаалт удирдах
🔍 Сул талын мэдээлэл хянах
Аюулгүй байдлын сул талын мэдээлэл хянах
🔄 Сан шинэчлэх
Сул тал олдсон санг шинэчлэх
🧪 Нийцтэй байдлын тест
Шинэчлэсний дараа нийцтэй байдлын тест
7.5 Дүгнэлт
HONGIKINGAN CMS нь үндсэн аюулгүй байдлын функцийг үзүүлдэг бөгөөд хөгжүүлэгч шаардлагын дагуу нэмэлт аюулгүй байдлын функцийг хэрэгжүүлж болно. Одоо хэрэгжүүлсэн функцэд XSS хамгаалалт шүүлтүүр, шифрлэлт/тайлалт, хувийн мэдээлэл хандалтын түүх удирдлага, HTTP аюулгүй байдлын толгой тохиргоо, оролтын утга шалгах утилит зэрэг байгаа бөгөөд эдгээрээр дамжуулан үндсэн аюулгүй байдлын шаардлагыг хангаж болно.
Нэмэлт аюулгүй байдал сайжруулах шаардлагатай бол Spring Security суурьтай баталгаажуулалт, үүрэг суурьтай хандалт хяналт, CSRF хамгаалалт, дээд түвшний шифрлэлт арга зэрэг хэрэгжүүлж болно. Эдгээр функцүүдийг humanframe.core санг өргөтгөж хэрэгжүүлэх эсвэл гадны санг ашиглан хэрэгжүүлж болно.
Чухал зүйл
Аюулгүй байдал нь тасралтгүй удирдлага болон сайжруулалт шаардлагатай салбар тул тогтмол аюулгүй байдлын шалгалт болон шинэчлэлтээр дамжуулан системийн аюулгүй байдлыг хадгалах нь чухал юм. Хөгжүүлэгч энэ гарын авлагад өгсөн аюулгүй байдлын кодчилолын дүрмийг дагаж мөрдөж, шаардлагын дагуу нэмэлт аюулгүй байдлын функцийг хэрэгжүүлж HONGIKINGAN CMS-ийн аюулгүй байдлыг сайжруулж болно.