Front-End Study/JavaScript

SQL Injection 유효성 검사 코드 만들기

NewBean 2025. 4. 18. 13:53

안녕하세요. 오랜만에 인사 드립니다.

회사에서 진행한 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()

개미 개발 님의 SQL Injection - 방어 실습(1), 입력값 검증

MDN Web Docs의 SQL 인젝션 (SQL Injection)