쿼리 문자열 매개 변수 및 숨겨진 매개 변수가 포함 된 GET 양식을 제출하면 사라집니다.


231

이 양식을 고려하십시오.

<form action="http://www.blabla.com?a=1&b=2" method="GET">
    <input type="hidden" name="c" value="3" /> 
</form>

이 양식 (GET 양식)을 제출하면 매개 변수 a와 b가 사라집니다. 그 이유가 있습니까? 이 행동을 피할 수있는 방법이 있습니까?


3
액션 요소가 잘못되었습니다.
Adrian Godong

그것들이 사라지지 않아야하므로 양식을 봐야한다고 생각합니다.
UnkwnTech

2
안녕하세요, 여기에 전체 양식이 있습니다.이 양식으로 HTML을 작성하면 액션에 전달한 매개 변수가 사라지는 것을 볼 수 있습니다. <form action = " example.com?e=4&f=5"method = "GET"> <input type = "hidden"name = "a"value = "1"/> <input type = "hidden"name = "b"value = "2"/> <input type = "hidden"name = "c" value = "3"/> <input type = "submit"/> </ form>

1
그건 그렇고, 당신은 그 행동 가치에 대한 최종 견적이 빠져 있다는 것을 알고 있습니까? 주요 이슈를 제외하고는 ...
Jay

JavaScript를 사용하여 가능한 해결 방법을 게시했습니다. stackoverflow.com/questions/3548795/…
Jenny O'Reilly

답변:


263

숨겨진 매개 변수가 무엇입니까 ...로 시작하지 않습니까?

<form action="http://www.example.com" method="GET">
  <input type="hidden" name="a" value="1" /> 
  <input type="hidden" name="b" value="2" /> 
  <input type="hidden" name="c" value="3" /> 
  <input type="submit" /> 
</form>

액션 URL에 기존 쿼리 문자열을 유지하는 브라우저는 중요하지 않습니다.

사양 ( RFC1866 , 페이지 46; HTML 4.x 섹션 17.13.3) 상태 :

