HTTP 요청 객체 및 로컬 요청 처리
-
05-07-2019 - |
문제
CDO 메시지 개체를 사용하여 보고서를 이메일로 보내는 웹 응용 프로그램이 있습니다.
예를 들어:
Dim objCDO
Set objCDO = Server.CreateObject("CDO.Message")
objCDO.CreateMHTMLBody "http://server/report.asp"
문제는 IIS에 요청할 때 로그인한 사용자의 ASP 세션 ID를 상속하지 않는다는 것입니다.콘텐츠에 대한 액세스를 허용하기 전에 요청을 인증하는 데 사용되는 세션 변수가 비어 있습니다.이로 인해 인증이 어려워지고 다음과 같이 쿼리 문자열 변수를 추가해야 합니다(보시다시피 이 요청에 양식 변수를 추가할 수 없기 때문입니다).
objCDO.CreateMHTMLBody "http://server/report.asp?userid=xx&password=xx"
요청이 로컬 컴퓨터에서 왔는지 확인하기 위해 보고서에 인증 방법이 반드시 있어야 합니다.메일러 스크립트에 CDO 개체가 포함되어 인증이 필요하지 않습니까?
해결책
그냥 하지 마세요!이러한 이유들로:-
- 서버에 다시 두 번째 요청을 하면 현재 스레드가 차단되고, 요청이 너무 많으면 애플리케이션이 교착 상태에 빠지게 됩니다.
CreateHTMLBody
내부에서는 WinINET http 스택을 사용하여 요청을 수행합니다.이 스택은 클라이언트 대화형 시나리오에서 사용하기 위한 것입니다.서버 시나리오에서는 스레드로부터 안전하지 않습니다.- 모든 세션 컨텍스트를 잃어버리면 (당신이 발견한 대로) 무언가를 더 어렵게 하거나 덜 안전하게 만들 수 있습니다.또한 원하지 않는 세션이 많이 생성될 수 있습니다.
그것이 사실이기는 하지만 CreateHTMLBody
매우 편리할 수 있으며 부풀어 오른 이메일을 만들 수도 있습니다.서버 상황에서는 이런 유혹적인 방법을 사용하기보다는 코드로 이메일을 작성해야 합니다.
편집하다
Jimbo는 CreateHTMLBody보다 더 일반적인 시나리오를 염두에 두고 있는 것 같습니다.일반적인 시나리오는 소비자가 제어할 수 없는 구성 요소가 ASP 페이지(이를 "클라이언트 페이지"로 지정)에서 사용하고 다른 ASP 페이지(아마도 WinINET을 통해)에 후속 요청을 하는 것입니다(우리는 이를 "클라이언트 페이지"로 지정함). 이를 "서비스 페이지"로 지정합니다)."클라이언트 페이지"가 구성 요소 사용에 대해 제어할 수 있는 유일한 것은 제공된 URL뿐이라는 가정이 있습니다.
위에 설명된 문제를 피하거나 완화하기 위한 몇 가지 접근 방식은 다음과 같습니다.
잠금 문제 처리: "클라이언트 페이지"와 "서비스 페이지"를 다른 ASP 응용 프로그램에 배치하면 잠금 문제를 피할 수 있습니다.내 제안은 "클라이언트 페이지"를 나머지 응용 프로그램과 다른 응용 프로그램에 배치하고 이 새 응용 프로그램을 기본 응용 프로그램의 하위 폴더에 두는 것입니다.
WinINET 문제 처리: 새 응용 프로그램을 자체 응용 프로그램 풀에 배치합니다.안전하지 않은 방식으로 WinINET을 사용하면 문제가 발생하더라도 기본 응용 프로그램 프로세스에는 영향을 미치지 않습니다.실제로 이를 자체 프로세스에 배치하면 이러한 문제를 피하는 데 도움이 될 수 있습니다.(여기서는 보장할 수 없지만 WinINET 문제를 완전히 피할 수 있는 최선의 방법입니다).
보안 제어: "클라이언트 페이지"의 요청만 수락하도록 "서비스 페이지"를 구성합니다.이를 수행하는 방법은 여러 가지가 있을 수 있지만 가장 간단한 방법은 IP 기반 보안을 활성화하는 것입니다. "서비스 페이지"에 대한 요청은 특정 IP 또는 최소한 제한된 IP 주소 집합에서만 이루어져야 합니다.
인증 처리: 기본 애플리케이션 로그온 중에 고유한 값이 포함된 휘발성 쿠키를 만듭니다."클라이언트 페이지"는 브라우저에 의해 기본 애플리케이션의 하위 폴더로 인식되므로 이 쿠키를 받게 됩니다."클라이언트 페이지"는 이 쿠키를 사용하여 요청의 신뢰성을 확인하거나 구성 요소를 사용할 때 URL에 전달할 수 있습니다.
많은 세션 생성 억제: "서비스 페이지" 통화를 요청하세요. Session.Abandon
작업이 완료되기 전에.