Những ký tự nào được phép trong thuộc tính Tên HTML bên trong thẻ nhập?


82

Tôi có một tập lệnh PHP sẽ tạo <input> s động, vì vậy tôi đã tự hỏi liệu mình có cần lọc bất kỳ ký tự nào trong namethuộc tính hay không.

Tôi biết rằng tên phải bắt đầu bằng một chữ cái, nhưng tôi không biết bất kỳ quy tắc nào khác. Tôi hình dung dấu ngoặc vuông phải được cho phép, vì PHP sử dụng chúng để tạo mảng từ dữ liệu biểu mẫu. Làm thế nào về dấu ngoặc đơn? Dấu cách?

Câu trả lời:


28

Hạn chế thực sự duy nhất về những ký tự có thể xuất hiện trong tên điều khiển biểu mẫu là khi biểu mẫu được gửi bằng GET

"Phương thức" get "giới hạn giá trị tập dữ liệu biểu mẫu thành các ký tự ASCII." tài liệu tham khảo

Có một chủ đề tốt về nó ở đây .


Vì vậy, namecó một kiểu dữ liệu <input>khác với các phần tử khác? Hấp dẫn.
DLH

Nó giống như <a>và hầu hết các yếu tố, nhưng khác nhau để<meta>
Alohci

4
Vâng. Chỉ cần thử một <input>với tất cả các loại tào lao trong namethuộc tính và nó đã được xác thực trong HTML 4.01 Nghiêm ngặt. Đã được chấp nhận!
DLH

twitter sử dụng loại tên này, bất kỳ lý do đặc biệt nào để có được một số lời khuyên ...... người dùng [user_password], người dùng [email]
Vishal Sharma

"Hạn chế thực sự duy nhất về những ký tự có thể xuất hiện trong tên điều khiển biểu mẫu là khi biểu mẫu được gửi bằng GET" - Không. Điều đó không hạn chế những gì có thể xuất hiện trong tên, nó chỉ có nghĩa là nó phải được mã hóa URL khi chuyển đổi đến một URL.
Quentin

53

Lưu ý rằng không phải tất cả các ký tự đều được gửi cho namecác thuộc tính của trường biểu mẫu (ngay cả khi sử dụng POST)!

Các ký tự khoảng trắng được cắt bớt và các ký tự khoảng trắng bên trong cũng như ký tự .được thay thế bằng _. (Đã thử nghiệm trong Chrome 23, Firefox 13 và Internet Explorer 9, tất cả Win7.)


11
Cảm ơn bạn đã thêm thông báo này, bạn. Tôi đã chuẩn bị bắt đầu viết mã bằng cách sử dụng. làm vật ngăn cách.
Davis Peixoto

1
Khoảng trắng bên trong được thay thế bằng dấu cộng (+) theo trang này: w3schools.com/tags/tryit.asp?filename=tryhtml_form_submit
thdoan

1
Tôi thứ hai @Dave. Đối với những người cũng nghĩ như vậy, có lẽ bạn đang tìm kiếm các đầu vào kiểu mảng: first[second]thay vì first.second.
JD

5
Tôi muốn lưu ý rằng đây là thứ dành riêng cho máy chủ, không phải là thứ của trình duyệt. Đã thử nghiệm trên Win7 FF3 / 3.5 / 31, IE5 / 7/8/9/10 / Edge, Chrome39 và Safari Windows 5 và tất cả chúng đã gửi "test this.stuff" (bốn dấu cách ở đầu) như tên trong BÀI ĐĂNG tới máy chủ nhà phát triển ASP.NET được đóng gói với VS2012.
abluejelly

3
Xem bình luận của @ Aleksander, bên dưới. Một số máy chủ có thể chuyển đổi '.' thành '_', nhưng nó không xảy ra trên trình duyệt.
Jeff Lowery

38

Bất kỳ ký tự nào bạn có thể đưa vào tệp HTML [X] đều có thể đưa vào <input name>. Như nhận xét của Allain nói, <input name>được định nghĩa là chứaCDATA , vì vậy những thứ duy nhất bạn không thể đưa vào đó là mã điều khiển và điểm mã không hợp lệ mà tiêu chuẩn cơ bản (SGML hoặc XML) không cho phép.

Allain đã trích dẫn W3 từ thông số kỹ thuật HTML4:

Ghi chú. Phương thức "get" hạn chế các giá trị tập dữ liệu biểu mẫu thành các ký tự ASCII. Chỉ phương thức "post" (với enctype = "multiart / form-data") được chỉ định để bao gồm toàn bộ bộ ký tự ISO10646.

Tuy nhiên, điều này không thực sự đúng trong thực tế.

Lý thuyết là application/x-www-form-urlencodeddữ liệu không có cơ chế để chỉ định mã hóa cho tên hoặc giá trị của biểu mẫu, vì vậy việc sử dụng các ký tự không phải ASCII trong một trong hai ký tự "không được chỉ định" là hoạt động và bạn nên sử dụng POSTedmultipart/form-data thay thế.

Thật không may, trong thế giới thực, không có trình duyệt nào chỉ định mã hóa cho các trường ngay cả khi về mặt lý thuyết, nó có thể, trong tiêu đề phần phụ của nội dung multipart/form-datayêu cầu POST. (Tôi tin rằng Mozilla đã cố gắng triển khai nó một lần, nhưng đã bị lùi lại do nó làm hỏng máy chủ.)

