입력 태그 내 HTML 이름 속성에 어떤 문자가 허용됩니까?


83

<input>s를 동적으로 생성하는 PHP 스크립트가 있으므로 name속성의 문자를 필터링해야하는지 궁금 합니다.

이름이 문자로 시작해야한다는 것을 알고 있지만 다른 규칙은 모릅니다. PHP는 양식 데이터에서 배열을 생성하기 위해 대괄호를 사용하기 때문에 대괄호를 허용해야한다고 생각합니다. 괄호는 어떻습니까? 공백?

답변:


28

양식 컨트롤 이름에 나타날 수있는 문자에 대한 유일한 제한은 양식이 GET으로 제출 될 때입니다.

""get "메소드는 양식 데이터 세트 값을 ASCII 문자로 제한합니다." 참고

여기에 좋은 스레드가 있습니다 .


그렇다면 다른 요소 name와 다른 데이터 유형이 <input>있습니까? 흥미 롭군.
DLH

<a>대부분의 요소와 동일 하지만 다릅니다.<meta>
Alohci 2010-08-06

4
네. 속성 <input>에서 모든 종류의 쓰레기로 시도 name했으며 HTML 4.01 Strict에서 유효성을 검사했습니다. 받아 들여졌습니다!
DLH

트위터는 이름의이 종류를 사용, 특별한 이유가 몇 가지 ADV를 얻을 ...... 사용자 [user_password], 사용자 [메일]
이씨 샤르마

"양식 컨트롤 이름에 나타날 수있는 문자에 대한 유일한 제한은 GET을 사용하여 양식을 제출할 때입니다."— 아니요. 이름에 나타날 수있는 내용을 제한하는 것이 아니라 변환 할 때 URL로 인코딩되어야 함을 의미합니다. URL에.
Quentin

54

name양식 필드의 속성에 대해 모든 문자가 제출되는 것은 아닙니다 (POST를 사용하는 경우에도)!

공백 문자는 잘리고 내부 공백 문자와 문자 .는로 대체됩니다 _. (Chrome 23, Firefox 13 및 Internet Explorer 9, 모두 Win7에서 테스트되었습니다.)


11
이 알림을 추가 해주셔서 감사합니다. .NET을 사용하여 코딩을 시작하려고했습니다. 구분자로.
Davis Peixoto 2013 년

1
내부 공백은이 페이지에 따라 더하기 기호 (+)로 대체됩니다. w3schools.com/tags/tryit.asp?filename=tryhtml_form_submit
thdoan

1
나는 두 번째 @Dave. 같은 생각을 한 사람들을 위해, 당신은 아마 배열 스타일의 입력을 찾고 : first[second]대신 first.second.
JD

5
이것은 브라우저가 아니라 서버에 특화된 것임을 주목하고 싶습니다. Win7 FF3 / 3.5 / 31, IE5 / 7 / 8 / 9 / 10 / Edge, Chrome39 및 Safari Windows 5에서 테스트되었으며 모두 POST의 이름으로 "test this.stuff"(4 개의 선행 공백)를 전송했습니다. VS2012와 함께 번들로 제공되는 ASP.NET 개발 서버.
abluejelly

3
아래 @Aleksander의 의견을 참조하십시오. 일부 서버 는 '.'로 변환 할 수 있습니다. '_'로 변경되지만 브라우저에서는 발생하지 않습니다.
Jeff Lowery

38

[X] HTML 파일에 포함 할 수있는 모든 문자는 <input name>. Allain의 의견에 따르면 <input name>은 포함 된 것으로 정의되어 CDATA있으므로 여기에 넣을 수없는 것은 기본 표준 (SGML 또는 XML)에서 허용하지 않는 제어 코드와 잘못된 코드 포인트뿐입니다.

Allain은 HTML4 사양에서 W3를 인용했습니다.

노트. "get"메소드는 양식 데이터 세트 값을 ASCII 문자로 제한합니다. 전체 ISO10646 문자 집합을 포함하도록 "post"메서드 (enctype = "multipart / form-data"사용) 만 지정됩니다.

그러나 이것은 실제로는 사실이 아닙니다.

이론은 application/x-www-form-urlencoded데이터에 양식의 이름이나 값에 대한 인코딩을 지정하는 메커니즘이 없기 때문에 둘 중 하나에 비 ASCII 문자를 사용하는 것은 작동하는 것으로 "지정되지 않음"이므로 multipart/form-data대신 POSTed 를 사용해야 합니다.

안타깝게도 실제 세계에서는 multipart/form-dataPOST 요청 본문 의 하위 부분 헤더에서 이론적으로 가능하더라도 필드에 대한 인코딩을 지정하는 브라우저가 없습니다 . (나는 Mozilla가 한 번 구현하려고 시도했지만 서버가 손상됨에 따라 철회했다고 생각합니다.)

