HTML 양식의 action 속성에 빈 URL을 사용하는 것이 좋습니까? (조치 =“”)


279

빈 HTML 양식 작업을 사용하여 현재 페이지에 다시 게시하는 것에 대해 "모범 사례"응답을 줄 수있는 사람이 있는지 궁금합니다.

빈 HTML 양식 조치가 여기에 무엇을 요구하는 게시물 과 같은 일부 페이지 이 하나 가 괜찮 제안하지만 나는 사람들이 어떻게 생각하는지 알고 싶습니다.


7
"모범 사례"태그 제안이 여기에 적용됩니다.
Will Morgan

이중으로 확인하려면 작업을 비워 두거나 작업을 전혀 언급하지 마십시오 (예 <form name="xyz" >:). 자체적으로 조치를 제출합니다.
lwpro2 2016 년

11
action 속성을 포함하지 않으면 공격자가 iframe에서 페이지를 래핑하고 iframe URL에 양식 필드와 이름이 같은 쿼리 매개 변수가 포함 된 공격과 같은 iframe 클릭 재킹 공격 까지 페이지가 열립니다 . 양식을 제출하면 쿼리 값이 데이터베이스에 삽입되므로 사용자 식별 정보 (이메일, 주소 등)가 손상되었습니다.
Paul Sweatte

그렇다면 현재 페이지에 양식을 제출하는 유효하고 안전한 방법은 무엇입니까?
Costa

답변:


268

가장 좋은 방법은 action 속성을 모두 생략하는 것입니다. 양식을 남기지 않으면 양식이 문서의 주소 (예 : 같은 페이지)로 제출됩니다.

비워 둘 수도 있으며 HTML 양식 제출 알고리즘을 구현하는 모든 브라우저 는 문서의 주소와 동등한 것으로 취급합니다. 주로 브라우저가 현재 작동하는 방식이기 때문에 수행됩니다.

8.action은 제출자 요소의 action 이라고하자 .

9.action이 빈 문자열 인 경우 action은 문서의 주소 입니다.

참고 :이 단계는 RFC 3986을 고의적으로 위반 하므로 여기에서 기본 URL 처리가 필요합니다. 이러한 위반은 레거시 컨텐츠와의 호환성을 원함으로써 동기가 부여됩니다. [RFC3986]

이것은 확실히 현재의 모든 브라우저에서 작동하지만 (일부 이전 버전의 브라우저에서 예상대로 작동하지 않을 수 있습니다 " "속성을 브라우저 = 빈 조치 이상한 일을 " " 이유입니다) 사양 강력 비어 떠나는 저자을 낙담 :

actionformaction컨텐츠 속성이 지정된 경우, A는 값이 있어야합니다 잠재적 공백으로 둘러싸인 유효 비어 있지 않은 URL을 .


