HTTP 요청 형식
1) 요청 정보: 예: "Get /index.php HTTP/1.1", 요청 index.php 파일
2) 헤더: 예: "호스트: localhost", 서버 주소
3) 빈 줄
4) 정보 텍스트
"요청 정보"와 "헤더" 모두 줄바꿈 문자( CRLF) 마지막에 빈 줄에는 개행 문자만 포함될 수 있으며 다른 공백은 포함될 수 없습니다.
다음 예에서는 www.yhsafe.com 서버에 HTTP 요청을 보냅니다
GET /index.php HTTP/1.1↙ //정보 요청
Host:www. yhsafe.com ↙ //Header
↙ //빈줄
↙
↙ 기호는 Enter 키를 나타냅니다. HTTP 요청을 보내려면 HTTP 요청 헤더 중 Host 헤더만 필요하고 나머지 HTTP 헤더는 HTTP 요청의 내용에 따라 결정됩니다.
HTTP 요청 방식
1) GET: 응답 요청
2) HEAD: GET과 동일한 응답, 응답 헤더만 필요
3) POST: 처리를 위해 서버로 데이터를 보냅니다. 해당 데이터는 HTTP 메시지 본문에 포함됩니다.
4) PUT: 파일 업로드
5) DELETE: 파일 삭제
6) TRACE: 수신된 요청 추적
7) OPTIONS: 서버가 지원하는 HTTP 요청 방법 반환
8) CONNECT: HTTP 요청 연결을 투명한 TCP /IP로 변환 채널
HTTP 응답 형식
서버는 클라이언트의 HTTP 요청을 처리한 후 다음과 같은 응답을 보냅니다.
1) 첫 번째 줄은 상태 코드입니다
2) 두 번째 줄은 기타 정보로 시작합니다.
상태 코드에는 상태를 식별하는 숫자와 상태를 나타내는 단어가 포함됩니다. 상태를 설명합니다. 예:
HTTP/1.1 200 OK
200은 상태를 식별하는 숫자이고 OK는 상태를 설명하는 단어입니다. 이 상태 코드는 요청이 성공했음을 나타냅니다.
HTTP 요청 및 응답의 예
cmd를 열고 telnet을 입력하고 open www.00aq.com을 입력합니다. 80
연결을 열고
GET을 입력합니다. /index .php HTTP/1.1↙
호스트:www.00aq.com↙
↙
↙
HTTP 응답 헤더 반환
홈페이지 콘텐츠 반환
PHP를 사용하여 HTTP 요청 전송
헤더 기능을 사용하여 HTTP 전송 가능 요청 및 응답 헤더
함수 프로토타입
void header(string string [, bool replacement [, int http_response_code]])
string은 HTTP 헤더의 문자열입니다
replace가 TRUE이면 이전의 유사한 헤더를 현재 헤더로 대체한다는 의미이고, 대체가 FALSE이면 여러 개의 유사한 헤더를 사용한다는 의미입니다. 기본값은 TRUE
http_response_code에 사용됩니다. http_response_code 값을 사용하도록 HTTP 응답 코드
예:
// 인터넷 소켓 연결 열기
$fp = fsockopen(www.00aq.com, 80); > // HTTP 요청 헤더 작성
fputs($fp, "GET / HTTP/1.1rn")
fputs($fp, "Host: www.00aq.comrnrn")
HTTP response string
$http_response = "";
while (!feof($fp))
{
// 256비트 HTTP 응답 문자열 읽기
$http_response. fp, );
}
// 인터넷 소켓 연결 종료
fclose($fp)
// HTTP 응답 정보 표시
echo nl2br(htmlentities($http_response) ; 대상 사용자는 요청을 사용하여 두 개의 응답을 생성합니다. 전자의 응답은 서버의 응답이고 후자는 공격자가 설계한 응답입니다. 이 공격은 웹 프로그램이 사용자 데이터를 HTTP 응답 헤더에 배치하고 이러한 사용자 데이터는 공격자가 신중하게 설계했기 때문에 발생합니다.
HTTP 요청 응답 분할로 인해 발생할 수 있는 기능은 다음과 같습니다.
setcookie(); setrawcookie();
header("위치: " . $_GET['page'])
?>요청
GET /location.php? page=http://www.00aq.com HTTP/1.1↙
호스트: localhost↙
↙
날짜: 2010년 1월 13일 수요일 03:44:24 GMT
서버: Apache/2.2.8(Win32) PHP/5.2.6
X-Powered-By: PHP /5.2.6
위치: http://www.00aq.com
콘텐츠 길이: 0
Keep-Alive: 시간 제한=5, 최대=100
연결: Keep-Alive
Content-Type: text/html
아래 링크에 접속하면 로그인 창이 바로 나타납니다
http:// localhost/location.php?page=%0d%0aContent-Type:%20text/html%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%20158% 0d%0a%0d%0aAccount%20Password%20
은 읽을 수 있는 문자열로 변환됩니다.
Content-Type: text/html
HTTP/1.1 200 OK
콘텐츠 유형: text/html
콘텐츠 길이: 158
계정
비밀번호
HTTP 요청이 두 개의 응답을 생성했습니다
예방 방법:
1) CRLF 개행 문자 교체
header("Location: " . strtr($_GET[' page'], array ("r"=>"", "n"=>"")));
?>
2) 최신 버전을 사용하세요. PHP
최신 버전의 PHP에서는 더 이상 HTTP 헤더에 개행 문자가 허용되지 않습니다
HTTP 응답 헤더 숨기기
httpd. apache의 conf, 옵션 ServerTokens = Prod, ServerSignature = Off
php의 php.ini, 옵션 hide_php = Off
위는 PHP 취약점(8)-HTTP에 대한 완전한 솔루션입니다. 분할 내용에 대해 더 많은 관련 내용을 보려면 PHP 중국어 웹사이트(m.sbmmt.com)를 주목하세요!