안녕하세요. 오랜만에 인사 드립니다.
회사에서 진행한 5개월 정도의 프로젝트 작업으로 인해 한동안 블로그 포스팅을 하지 못했네요...
이제 거의 마무리 단계까지 왔기 때문에 회사 프로젝트에서 배웠거나 쓸모있었던 코드 및 CS 정보에 대해 공유드리려고 합니다!
서론은 여기까지 하고 바로 SQL Injection 유효성 검사 코드를 만들어 봅시다!
1. SQL Injection
그전에 SQL Injection이 무엇일까요?
SQL Injection이란? 웹 애플리케이션에서 사용자 입력값을 적절하게 검증하지 않고 SQL 쿼리에 포함시켜 실행할 때 발생하는 보안 취약점을 말해요.
이를 통해 공격자는 원래 의도하지 않은 SQL 명령어를 실행시켜 데이터베이스를 조작하거나 민감한 데이터를 탈취할 수 있습니다..!
2. SQL Injection 유효성 검사
여러 사이트를 이용하다 보면 입력란이 있는 경우가 종종 있어요.
이 입력란에 SQL Injection에 민감한 특수문자 및 쿼리를 입력하지 못하게 방지하는 것입니다.
바로 만들어 보겠습니다.
일단 먼저 SQL Injeciton에 민감한 특수문자 및 쿼리를 변수에 저장해 줍시다.
const sqlInjectionPattern = /(\b(OR|AND|UNION|SELECT|INSERT|UPDATE|DELETE|DROP|EXEC|EXECUTE|LIKE|WAITFOR|SLEEP|BENCHMARK|INFORMATION_SCHEMA|CHAR|ASCII|SUBSTRING|CAST|CONVERT)\b)|['";#\/\*|&%_\\]|--/gi;
sqlInjectionPattern 변수 안에 있는 값들은 무엇을 의미할까요?
그건 바로 다음과 같습니다.
공격 종류 | 값 |
SQL 예약어 기반 공격 | OR, AND, UNION, SELECT, INSERT, UPDATE, DELETE, DROP |
타임 딜레이 / 함수 호출 기반 공격 | WAITFOR, SLEEP, BENCHMARK, INFORMATION_SCHEMA, CHAR, SUBSTRING |
특수문자 / 주석 문자 | ', ", ;, #, /*, --, |, &, %, _, \ |
이젠 이를 tset() 함수를 사용해서 입력란에 해당 값들이 있는 지 확인합니다.
test() 함수는 문자열에 정규식 패턴이 존재하는 지 검사하는 함수에요. 있으면 true, 없으면 false를 반환합니다.
checkSQLInjectoin.js
function checkSQLInjection(value) {
const sqlInjectionPattern = /(\b(OR|AND|UNION|SELECT|INSERT|UPDATE|DELETE|DROP|EXEC|EXECUTE|LIKE|WAITFOR|SLEEP|BENCHMARK|INFORMATION_SCHEMA|CHAR|ASCII|SUBSTRING|CAST|CONVERT)\b)|['";#\/\*]|--/gi;
if (sqlInjectionPattern.test(value)) {
console.log('SQL Injection 위험!')
} else {
console.log('안전한 텍스트 입니다.')
}
}
checkSQLInjection(plainText);
plainText 안에 다음과 같은 값을 입력하고 실행하면 어떻게 될까요?
const plainText = '테스트용 텍스트 입니다.';
그러면 다음과 같은 로그가 나타납니다!
그럼 이번엔 다음과 같은 값을 입력하고 실행해 봅시다.
const plainText = '테스트용 텍스트 (SELECT)입니다.';
그러면 다음과 같은 로그가 나타납니다.
이렇게 SQL Injection을 방지할 수 있겠어요!
3. 정리하며
지금까지 SQL Injection 유효성 검사에 대해 알아보았습니다.
프로젝트의 보안을 강화 시키는 방법은 항상 기억해 두면 좋을 것 같습니다.
감사합니다!
참고
MDN Web Docs의 RegExp.prototype.test()
'Front-End Study > JavaScript' 카테고리의 다른 글
JSON.stringify()와 JSON.parse() (1) | 2024.11.22 |
---|---|
문자열을 카멜 케이스로 변환하기 (0) | 2024.11.15 |
Object.fromEntries() (0) | 2024.11.14 |
URL 파라미터 가져오기 (0) | 2024.10.28 |
함수 선언문(Function Declaration)과 함수 표현식(Function Expression) (1) | 2024.10.22 |