Dreamweaver를 사용하면 ASP 웹사이트를 개발하는 것이 간단하고 사용하기 쉽습니다. 기능면에서는 초보자도 베테랑이 할 수 있는 일을 완벽하게 만들 수 있습니다. 그럼 초보랑 베테랑 차이가 없나요? 여기서의 차이는 엄청나지만 일반인이 한눈에 보기는 어렵습니다. 인터페이스의 친숙함, 운영 성능 및 웹사이트 보안은 초보자와 숙련된 사용자를 구별하는 세 가지 주요 포인트입니다.
보안 측면에서 초보자가 가장 쉽게 간과하는 문제는 SQL 주입 취약점입니다. NBSI 2.0을 사용하여 인터넷의 일부 ASP 웹사이트를 검사하면 많은 ASP 웹사이트에 SQL 주입 취약점이 있음을 알 수 있습니다.
소위 SQL 인젝션은 프로그래머가 사용자 입력 데이터의 적법성을 느슨하게 감지하거나 감지하지 못하는 등의 설계 허점을 이용하여 의도적으로 클라이언트에서 특수 코드(SQL 명령)를 제출하고 프로그램 및 서버 정보를 수집하는 것입니다. 원하는 정보를 얻기 위한 공격
SQL 주입 공격이 성공하는 주된 이유는 사용자가 입력한 데이터가 검증되지 않고 클라이언트에서 SQL 명령이 동적으로 생성될 수 있기 때문임을 알 수 있습니다.
일반적인 http 요청은 get, post에 불과하므로 모든 post의 매개변수 정보에서 불법 문자를 필터링하거나 프로그램 내 get 요청만 하면 SQL 주입 공격을 방지할 수 있습니다.
아쉽게도 DW에서는 관련 코드를 제공하지 않기 때문에 SQL 인젝션 공격을 방지하려면 수동으로 수정해야 합니다.
다음 프로그램을 SQLinjection.asp로 저장한 뒤, 인젝션을 방지해야 하는 페이지 헤더에서 호출하면 됩니다.
<!--#포함 파일=SQLinjection.asp-->
이렇게 하면 페이지에 삽입이 방지됩니다.
전체 사이트가 기록되는 것을 방지하려면 DW에서 생성한 Connections 디렉터리의 데이터베이스 연결 파일에 헤더 호출을 추가하거나 다음 프로그램 코드를 직접 추가해야 합니다. 콘텐츠를 기다리는 동안 SQL 문이 발견되면 시스템은 이를 SQL 공격으로 착각하여 오류 메시지를 표시합니다.
일반 프로그램 코드(적절하게 변경하여 인터넷에서 인용)는 다음과 같습니다.
<%
'---------정의 부분------
희미한 sql_injdata
SQL_injdata = '|그리고|exec|삽입|선택|삭제
|update|count|*|%|chr|mid|master|truncate|char
|선언|1=1|1=2|;
SQL_inj = 분할(SQL_Injdata,|
'---------POST 부분------
Request.QueryString<>이면
각 SQL_Get In Request.QueryString에 대해
SQL_Data=0인 경우 Ubound(SQL_inj)로
if instr(Request.QueryString(SQL_Get),
Sql_Inj(Sql_DATA))>0 그러면
응답.쓰기 <스크립트 언어=JavaScript>
Alert('시스템에서 메시지가 표시됩니다!/n/n매개변수에 잘못된 문자를 포함하지 말고 삽입해 보세요!/n/n');window.location=&'&index.htm&'&;</Script>
응답.끝
종료하면
다음
다음
종료 조건
'---------부분 가져오기----
Request.Form<> 그렇다면
Request.Form의 각 Sql_Post에 대해
SQL_Data=0인 경우 Ubound(SQL_inj)로
if instr(Request.Form(Sql_Post),Sql_Inj(Sql_DATA))>0 그러면
응답.쓰기 <스크립트 언어=JavaScript>
Alert('시스템에서 메시지가 표시됩니다!/n/n매개변수에 잘못된 문자를 포함하지 말고 삽입해 보세요!/n/n');window.location=&'&index.htm&'&;</Script>
응답.끝
종료하면
다음
다음
종료하면
%>
위 프로그램을 통해 Get 메소드나 Post 메소드에서 제출된 위험한 SQL 주입 문자를 저항하고 침입자에게 경고한 후 index.htm(홈 페이지)으로 리디렉션할 수 있습니다.