메소드가 "get"이고 조치가 HTTP URI 인 경우, 사용자 에이전트는 action 값을 가져 와서`? '를 추가합니다. 그런 다음 "application / x-www-form-urlencoded"컨텐츠 유형을 사용하여 인코딩 된 양식 데이터 세트를 추가합니다.

어쩌면 동작 URL을 퍼센트 인코딩하여 물음표와 매개 변수를 포함시킨 다음 손가락을 교차하여 모든 브라우저가 해당 URL을 그대로두기를 바랍니다 (그리고 서버도 그것을 이해하는지 확인). 그러나 나는 결코 그것에 의존하지 않을 것입니다.

그건 그렇고 : 숨겨지지 않은 양식 필드와 다르지 않습니다. POST의 경우 작업 URL에 쿼리 문자열이 포함될 수 있습니다.


71

HTML5에서 이는 스펙 별 동작입니다.

http://www.w3.org/TR/2011/WD-html5-20110525/association-of-controls-and-forms.html#form-submission-algorithm을 참조하십시오 .

"4.10.22.3 양식 제출 알고리즘", 단계 17을 참조하십시오. 조회 문자열을 사용하여 http / s URI에 대한 GET 양식의 경우 :

destination은 해당 <query>구성 요소가 조회로 대체되는 것을 제외하고 조치와 동일한 새 URL이되도록하십시오 (적절한 경우 U + 003F QUESTION MARK 문자 (?) 추가).

따라서 브라우저는 URI의 기존 "? ..."부분을 휴지통에 버리고 양식에 따라 새 것으로 대체합니다.

HTML 4.01에서이 스펙은 잘못된 URI를 생성합니다. 대부분의 브라우저는 실제로이 작업을 수행하지 않았습니다.

http://www.w3.org/TR/html401/interact/forms.html#h-17.13.3의 4 단계를 참조하십시오 . URI에는? 이미 포함되어 있어도 추가됩니다.


이 의미 : ?액션 URL에서 뒤에있는 모든 것이 제거됩니까? 따라서 액션 URL의 GET 매개 변수에 대상이 포함되어 있으면 양식을 처리 해야하는 곳은 무엇입니까? 처럼 : action="index.php?site=search". 숨겨진 입력 필드에 GET 매개 변수를 넣는 것이 좋은 아이디어인지 확실하지 않습니다.
Bndr

스펙 별 @xyphoid는 무엇을 의미합니까?
AmiNadimi

@AmiNadimi : "사양에 따라"를 의미합니다.
재귀

14

GET 정보가 포함 된 테이블에서 간단한 foreach를 사용하면됩니다. 예를 들어 PHP에서 :

foreach ($_GET as $key => $value) {
    echo("<input type='hidden' name='$key' value='$value'/>");
}

23
참고 :이 예제 코드를 작성된 그대로 사용하지 마십시오. 매우 위험합니다. GET의 값은 사용자가 제공하므로 먼저 이스케이프하지 않고 페이지에 쓰면 안됩니다.
drewm

16
이 코드에서 XSS 버그까지 수정.
spookylukey

1
이 답변 은 비슷한 솔루션을 제공하지만 XSS에는 취약하지 않습니다.
vvzh

이것은 배열 매개 변수를 처리하지 않습니다
Andrew

5

두 항목 (a 및 b)을 숨겨진 입력 요소 및 C로 포함해야합니다.


물론 가능하다면 가능합니다. 그러나 쿼리 문자열과 숨겨진 입력에 매개 변수가 있다고 가정하면 어떻게해야합니까?

유일한 옵션은 쿼리 문자열 이름 / 값 쌍을 구문 분석하고 숨겨진 입력 필드를 생성하는 것입니다. 어쩌면 페이지와 URL의 맥락에서 조금 더 설명했다면 효과적인 해결책을 제안 할 수 있습니다.
Bernhard Hofmann

또는 숨겨진 양식 항목에서 데이터를 가져 와서 URL 및 추가 쿼리 매개 변수에 추가 한 다음 양식 제출 버튼을 간단한 앵커 링크로 바꾸거나 Location:최종 사용자와 상호 작용하지 않으려는 경우 서버 리디렉션 .
Jason

1

양식 작업에 대해 비슷한 문제가 발생했습니다.

<form action="http://www.example.com/?q=content/something" method="GET">
   <input type="submit" value="Go away..." />&nbsp;
</form>

버튼은 사용자를 사이트로 안내하지만 쿼리 정보가 사라져 사용자가 원하는 콘텐츠 페이지가 아닌 홈 페이지에 도착했습니다. 필자의 경우 해결책은 사용자가 원하는 페이지로 연결되는 쿼리없이 URL을 코딩하는 방법을 찾는 것입니다. 이 경우 내 목표는 Drupal 사이트였습니다 /content/something. 노드 번호 (예 :)를 사용할 수도 있습니다 /node/123.


0

이 형식을 타사 시스템에 배치 할 수 있으므로 해결 방법이 필요한 경우 다음과 같이 Apache mod_rewrite를 사용할 수 있습니다.

RewriteRule ^dummy.link$ index.php?a=1&b=2 [QSA,L]

새 양식은 다음과 같습니다.

<form ... action="http:/www.blabla.com/dummy.link" method="GET">
<input type="hidden" name="c" value="3" /> 
</form>

아파치는 쿼리에 세 번째 매개 변수를 추가합니다


-3

당신의 건설은 불법입니다. 양식의 조치 값에 매개 변수를 포함 할 수 없습니다. 이 작업을 시도하면 브라우저의 특성에 따라 달라집니다. 다른 브라우저가 아닌 한 브라우저에서 작동해도 놀라지 않을 것입니다. 그것이 작동하는 것처럼 보일지라도, 다음 버전의 브라우저가 동작을 바꿀 수 있기 때문에 나는 그것에 의존하지 않을 것입니다.

"하지만 쿼리 문자열과 숨겨진 입력에 매개 변수가 있다고하면 어떻게해야합니까?" 당신이 할 수있는 일은 오류를 해결하는 것입니다. "하지만 내 URL이 슬래시 대신 퍼센트 부호를 사용한다고 말하면 어떻게해야합니까?" 유일하게 가능한 대답은 URL을 수정할 수 있다는 것입니다.


이 전체 답변은 기술적으로 정확하지만 ( "잘못된 것이므로 수정하십시오") 아무 소용이 없습니다. OP는 이미 문제가 있음을 알고 있으며 문제를 해결하는 방법을 묻습니다.
Jason

미안하지만 명확하지 않습니까? "양식의 조치 값에 매개 변수를 포함 할 수 없습니다." 수정하려면 양식의 조치 값에서 매개 변수를 제거하십시오.
Jay

@Jay 문제는 사용자가 유지하기 위해 URL 매개 변수가 필요하다는 것이 분명하므로 "제거"라는 말이 도움이되지 않습니다.
Chuck Le Butt

@ChuckLeButt "하지만 작동하지 않는이 작업을 수행해야합니다"라고 말하는 것은 유용한 것이 아닙니다. 누군가가 "라디오 노브를 계속 돌리지 만 내 차는 움직이지 않을 것"이라고 말하면, "라디오 노브를 돌리면 차가 움직이지 않습니다."라고 대답 할 수 있습니다. 시동 키를 누르고 가스 페달을 밟습니다. " "무선 노브를 돌려 차를 움직여야합니다"라는 대답은 비생산적인 반응입니다. 작동하지 않습니다. 작동하지 않습니다.
Jay

-3

이것은 Efx의 위 게시물에 대한 답변입니다.

URL에 변경하려는 var가 이미 포함되어 있으면 숨겨진 필드로 다시 추가됩니다.

URL에서 vars가 중복되는 것을 방지하기 위해 해당 코드를 수정했습니다.

foreach ($_GET as $key => $value) {
    if ($key != "my_key") {
        echo("<input type='hidden' name='$key' value='$value'/>");
    }
}

-4
<form ... action="http:/www.blabla.com?a=1&b=2" method ="POST">
<input type="hidden" name="c" value="3" /> 
</form>

요청 메소드를 'GET'대신 'POST'로 변경하십시오.


-4

나는 보통 다음과 같이 씁니다.

foreach($_GET as $key=>$content){
        echo "<input type='hidden' name='$key' value='$content'/>";
}

이것은 작동하지만 XSS 공격에 대비하여 입력을 삭제하는 것을 잊지 마십시오!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.