재우니의 블로그

 

ASP Classic에서 파라미터화된 쿼리 사용법: 보안성과 효율성 개선

서론

ASP Classic을 사용할 때 SQL 쿼리를 작성할 때 보안에 신경 써야 합니다. 특히 SQL 인젝션 공격을 방지하기 위해 파라미터화된 쿼리를 사용하는 것이 중요합니다. 이 글에서는 파라미터화된 쿼리를 사용하여 SQL 문을 보다 안전하고 오류 없이 작성하는 방법을 단계별로 설명합니다. ASP Classic에서 이 방법을 사용하면 코드를 보다 안전하게 보호할 수 있습니다.

본론

1. 파라미터화된 쿼리란?

파라미터화된 쿼리는 SQL 문에 값을 동적으로 포함시키기 위해 사용되는 매개변수가 포함된 쿼리 방식입니다. 동적으로 문자열을 조합하는 방식에 비해 오류와 보안 취약성이 줄어들어 SQL 인젝션 공격을 효과적으로 방어할 수 있습니다.

2. ASP Classic에서 기본 설정하기

파라미터화된 쿼리를 사용하기 전에 페이지에 UTF-8 인코딩과 ADOVBS.INC 파일을 추가해야 합니다. 이는 코드를 보다 안전하게 작성하고 여러 국가의 문자를 다룰 수 있도록 해줍니다.

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

3. ProtectSQL 함수로 SQL 공격 방어

ProtectSQL 함수는 사용자 입력 값에서 위험한 문자를 제거하여 SQL 인젝션 공격을 방지합니다. 이 함수는 <, >, ' 같은 문자들을 안전한 HTML 엔티티로 바꿔 줍니다.

<%
Function ProtectSQL(SQLString)
    SQLString = Replace(SQLString, "'", "&#39;")
    SQLString = Replace(SQLString, ">", "&gt;")
    SQLString = Replace(SQLString, "<", "&lt;")
    SQLString = Replace(SQLString, "(", "&#40;")
    SQLString = Replace(SQLString, ")", "&#41;")
    SQLString = Replace(SQLString, "&", "&amp;")
    SQLString = Replace(SQLString, "%", "&#37;")
    ProtectSQL = Trim(SQLString)
End Function
%>

4. 텍스트와 정수형 파라미터 사용 예제

다음 코드에서는 ADODB.Command 객체를 사용하여 텍스트와 정수형 데이터의 파라미터를 안전하게 추가하는 방법을 보여줍니다. 이를 통해 데이터베이스에 안전하게 쿼리를 전달할 수 있습니다.

예시: 텍스트 파라미터

<%
Set chEmail = Server.CreateObject("ADODB.Command")
chEmail.ActiveConnection = objConn
chEmail.CommandText = "SELECT cusEmail FROM ordercavecustomer WHERE cusEmail =?"
chEmail.Parameters.Append chEmail.CreateParameter("@cusEmail", adVarChar, adParamInput, 25, loginEmail)
Set rschEmail = chEmail.Execute
%>

예시: 정수형 파라미터

<%
Set chID = Server.CreateObject("ADODB.Command")
chID.ActiveConnection = objConn
chID.CommandText = "SELECT cusEmail FROM ordercavecustomer WHERE myID =?"
chID.Parameters.Append chID.CreateParameter("@myID", adInteger, adParamInput, , myID)
Set rschID = chID.Execute
%>

5. INSERT, UPDATE, DELETE 문에서 파라미터화된 쿼리 사용하기

SQL 삽입, 수정, 삭제 문에서도 파라미터를 사용하여 쿼리를 더욱 안전하게 실행할 수 있습니다. 각 명령문에서 파라미터의 순서를 정확히 지키는 것이 중요합니다.

INSERT 예제

<%
Set chInsert = Server.CreateObject("ADODB.Command")
chInsert.ActiveConnection = objConn
chInsert.CommandText = "INSERT INTO ordercavecustomer (cusEmail, password, myID) VALUES (?, ?, ?)"
chInsert.Parameters.Append chInsert.CreateParameter("@cusEmail", adVarChar, adParamInput, 25, loginEmail)
chInsert.Parameters.Append chInsert.CreateParameter("@password", adVarChar, adParamInput, 25, loginPass)
chInsert.Parameters.Append chInsert.CreateParameter("@myID", adInteger, adParamInput, , myID)
chInsert.Execute
%>

UPDATE 예제

<%
Set chUpdate = Server.CreateObject("ADODB.Command")
chUpdate.ActiveConnection = objConn
chUpdate.CommandText = "UPDATE ordercavecustomer SET cusEmail = ?, password = ? WHERE myID = ?"
chUpdate.Parameters.Append chUpdate.CreateParameter("@cusEmail", adVarChar, adParamInput, 25, loginEmail)
chUpdate.Parameters.Append chUpdate.CreateParameter("@password", adVarChar, adParamInput, 25, loginPass)
chUpdate.Parameters.Append chUpdate.CreateParameter("@myID", adInteger, adParamInput, , myID)
chUpdate.Execute
%>

DELETE 예제

<%
Set chDelete = Server.CreateObject("ADODB.Command")
chDelete.ActiveConnection = objConn
chDelete.CommandText = "DELETE FROM ordercavecustomer WHERE myID = ?"
chDelete.Parameters.Append chDelete.CreateParameter("@myID", adInteger, adParamInput, , myID)
chDelete.Execute
%>

결론

파라미터화된 쿼리를 통해 ASP Classic 환경에서 SQL 인젝션 공격을 방어할 수 있습니다. 보안을 강화하면서도 코드의 유지보수성을 높일 수 있습니다. 이러한 기술은 데이터베이스와의 상호 작용이 많은 웹 애플리케이션에서 필수적입니다. 이제부터 파라미터화된 쿼리를 사용하여 안전하고 신뢰성 있는 코드를 작성해 보세요.

Q&A 섹션

  1. 왜 파라미터화된 쿼리가 중요한가요?
    • 파라미터화된 쿼리는 SQL 인젝션 공격을 방지하여 데이터베이스를 보호하는 데 중요합니다. 또한, 쿼리 작성 시 발생할 수 있는 오류를 줄일 수 있습니다.
  2. ProtectSQL 함수는 꼭 사용해야 하나요?
    • 예, ProtectSQL 함수는 입력된 데이터를 검사하고 안전한 HTML 엔티티로 바꾸어 줍니다. 이를 통해 SQL 공격 가능성을 줄일 수 있습니다.
  3. 다른 프로그래밍 언어에서도 파라미터화된 쿼리를 사용할 수 있나요?
    • 예, SQL 파라미터화는 Java, Python, .NET 등 다양한 언어에서 지원하며, 보안성을 높이는 데 유용합니다.
  4. 쿼리의 파라미터 순서가 중요한가요?
    • 중요합니다. SQL 쿼리에서 파라미터의 순서를 지켜야 데이터가 올바르게 전달됩니다.
  5. ASP Classic에서의 보안 향상 방안은 파라미터화된 쿼리 외에 무엇이 있나요?
    • 입력 검증, XSS 방지, HTTPS 사용 등이 추가적인 보안 향상 방법입니다.

관련 태그

  • asp-classic
  • 파라미터화된-쿼리
  • sql-인젝션-방지
  • 보안-프로그래밍
  • 웹-개발