2013-06-12 4 views
0
에서 HEADER()없이

I PHP에 다음 코드를 가지고 :리디렉션 PHP

header ("Location: nopass.php?percent=$percentage&type=$type"); 

양식 페이지 내가 header();

를 사용하여 페이지를 변경하고 있기 때문에 내가 돌아 가면 기본값으로 재설정 라디오 버튼이 있습니다

나는 문제를 해결하는 것입니다 돌아가 자바 스크립트를 사용하여 생각 :

<a href="javascript:history.back();">Go Back</a> 

하지만하지 않았다.

header()에 대한 일시적인 해결책이 있습니까? 헤더를 작성하지 않고 리디렉션 하시겠습니까?

제 양식에 POST 방법을 사용하고 있습니다.

+2

'POST'를 사용하면 이전 요청이 올바르게 삭제됩니다. –

+0

나는 그것을보기위한 테스트 페이지를 만들었지 만, 내가 틀리면 않는 한 그렇지 않습니다. – Si8

+0

예 : http://www.interfaithmedical.com/checksite/testFolder/a.htm (POST 메서드 사용) 모든 라디오 버튼을 채우고 제출을 누른 다음 다음 페이지에서 "돌아 가기"를 누릅니다. 라디오 버튼 상태를 유지합니다. – Si8

답변

1

$ _SESSION 내에 양식 정보를 저장하고 페이지에 양식을 작성할 때이 정보를 확인할 수 있습니다. 초보적인 예제는 다음에 :

form.php :

<?php session_start(); //Start the Session ?> 
<input type="radio" name="radios" value="value1" <?php 
    /* Check if we've been submitted before */ 
    if (isset($_SESSION['last_submit']['radios']) && "value1" == $_SESSION['last_submit']['radios']) { 
     echo "selected"; 
    } 
?> > Value 1 </input> " 
/.. more inputs ../ 

<?php 
session_start(); 
$_SESSION[last_submit] = (!empty($_POST)) ? $_POST : array(); 

분명히 submit.php에서

, 당신은 어떤 XSS에 대해 POST를 필터링 할 양식을 식별하는 것 실수로 다른 양식을 미리 채우지 않고 성공에 대한 정보를 지우지 않아도되므로 사용자에게 대략적인 아이디어를 줄 수 있습니다.

+0

좋은 방법 같지만 조금 더 자세한 코드가 필요할 것입니다 ... POST는 임의의 XSS 공격에 대해 필터링하는 데 사용할 몇 가지 텍스트 상자를 제외하고 라디오 단추입니다. 감사합니다 – Si8

+1

@ SiKni8 \t 입력란이 라디오 버튼으로 HTML로 표시된다는 사실은 누가 가짜 데이터를 해당 변수에 넣는 것에 대한 ** 보호가 아니라는 사실을 기억하십시오. 라디오 버튼의 고정 값을 기대하는 곳에서 임의의 텍스트를 제출하는 페이지를 작성하거나 (또는 ​​브라우저의 디버그 도구를 사용하여 편집하는 것은) 아주 쉽습니다. – IMSoP

+1

@IMSoP는 절대적으로 옳습니다. GET/POST 변수는 항상 안전하지 않은 것으로 간주해야하며 텍스트 상자 인 것처럼 필터링하거나 문자열 일치를 사용하여 예기치 않은 값을 거부해야합니다. –

2

양식의 내용을 유지하는 동작은 브라우저가 제공하는 편리한 기능이며 HTTP 그 자체 인과는 관련이 없습니다.

PHP header() 함수를 사용하여 리디렉션하는 경우 페이지의 HTTP 상태를 301 또는 302으로 반환하여 브라우저에 다른 URL을로드하도록 지시합니다.

JavaScript와의 차이점은 사용자가 URL을 제공하지 않는다는 것입니다 . 그런 다음 브라우저는 사용자가 해당 페이지를 떠날 때와 같이 양식을 렌더링해야한다는 결정을 내리고 있습니다.

AFAIK, "히스토리"는 원시 HTTP (명시 적으로 상태 비 저장 프로토콜)에 정의 된 개념이 아니기 때문에 User-Agent에게 이력으로 돌아갈 것을 알리는 방법은 없습니다. 결과적으로 클라이언트 측 코드 (예 : 자바 스크립트) 만 해당 동작을 트리거합니다.

리디렉션이 작동하는 방식을 변경하는 대신 리디렉션이 전혀 발생하지 않도록하고 양식이 미리 채워진 사용자의 선택으로 다시 표시되기 만하면됩니다. 그렇게하면 특정 브라우저 동작에 의존하지 않게됩니다.

값이 $_POST에 이미 있으므로 복잡한 세션 저장소가 필요하지 않으므로 양식 요소를 <input name="foo" value="x" <?php if ($_POST['foo'] == 'x') { echo 'selected'; } ?>>과 같이 렌더링 할 수 있습니다. 이는 양식 유효성 검사 후 양식을 다시 표시하는 일반적인 방법입니다.

1

헤더 전송 여부와 상관없이 리디렉션됩니다.

function redirect($url) 
{ 
    if (!headers_sent()) 
    { 
     header('Location: '.$url); 
     exit; 
    } 
    else 
    { 
     echo '<script type="text/javascript">'; 
     echo 'window.location.href="'.$url.'";'; 
     echo '</script>'; 
     echo '<noscript>'; 
     echo '<meta http-equiv="refresh" content="0;url='.$url.'" />'; 
     echo '</noscript>'; exit; 
    } 
} 
+0

이렇게하면 헤더가 활성 상태로 유지됩니까? – Si8

+0

그러면 특정 URL로 리디렉션됩니다. 요청한대로 값을 유지하려면 세션을 사용해야합니다. – Kalpesh

+0

그럼 UL 리다이렉트로도 세션이 살아 있지 않을까요? 어떻게 작동합니까? (예 : interfaithmedical.com/checksite/testFolder/a.htm (POST 메서드 사용) 모든 라디오 버튼을 채우고 제출을 누른 다음 다음 페이지에서 "돌아 가기"를 누르면 라디오 버튼 상태가 유지됩니다.) – Si8