웹 보안
SQL Injection - 방어 실습(1), 입력값 검증
갬쿠
2022. 12. 22. 03:52
이전 글들에서 SQL Injection에 취약한 웹 사이트를 만들고 공격해 봤다. 이제 SQL Injection에 대한 방어 코드를 작성해 보려고 한다.
첫 번째로 사용자의 입력값에 대한 검증이다. JavaScript를 이용해 특수문자나 sql 예약어를 입력했을 경우 form 제출을 막아 DB에 쿼리가 전달되지 않도록 했다.
const checkSearchKeyword = () => {
let keyword = document.getElementById("search_input").value;
if (keyword.length > 0) {
//특수문자 제거
let expText = /[%=*><]/;
if (expText.test(keyword)) {
alert("[No SQL Injection] 특수문자를 입력 할 수 없습니다.");
keyword = keyword.split(expText).join("");
return false;
}
//특정문자열(sql예약어의 앞뒤공백포함) 제거
let sqlArray = new Array(
//sql 예약어
"OR",
"SELECT",
"INSERT",
"DELETE",
"UPDATE",
"CREATE",
"DROP",
"EXEC",
"UNION",
"FETCH",
"DECLARE",
"TRUNCATE"
);
let regex;
for (let i = 0; i < sqlArray.length; i++) {
regex = new RegExp(sqlArray[i], "gi");
if (regex.test(keyword)) {
alert('[No SQL Injection] "' + sqlArray[i] + '"와(과) 같은 특정문자열로 검색할 수 없습니다.');
keyword = keyword.replace(regex, "");
return false;
}
}
}
return true;
};
게시판 페이지의 검색 form에
<form method="get" onSubmit="return checkSearchKeyword()">
위와 같이 사용자의 입력을 검증하는 함수를 적용한다. 주의할 점은 form 태그의 onSubmit에 필터링 함수를 걸어주지 않고 검색 버튼에 onClick 이벤트로 추가할 경우 경고 알림은 뜨지만 쿼리는 DB로 전달되어 여전히 공격이 가능하다는 점이다. 아예 form 제출을 막기 위해서는 위와 같이 처리해 주어야 한다.
입력값 검증 함수를 적용한 후에는 위와 같이 SQL Injection을 위한 악의적인 입력값을 필터링해 DB에 전달되지 않도록 할 수 있다.
728x90