또한 인코딩 된 비 ASCII 필드 이름을 멀티 파트의 서브 파트 헤더에 삽입하는 데 필요한 놀랍도록 복잡하고보기 흉한 RFC2231 표준을 구현하는 브라우저는 없습니다 . 어쨌든 정의하는 HTML 사양은 multipart/form-dataRFC2231을 사용해야한다고 직접 말하지 않으며 다시 시도하면 서버가 중단됩니다.

따라서 상황의 현실은 형식이 어떤 유형이든 상관없이 양식 제출의 이름과 값에 사용되는 인코딩을 알 수있는 방법이 없다는 것입니다. 비 ASCII 문자가 포함 된 필드 이름 및 값으로 브라우저가 수행하는 작업은 GET 및 두 유형의 POST 양식 모두에 대해 동일합니다. 사용 된 양식이 포함 된 페이지를 인코딩하여 인코딩합니다. 비 ASCII GET 양식 이름은 다른 모든 것보다 더 이상 깨지지 않습니다.

DLH :

그렇다면 이름은 다른 요소와 다른 데이터 유형을 가지고 있습니까?

실제로 name속성이 아닌 유일한 요소 CDATA<meta>입니다. 의 모든 다른 용도에 대해서는 HTML4 사양의 속성 목록 을 참조하십시오 name. 이는 오버로드 된 속성 이름으로, 서로 다른 요소에 대해 많은 다른 의미를 가지고 있습니다. 이것은 일반적으로 나쁜 것으로 간주됩니다.

그러나 일반적으로 요즘 name에는 양식 필드 (컨트롤 이름) 및 param(플러그인 관련 매개 변수 식별자)를 제외하고 는 피할 수 있습니다 . 그것은 씨름 할 두 가지 의미 일뿐입니다. 의 올드 스쿨 사용 name과 같은 요소를 식별 <form>또는 <a>페이지에는 (사용 피해야한다 id대신을).


9

Allain의 의견이 OP의 직접적인 질문에 답했고 bobince가 몇 가지 훌륭한 심층 정보를 제공했지만, 나는 많은 사람들이 더 구체적인 질문에 대한 답을 찾기 위해 여기에 올 것이라고 믿습니다. "폼의 입력 이름 속성에 점 문자를 사용할 수 있습니까?"

내가이 지식을 검색했을 때이 스레드가 첫 번째 결과로 나타났기 때문에 내가 찾은 것을 공유 할 수있을 것이라고 생각했습니다.

첫째, Matthias는 다음과 같이 주장했습니다.

캐릭터 . _로 대체됩니다.

이것은 사실이 아닙니다. 2013 년에 브라우저가 실제로 이런 종류의 작업을 수행했는지는 모르겠지만 의심 스럽습니다. 브라우저는 점 문자를 그대로 전송합니다 (POST 데이터에 대해 이야기)! 괜찮은 브라우저의 개발자 도구에서 확인할 수 있습니다.

많은 사람들이 놓친 abluejelly의 작은 주석에 주목하십시오.

이것은 브라우저가 아니라 서버에 특화된 것임을 주목하고 싶습니다. Win7 FF3 / 3.5 / 31, IE5 / 7 / 8 / 9 / 10 / Edge, Chrome39 및 Safari Windows 5에서 테스트했으며 모두 POST에서 이름으로 "test this.stuff"(4 개의 선행 공백)를 전송했습니다. VS2012와 함께 번들로 제공되는 ASP.NET 개발 서버.

Apache HTTP 서버 (v2.4.25)로 확인한 결과 "foo.bar"와 같은 입력 이름이 "foo_bar"로 변경되었습니다. 그러나 "foo [foo.bar]"와 같은 이름에서는 점이 _!

내 결론 : 점을 사용할 수 있지만 사용하는 HTTP 서버에 따라 예상치 못한 동작이 발생할 수 있으므로 사용하지 않습니다 .


무슨 일이야? 내가 name = "foo bar"를 사용한다면.
squal

0

HTML 입력 태그의 ID 및 이름 속성을 의미합니까?

그렇다면 허용 된 "입력"이름 문자를 az (AZ), 0-9 및 제한된 범위의 구두점 ( ".", ","등)으로 만 제한 (또는 변환)하고 싶을 것입니다. XSS 익스플로잇 등의 가능성을 제한하는 경우에만

또한 사용자가 입력 태그의 모든 측면을 제어하게하는 이유는 무엇입니까? (검증 관점에서 입력 태그 이름을 'custom_1', 'custom_2'등으로 유지 한 다음 필요에 따라 매핑하는 것이 궁극적으로 쉽지 않을 수 있습니다.)


내 이름이 이렇게 생성되지 않을 수도 있습니다. 저는 제 사무실의 기술에 익숙하지 않은 구성원이 양식 필드를 지정할 수 있도록 허용하는 방법을 고민하는 중입니다.
DLH

@DLH 나는 위와 같은 중간 접근 방식으로 (이름 충돌 등의 위험을 제거하려는) 유혹을받을 것입니다. :-)
John Parker
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.