2010-01-13 5 views
0

C/CGI 응용 프로그램이 있습니다. 이 전에 같은 페이지C/CGI에서 처리 후 URL이 변경됨

const char * redirect_page_format = 
"<html>\n" 
"<head>\n" 
"<meta http-equiv=\"REFRESH\"\n" 
"content=\"0;url=%s\">\n" 
"</head>\n" 
"</html>\n"; 
printf (redirect_page_format, getenv (URL)); 

로 리디렉션하기 위해 URL은 "http://ipaddress/page.html"와 같다.

일부 페이지의 경우 올바르게 리디렉션 할 수 있습니다.

  1. URL이 같은 캐릭터가 추가되어 하나 그러나 일부 HTML 페이지

    이 "http://ipaddress/page.htmlP"

  2. 또는 URL은 다음 중 하나 같이 변경됩니다 :

http://ipaddress/page.hX

편집하는 것은 1

나는 쿼리 문자열을 통해 URL을 보낼 것입니다. 명령을 사용하면됩니다.

의 GetEnv 쿼리 문자열을 구문 분석하여 ("QUERY_STRING")

는 URL을 가지고 할 수 있으며이 명령을 재 인수로 제공됩니다.

printf (redirect_page_format, getenv (URL));

+0

환경 변수'URL'이 항상 정의되어 있습니까? 그 안에'''을 포함 할 수 있습니까? # # 을 포함 했습니까? –

답변

0

나는 위의 코드에서 그 원인이되는 것을 볼 수 없습니다. 스크립트에서 어딘가에 다른 방법으로 포인터를 쓰는 것과 같은 소리가 변수 문자열의 끝을 손상시키는 데이터를 작성했을 수 있습니까?

어쨌든 getenv(URL)은 무엇입니까? 현재 URL을 제공하는 표준 CGI 환경 변수가 없습니다. REQUEST_METHOD/HTTP_HOST/SERVER_PORT/SCRIPT_NAME/PATH_INFO/QUERY_STRING에서 함께 정리해야합니다. Apache에서는 REQUEST_URI를 얻지 만 다른 서버에서는 작동하지 않습니다. 당신이 어떤 HTML 이스케이프, 그래서 어떤 &, " 또는 < 문자가없는 : 위가 것처럼 일반적으로 인용 문제가 발생하지 않을 동안

가있는 HTML 컨텍스트에 printfing 텍스트에 문제가 URL에 잘못된 결과가 표시됩니다. 문자열에서 텍스트 또는 속성 값 내용을 추가 할 때마다 HTML에서 이스케이프 처리해야하거나 크로스 사이트 스크립팅 보안 홀의 위험이 있습니다. ("<이 URL에 존재하지 않을 수 있습니다하지만 당신은 SCRIPT_NAME을 처리하는 방법에 따라이 얻을 수/PATH_INFO. &는 URL에 표시 할 가능성이 높다.)

마지막으로, 리디렉션에 대한 <meta refresh>은 매우 바람직하지 않다. 적절한 Location 기반 리디렉션이 아닌 이유는 무엇입니까?