0

웹 응용 프로그램에서 작업 중이며 HTTP 리디렉션을 통해 데이터를 전달해야합니다. 예를 들어 :HTTP 리디렉션을 통해 데이터를 전달하기위한 옵션

http://foo.com/form.html 

게시하는 데이터에 문제가있는 경우

http://foo.com/form/submit.html 

에, 응답은

http://foo.com/form.html?error=Some+error+message 

및 쿼리 PARAM "오류"로 다시 리디렉션 의 값이 페이지에 표시됩니다.

리디렉션 (예 : HTTP 헤더 등)에서 데이터를 전달할 수있는 신뢰할 수있는 방법이 있습니까?

쿼리 PARAMS 작품으로 데이터를 전달하지만 때문에 적합하지 않습니다 :

이 이 에게 그것의 일반 텍스트 (그리고 쿼리 문자열에서, SSL이 encyrpt에 의존 질수 있도록) 그래서 싶지 않을 것이다
  • 이 통과
      민감한 데이터
    • URI는 브라우저에 의해 길이가 제한됩니다 (길이는 일반적으로 상당히 길다).

    중요 :이 플랫폼은 상태가 적으며 많은 응용 프로그램 서버에 분산되어 있으므로 서버 측 세션 객체에서 데이터를 추적 할 수 없습니다.

  • +1

    "* [...] 및 쿼리 문자열에서 SSL은 encyrpt *에 의존 할 수 없습니다." 여기에 말하려고하는 내용 (일반 HTTP를 사용하고 있음)은 확실하지 않지만 [HTTPS는 ** 모두 ** HTTP 트래픽을 암호화합니다] (http://stackoverflow.com/a/8858241/372643). – Bruno

    +0

    @ Bruno의 덧글을 한번 더 강조하겠습니다. 요청 라인이 SSL로 보호되지 않았다는 것을 어떻게 알 수 있습니까? 나중에 몇 가지 설명을 반복합니다 : "쿠키는 암호화되지 않고 요청 줄이 아닙니다"... 이것은 사실이 아닙니다. SSL은 IP 페이로드를 터널링하며 모든 HTTP 프로토콜은 그 일부입니다 (요청 행, 헤더, 페이로드 ...). 요청 라인은 * application * (브라우저, 로그) 레이어에서 매우 간단합니다. 하지만, 조금 더 복잡해 지더라도 여기에 같은 보안 누출이 있습니다. – mtraut

    답변

    1

    클라이언트 - 서버 상호 작용 관점에서 보면 이는 서버 내부 디스패치 문제입니다.

    브라우저는 the HTTP specification에 따라 자동으로 초기 요청의 엔터티를 다시 게시하기위한 것이 아닙니다. ""브라우저에서 사용되는 방법이 다음과 같은 경우에만 사용자 에이전트와 사용자 상호 작용없이 수행 할 수 있습니다. 두 번째 요청은 GET 또는 HEAD입니다. "

    아직 입력하지 않은 경우 form.html을 동적으로 만들어 HTML 정적 파일로 만듭니다. POST 요청을 자신에게 보내고 오류가 발생할 경우 값을 미리 채 웁니다. 또는 submit.html에 문제가있는 경우 form.html과 같은 템플리트를 사용할 수 있습니다.

    이 이 (쿼리 문자열, SSL은 encyrpt에 의존 질수 있도록) 문제가 그래서 통과 싶지 않을 것이다 민감한 데이터 잘 모르겠어요

    의 일반 텍스트입니다

    무엇 이리. 어쨌든 평범한 HTTP를 통해 모든 것을 제출하고 있습니다. 쿠키, 쿼리 매개 변수 및 요청 엔터티가 모두 표시됩니다. HTTPS would actually protect all this을 사용하면 쿼리 매개 변수가 브라우저 기록 및 서버 로그 (TLS가 보호하는 연결의 일부가 아닌)에서 여전히 문제 일 수 있습니다.

    +0

    죄송합니다 - POST가 선택적으로 SSL 일 수 있다고 말하려고 했으므로 본문 (POST 내용)이 암호화됩니다. 검색어 매개 변수는 SSL/HTTPS 요청에서도 SSL로 암호화되지 않으므로 맞춤 암호화 솔루션이 필요합니다. – empire29

    +0

    제안 된 솔루션에서 확실하지 않습니다. POST-Redirect-GET 디자인 패턴을 사용하고 POST 처리기에서 결과 GET 응답으로 정보를 보내려고합니다. 이 디자인 패턴은 당신이 인용하는 지침과 절대적으로 일치합니다. – empire29

    +0

    @ empire29 쿼리 매개 변수 ** ARE **는 HTTPS를 사용할 때 암호화됩니다. 텍스트에 연결된 이전 답변을 확인하십시오. 믿을 필요는 없습니다. 물론 HTTPS 사양을 읽고 Wireshark를 사용해보십시오. – Bruno

    1

    쿠키 사용은 데이터 양에 따라 합리적인 해결책이 될 것이라고 생각합니다.

    http://foo.com/form.html?error_id=42 : 당신은 당신이 ID로 그것을 서버 및 기준에 데이터베이스에 오류 메시지를 저장할 수

    +0

    쿠키도 안전하지 않습니다. 그들은 일반 텍스트로 전달됩니다. –

    +1

    동의했다, 그것에주의를 기울이지 않았다. 그러나 당신이 encription을 사용하지 않는다면 클라이언트 측에 안전하게 데이터를 전달할 방법이 없다고 생각합니다. 어쩌면 사용자 세션 (또는 위에서 언급 한 데이터베이스)에 정보를 저장하는 것이 더 나은 솔루션이 될 수 있습니다. – eduardohl

    +0

    쿠키 값을 암호화 할 수 있으므로 일반 base64 텍스트 만 전달됩니다 –

    1

    (훨씬 더 간단 할 것이다 예를 들어 세션을 사용하여) 서버 측에서이를 추적 할 수 없기 때문에

    오류 텍스트가 수정되면 데이터베이스를 사용할 필요조차 없습니다.

    또한 Web Storage을 사용할 수 있습니다. 대신 당신이 자바 스크립트로 출력 페이지를 표시 할 수 있습니다 "위치"헤더 리디렉션 :

    var error_message = "Something is wrong"; 
    if(typeof(Storage) !== "undefined") { 
        localStorage.error_message = error_message; 
    else { 
        // fallback for IE < 8 
        alert(error_message); 
    } 
    location.href = "new url"; 
    

    그리고 재 지정 후 당신은 자바 스크립트를 사용하여 localStorage.error_message를 읽고 메시지를 표시 할 수 있습니다.

    +0

    Hrm - true - 일부 지우기/플러시 루틴과 함께 지속성 메커니즘이 필요합니다. 확실하지 않기 때문에 나는이 솔루션을 많이 좋아한다. – empire29

    +0

    다른 해결책을 추가했습니다. –