12
아마도 이것은 귀하의 답변 (거의 3 년이 action=""
지났음

2
@derobert 감사합니다. 아마 바뀌지 ​​않았을 것입니다. 사양의 내용을 더 잘 반영하기 위해 답변을 변경했습니다.
mercator

73

실제로 현재 HTML5 초안 의 양식 제출 하위 섹션 에서는을 허용하지 않습니다 action="". 사양에 위배됩니다.

actionformaction컨텐츠 속성이 지정된 경우, 유효한 인 값이 있어야합니다 비어 있지 않은 잠재적 공백으로 둘러싸인 URL을. (강조 추가)

mercator의 답변 에서 인용 된 부분은 authors가 아니라 구현에 대한 요구 사항입니다 . 저자는 저자 요구 사항을 따라야합니다. 이 사양을 읽는 방법을 인용하려면 :

특히 제작자 (예 : 작성자 및 제작자)에 적용되는 적합성 요구 사항이 있으며 소비자 (예 : 웹 브라우저)에 적용되는 적합성 요구 사항이 있습니다. 요구 사항에 따라 구별 할 수 있습니다. 생산자에 대한 요구 사항은 허용되는 내용, 소비자에 대한 요구 사항은 소프트웨어의 작동 방식을 나타냅니다.

빈 URL을 허용 한 HTML4에서 변경된 것은“ 브라우저가 빈 action=""속성으로 이상한 일을 했기 때문 ”입니다. 변경 이유를 고려할 때 HTML4에서도 그렇게하지 않는 것이 가장 좋습니다.


action양식이 문서 주소로 제출되어야 함을 나타 내기 위해 속성이 전혀 없는 것을 허용합니까 ? "지정된 경우"라고되어 있기 때문에 보인다.
Kerrick

2
@ Kerrick 네, HTML5는 action 속성을 완전히 생략하고 기본적으로 빈 문자열로 허용합니다. HTML4는 필요에 따라 조치를 지정하지 않았습니다.
derobert

@Kerrick에 동의하며 action 속성을 생략 할 수 있습니다. 현재 HTML5 draf에서 읽을 때 빈 문자열은 허용되지 않지만 속성이없는 것으로 허용됩니다. 그러나 어쨌든 호환성 문제로 인해 항상 "action"속성을 포함하고 비어 있지 않은 유효한 URL로 채우는 것이 좋습니다 (좋은 방법은 항상 최선의 방법입니다).
serfer2

잠재적 인 문제점 : AngularJS는 action 속성없이 양식을 제출하지 못하게합니다. 아마도 일반적인 문제는 아니지만 레거시 사이트의 일부가 왜 깨지기 시작했는지 알아내는 데 시간이 걸렸습니다.
Asmor

18

action 속성을 포함하지 않으면 iframe 클릭 재킹 공격 까지 페이지가 열리 며 몇 가지 간단한 단계가 포함됩니다.

  • 공격자가 페이지를 iframe으로 감 쌉니다.
  • iframe URL에는 양식 필드와 이름이 같은 검색어 매개 변수가 포함됩니다.
  • 양식을 제출하면 쿼리 값이 데이터베이스에 삽입됩니다
  • 사용자 식별 정보 (이메일, 주소 등)가 손상되었습니다

참고 문헌


2
iframe URL에 GET 매개 변수가 포함되어 있지 않지만 양식은 일반적으로 POST를 사용하여 제출됩니까? 따라서 사이트가 POST 매개 변수 만 처리한다면 문제가되지 않아야합니까? 적어도 양식을 처리 할 때만 PHP에서 $ _POST 배열을 사용합니다.
Calmarius

2
@Calmarius 예, 이것을 피하기 위해 $_POST대신에 사용 $_REQUEST하십시오. 프레임 워크 코드가 $_REQUEST사용하는 경우 iframe 버스터를 사용하십시오 .
Paul Sweatte

17

이것은 HTML5로 유효합니다.

<form action="#">

4
나는 그것을 시도하지 않았지만 개념적으로 제출 후 페이지 상단으로 스크롤하지 않습니까?
매트 미첼

2
사용할 수 action="."없습니까?
s427

3
action = "?" 잘 작동합니다. 문자열 데이터없이 쿼리하고 현재 페이지를 가리 킵니다.
Chris Broski

5
action="."일반적인 경우에는 나쁜 생각입니다. 와 같은 URL example.com/login은 단순히에 매핑됩니다 example.com/.
Torsten Bronger

1
이 답변은 사용자가 페이지 맨 위로 스크롤하려는 경우에만 유효합니다.
Buts

9

HTML 5에서는 action=""지원되지 않으므로 그렇게하지 마십시오. 나쁜 습관.

대신 액션을 완전히 부정하면 기본적으로 동일한 페이지에 제출됩니다. 이것이 최선의 방법이라고 생각합니다.

<form>This will submit to the current page</form>

PHP를 사용하여 양식을 요약하는 경우 다음을 고려할 수 있습니다. 자세한 내용은 여기를 참조하십시오.

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

또는 #앵커처럼 작동하고 페이지 맨 위로 스크롤한다는 점을 명심하십시오.

<form action="#">

왜 누군가가이 답변에 투표하지 않았는지 이해하고 싶습니까?
Buts

action 속성을 생략했습니다. 익스플로잇에 열려있는 양식이 링크의 frist 페이지에 자세히 나와 있습니까?
Richard Young

@RichardYoung 죄송합니다. 귀하의 질문을 이해하지 못합니다. 다시 말씀해주세요.
Buts

1
$ _SERVER [ "PHP_SELF"] 변수는 해커가 사용할 수 있습니다. PHP_SELF가 페이지에 사용되면 사용자는 슬래시 (/)를 입력 한 다음 실행할 XSS (Cross Site Scripting) 명령을 입력 할 수 있습니다. action 속성을 생략해도 여전히 이것에 취약합니까?
Richard Young

그렇습니다. action 속성은 클라이언트 측에 다시 추가 할 수 있으며 원하는 값을 지정할 수 있습니다. 그러나이 htmlspecialchars()기능을 사용하면 사람들의 PHP 스크립트를 사용하지 못하게됩니다.
Buts

4

나는 보통 XHTML 유효하고 URL에 GET 데이터를 유지하는 action = ""을 사용한다.


4
드물지만, 예를 들어, 내 포럼에서 URL : thread.php? id = 12 & page = 6을 가질 수 있으며 페이지 하단에 주석을 추가 할 수있는 POST 양식이 있으며 PHP에 GET 데이터가 필요합니다. 주석을 추가 할 스레드를 알고 있습니다.
Juddling

20
GET은 양식의 기본 방법입니다. 나쁘지는 않습니다. ;-) w3.org/TR/html401/interact/forms.html#adef-method
NickFitz