Và không có trình duyệt nào triển khai tiêu chuẩn RFC2231 phức tạp và xấu xí đáng kinh ngạc cần thiết để chèn các tên trường không phải ASCII được mã hóa vào tiêu đề phần phụ của nhiều phần. Trong mọi trường hợp, thông số HTML xác định multipart/form-datakhông trực tiếp nói rằng RFC2231 nên được sử dụng và một lần nữa, nó sẽ phá vỡ các máy chủ nếu bạn cố gắng.

Vì vậy, thực tế của tình huống là không có cách nào để biết mã hóa nào đang được sử dụng cho các tên và giá trị trong một lần gửi biểu mẫu, bất kể đó là loại biểu mẫu nào. Trình duyệt sẽ làm gì với tên trường và giá trị chứa các ký tự không phải ASCII giống nhau đối với GET và cả hai loại biểu mẫu POST: nó mã hóa chúng bằng cách mã hóa trang chứa biểu mẫu được sử dụng. Các tên biểu mẫu GET không phải ASCII không bị phá vỡ nhiều hơn mọi thứ khác.

DLH:

Vậy tên có kiểu dữ liệu khác với các phần tử khác?

Trên thực tế, phần tử duy nhất có namethuộc tính không phải CDATA<meta>. Xem danh sách thuộc tính của thông số kỹ thuật HTML4 để biết tất cả các cách sử dụng khác nhau của name; đó là một tên thuộc tính quá tải, có nhiều ý nghĩa khác nhau trên các phần tử khác nhau. Đây thường được coi là một điều xấu.

Tuy nhiên, thông thường những ngày này bạn sẽ tránh namengoại trừ trên các trường biểu mẫu (nơi đó là tên điều khiển) và param(khi đó là mã nhận dạng tham số cụ thể của plugin). Đó chỉ là hai ý nghĩa để vật lộn với nhau. Nên tránh sử dụng kiểu cũ nameđể xác định các phần tử như <form>hoặc <a>trên trang ( idthay vào đó hãy sử dụng ).


9

Trong khi bình luận của Allain đã trả lời câu hỏi trực tiếp của OP và bobince cung cấp một số thông tin chuyên sâu tuyệt vời, tôi tin rằng nhiều người đến đây tìm kiếm câu trả lời cho câu hỏi cụ thể hơn: "Tôi có thể sử dụng ký tự dấu chấm trong thuộc tính tên đầu vào của biểu mẫu không?"

Khi chủ đề này xuất hiện là kết quả đầu tiên khi tôi tìm kiếm kiến ​​thức này, tôi đoán tôi cũng có thể chia sẻ những gì tôi tìm thấy.

Đầu tiên, Matthias 'tuyên bố rằng:

tính cách . được thay thế bởi _

Điều này là không đúng sự thật. Tôi không biết liệu trình duyệt có thực sự thực hiện loại hoạt động này vào năm 2013 hay không - tuy nhiên, tôi nghi ngờ điều đó. Trình duyệt gửi các ký tự dấu chấm như chúng vốn có (nói về dữ liệu ĐĂNG)! Bạn có thể kiểm tra nó trong các công cụ dành cho nhà phát triển của bất kỳ trình duyệt nào.

Xin hãy lưu ý rằng bình luận nhỏ nhỏ của abluejelly, có thể bị nhiều người bỏ qua:

Tôi muốn lưu ý rằng đây là thứ dành riêng cho máy chủ, không phải là thứ của trình duyệt. Đã thử nghiệm trên Win7 FF3 / 3.5 / 31, IE5 / 7/8/9/10 / Edge, Chrome39 và Safari Windows 5 và tất cả chúng đều gửi "test this.stuff" (bốn dấu cách ở đầu) như tên trong BÀI ĐĂNG tới máy chủ nhà phát triển ASP.NET được đóng gói với VS2012.

Tôi đã kiểm tra nó bằng máy chủ Apache HTTP (v2.4.25) và thực sự tên đầu vào như "foo.bar" được thay đổi thành "foo_bar". Nhưng trong một cái tên như "foo [foo.bar]" thì dấu chấm đó không được thay thế bằng _!

Kết luận của tôi: Bạn có thể sử dụng dấu chấm nhưng tôi sẽ không sử dụng nó vì điều này có thể dẫn đến một số hành vi không mong muốn tùy thuộc vào máy chủ HTTP được sử dụng .


điều gì xảy ra? Nếu tôi sử dụng name = "foo bar".
squal

0

Ý của bạn là thuộc tính id và tên của thẻ đầu vào HTML?

Nếu vậy, tôi rất muốn hạn chế (hoặc chuyển đổi) các ký tự tên "đầu vào" được phép thành chỉ az (AZ), 0-9 và một phạm vi dấu câu giới hạn (".", ",", V.v.), nếu chỉ để hạn chế tiềm năng khai thác XSS, v.v.

Ngoài ra, tại sao lại để người dùng kiểm soát bất kỳ khía cạnh nào của thẻ đầu vào? (Có thể không dễ dàng hơn từ góc độ xác thực khi giữ các tên thẻ đầu vào là 'custom_1', 'custom_2', v.v. và sau đó ánh xạ những tên này theo yêu cầu.)


Tôi có thể không có tên của tôi được tạo ra như thế này. Tôi chỉ đang trong quá trình cố gắng suy nghĩ về các cách cho phép các thành viên ít hiểu biết hơn về công nghệ trong văn phòng của tôi chỉ định các trường biểu mẫu.
DLH

@DLH Tôi muốn (để loại bỏ nguy cơ đụng độ tên tuổi, v.v.) chỉ với một cách tiếp cận trung gian như trên. :-)
John Parker
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.