2014-03-29 4 views
0

좋아 모두의 신뢰성, 그래서 여기에 몇 가지 코드를 가지고 : 그래서출구()와 헤더() 시스템 보안을위한 기능

<?php session_start(); 
if (!isset($_SESSION['blah'])) { 
header('Location: foo.php'); exit(); 

} 
?> 

<!DOCTYPE html> 
<html> 
<head> 
<meta charset = 'utf-8' /> 
<title>Check Login</title> 
</head> 
<body> 
// members only content here 
</body> 
</html> 

을, 나는 헤더 또는 출구 문을 사용하여 주위에 절대 안전한 방법을 발견했습니다 리다이렉트의 경우 (if-else 문의 값에 따라 특정 문서를 반향 시킴) 헤더를 사용하는 것은 heredoc의 전체 웹 페이지를 반향하는 것보다 훨씬 깔끔합니다. (나는 또한 추가 보안을 위해 HTTPS를 사용해야 함을 알고있다).

두 가지 질문이 있습니다.

  1. Location 헤더에 대한 브라우저 지원은 얼마나 광범위합니까? 나는 비슷한 질문을 읽음으로써 그것을 독자적으로 사용할 수 없다는 것을 안다. 그러나 어쨌든 나는 신경 쓰지 않을 것이다.

  2. 또한, 시스템 보안을 유지하기 위해 php의 exit() 기능을 얼마나 신뢰할 수 있습니까? 항상 작동합니까, 아니면 보안이 중요 할 때 HEREDOC을 대신 표시해야합니까?

+0

'Location' 헤더는 세계의 모든 * _ 단일 브라우저에서 지원됩니다. 이것은 첫 번째 HTTP 사양의 일부입니다. 그래서 예, 항상 * 작동합니다. '출구'가 안전함에 관해서 ... 당신은 무엇을 의미합니까? 이 시점에서 실행이 중지됩니다 .... 시스템 보안과 관련이 있는지 알 수 없습니까? – Tularis

+0

그래서 exit()가 특정 페이지의 나머지 부분을 보내는 것을 막을 것이라고 생각하고 있습니다. 지금은 출구에 대한 PHP 사양을 찾고있어, 그래서 물건을 잔뜩 취소됩니다. – lexica98

+2

대부분의 (모든?) 브라우저는 여러분의 예제에서와 같이'Location' 헤더의 상대 URI를 지원하지만 HTTP 사양은 절대적이어야한다고 요구합니다. – lafor

답변

1

사실 현재 존재하는 모든 브라우저는 Location을 지원합니다. 그러나 함께 보내는 상태 코드 (세 번째 매개 변수는 header)에주의해야합니다. 선택할 코드에 대한 자세한 내용은 rfc2616 sec10을 참조하십시오. 303은 더 정확하지만 302가 더 잘 지원됩니다.

신뢰성이 얼마나 좋은지 exit()은 실제로 서버의 안정성에 달려 있습니다. PHP 코드가 실행되면 exit()은 항상 실행을 중단하고 그 결과를 브라우저로 보냅니다. 그러나 잘못 구성된 웹 서버가 PHP 코드를 직접 실행하는 대신 노출시킬 수 있습니다. This comment은이 문제를 완화 할 수있는 방법을 설명합니다. 사양을 다음에 관해서는

 

rfc2616 sec10는 말한다 :

요청 방법은 HEAD, 새로운 URI 로의 하이퍼 링크가 표시된 짧은 하이퍼 텍스트 주석을 포함하고 있어야한다 응답의 엔티티 (했다

하지 않는 한 에스).

exit()을 사용하지 않고 대신 die('<a href="foo.php">You are redirected.</a>')을 사용하여 구현할 수 있습니다.