5
형태로 GET을 사용하면 입니다 나쁜 일. 제출 후 사용자가 페이지를 다시로드하면 의도하지 않은 결과가 발생할 수 있습니다. 그러나 POST가 사용되면 브라우저는 동일한 데이터를 다시 제출하는 것에 대해 경고합니다.
윌 셰퍼드

22
@WillSheppard에 동의하지 않습니다. 당신은 그런 담요 진술을 할 수 없습니다. 그것은 모두 양식의 기능에 달려 있습니다. 작업을 수행하는 모든 작업 (예 : 포럼에 새 게시물 삽입)에는 POST를 사용해야하지만 다른 모든 작업 (예 : 검색 상자 또는 탐색 양식 사용)에는 GET을 사용해야합니다. POST가 성공하면 사용자가 데이터를 다시 제출하지 못하도록 스크립트가 브라우저를 리디렉션해야합니다.
Mike

3
PS는 모든 브라우저가 POST 데이터를 다시 제출하라는 경고를하지는 않습니다 (예 : Opera)
Mike

4

양식이 게시되는 위치 를 명시 적으로 나타내는 것이 가장 좋습니다 . 완전히 안전하려면 양식을 자신에게 다시 제출하려면 양식이있는 동일한 URL을 조치 속성에 입력하십시오. 주류 브라우저 ""는 동일한 페이지로 평가되지만 비주류 브라우저는 보장 할 수 없습니다.

물론 Juddling과 같은 GET 데이터를 포함한 전체 URL이 지적됩니다.


2

그냥 사용

?

<form action="?" method="post" enctype="multipart/form-data" name="myForm" id="myForm">

HTML5 표준을 위반하지 않습니다.


나는 공감하지 않았지만 당신의 방법은 모든 get매개 변수를 버릴 것 입니다. 다음 URL example.com/update_user?user_id=1에 양식이 제출되기 때문에 양식이 손상 될 수 있습니다.example.com/update_user?
vikki

1

Classic ASP로 작업 할 때이 작업을 많이했습니다. 일반적으로 서버 측 유효성 검사가 입력에 대해 일종의 (AJAX 이전) 필요했을 때 사용했습니다. 내가 볼 수있는 주요 단점은 파일 수준에서 프로그래밍 논리와 프레젠테이션을 분리하지 않는다는 것입니다.


1
왜 안돼? 연결되지 않은 것 같습니다. 동일한 페이지에 데이터를 게시하고 컨트롤러와보기를 올바르게 분리 하여이 페이지를 작성하는 양식을 가질 수 있습니다.
markus

1

action 속성을 전혀 지정하지 않는 데 사용합니다. 실제로 내 페이지는 모든 페이지가 동일한 주소로 정확하게 다시 제출되도록 설계되었습니다. 그러나 오늘 나는 문제를 발견했다. 때로는 액션 속성 값을 빌려 백그라운드 호출을합니다 (일부 사람들은 이름을 AJAX라고 생각합니다). 따라서 action 속성이 지정되지 않은 경우 IE는 action 속성 값을 비워 둡니다. action 속성을 지정하지 않으면 JavaScript 대응 항목이 적어도 정의되어 있지 않기 때문에 이해하기가 약간 이상합니다. 어쨌든 내 요점은 모범 사례를 선택하기 전에 JavaScript에서 속성을 사용하는지 여부와 같이 더 많은 컨텍스트를 이해해야한다는 것입니다.

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