입력란 SQL Injection 방어하기 코드
웹페이지 상에서 입력란에 소스코드와 SQL문을 입력하여 공격하는 방법을 SQL 인젝션 공격이라고 합니다. 코드 인젝션의 한 기법으로 클라이언트의 입력값을 조작하여 서버의 데이터베이스를 공격할 수 있는 공격방식을 말합니다.
주로 사용자가 입력한 데이터를 제대로 필터링, 이스케이핑하지 못했을 경우에 발생합니다. 공격의 쉬운 난이도에 비해 파괴력이 어마어마하기 때문에 시큐어 코딩을 하는 개발자라면 가장 먼저 배우게 되는 내용입니다. 이러한 injection 계열의 취약점들은 테스트를 통해 발견하기는 힘들지만 스캐닝툴이나 코드 검증절차를 거치면 보통 쉽게 발견되기 때문에 탐지하기는 쉬운 편으로 OWASP에서도 수년 동안 인젝션 기법이 보안 위협 1순위로 분류되는 만큼 보안에 각별한 주의가 필요하다고 합니다.
하여 JavaScript 를 통해서 간단하게 막아보는 코드를 작성해 봅시다.
function checkSearchedWord(obj) {
if (obj.length > 0) {
//특수문자 제거
var expText = /[%=><]/;
if (expText.test(obj) == true) {
alert("특수문자를 입력 할수 없습니다.");
obj.value = obj.value.split(expText).join("");
return false;
}
//특정문자열(sql예약어의 앞뒤공백포함) 제거
var sqlArray = new Array(
//sql 예약어
"OR", "SELECT", "INSERT", "DELETE", "UPDATE", "CREATE", "DROP", "EXEC",
"UNION", "FETCH", "DECLARE", "TRUNCATE"
);
var regex;
for (var i = 0; i < sqlArray.length; i++) {
regex = new RegExp(sqlArray[i], "gi");
if (regex.test(obj)) {
alert("\"" + sqlArray[i] + "\"와(과) 같은 특정문자로 검색할 수 없습니다.");
obj = obj.replace(regex, "");
return false;
}
}
}
return true;
}
위와 같은 코드로 SQL 인젝션 공격을 어느정도 방어 할 수 있습니다. 이 외에 설명으로는 나무위키에 자세한 설명이 나와 있습니다.
https://namu.wiki/w/SQL%20injection