Giriş etiketi içindeki HTML Adı özniteliğinde hangi karakterlere izin verilir?


83

<input>Dinamik olarak s üretecek bir PHP betiğim var, bu yüzden nameöznitelikteki herhangi bir karakteri filtrelemem gerekip gerekmediğini merak ediyordum .

İsmin bir harfle başlaması gerektiğini biliyorum ama başka bir kural bilmiyorum. PHP bunları form verilerinden diziler oluşturmak için kullandığından köşeli parantezlere izin verilmelidir. Parantez nasıl olur? Uzaylar?

Yanıtlar:


28

Form kontrol adlarında hangi karakterlerin görünebileceğine dair tek gerçek kısıtlama, GET ile bir form gönderildiğinde

"" Get "yöntemi, form veri kümesi değerlerini ASCII karakterleriyle sınırlar." referans

Burada güzel bir iplik var .


Öyleyse name, <input>diğer öğeler için olduğundan farklı bir veri türü var mı? İlginç.
DLH

<a><meta>
Öğeyle

4
Evet. Sadece öznitelikte <input>her türlü saçmalığı denedim nameve HTML 4.01 Strict'de doğrulandı. Kabul edilmiş!
DLH

twitter bu tür bir ad kullanıyor, bazı avantajlar almak için herhangi bir özel neden ...... kullanıcı [kullanıcı_parolası], kullanıcı [e-posta]
Vishal Sharma

1
"Form kontrol adlarında hangi karakterlerin görünebileceğine ilişkin tek gerçek kısıtlama, bir form GET ile gönderildiğinde" - Hayır. Bu, adda görünebilecekleri kısıtlamaz, yalnızca dönüştürüldüğünde URL kodlaması gerektiği anlamına gelir bir URL'ye.
Quentin

55

nameForm alanlarının öznitelikleri için tüm karakterlerin gönderilmediğini unutmayın (POST kullanırken bile)!

Beyaz boşluk karakterleri kırpılır ve iç beyaz boşluk karakterlerinin yanı sıra karakter .ile değiştirilir _. (Chrome 23, Firefox 13 ve Internet Explorer 9, tümü Win7'de test edilmiştir.)


11
Bu uyarıyı eklediğin için teşekkürler dostum. Kullanmaya başlamak üzereydim. ayırıcı olarak.
Davis Peixoto

1
: İç white-space artı işareti (+) bu sayfaya göre değiştirilir w3schools.com/tags/tryit.asp?filename=tryhtml_form_submit
thdoan

2
Ben @ Dave. Aynı şeyi düşünenler için, muhtemelen dizi tarzı girdiler arıyorsunuz: first[second]yerine first.second.
JD

5
Bunun sunucuya özgü bir şey olduğunu, tarayıcıyla ilgili bir şey olmadığını belirtmek isterim. Win7 FF3 / 3.5 / 31, IE5 / 7/8/9/10 / Edge, Chrome39 ve Safari Windows 5 üzerinde test edilmiş ve tümü POST’taki ad olarak "test this.stuff" (dört boşluk) göndermiştir. VS2012 ile paketlenmiş ASP.NET dev sunucusu.
abluejelly

3
Aşağıdaki @ Aleksander'ın yorumuna bakın. Bazı sunucular "." '_', ancak tarayıcıda olmuyor.
Jeff Lowery

38

Bir [X] HTML dosyasına ekleyebileceğiniz herhangi bir karakter, bir <input name>. Allain'in yorumunun dediği gibi, kapsayıcı <input name>olarak tanımlandığından CDATA, oraya koyamayacağınız tek şey, temeldeki standardın (SGML veya XML) izin vermediği kontrol kodları ve geçersiz kod noktalarıdır.

Allain, W3'ü HTML4 spesifikasyonundan aktardı:

Not. "Get" yöntemi, form veri kümesi değerlerini ASCII karakterleriyle sınırlar. Tüm ISO10646 karakter kümesini kapsayacak şekilde yalnızca "post" yöntemi (enctype = "multipart / form-data" ile) belirtilir.

Ancak bu pratikte gerçekten doğru değil.

Teori, application/x-www-form-urlencodedverilerin form adları veya değerleri için bir kodlama belirleme mekanizmasına sahip olmamasıdır, bu nedenle her ikisinde de ASCII olmayan karakterlerin kullanılması "belirtilmemiştir" ve multipart/form-databunun yerine POSTed kullanmalısınız.

Ne yazık ki, gerçek dünyada hiçbir tarayıcı, bir multipart/form-dataPOST istek gövdesinin alt bölüm başlıklarında teorik olarak yapabilse bile alanlar için bir kodlama belirtmez . (Mozilla'nın bir kez uygulamaya çalıştığına inanıyorum, ancak sunucuları kırdığı için geri adım attı.)

Ve hiçbir tarayıcı, kodlanmış ASCII olmayan alan adlarını çok parçanın alt bölüm başlıklarına eklemek için gerekli olabilecek şaşırtıcı derecede karmaşık ve çirkin RFC2231 standardını uygulamaz . Her durumda, tanımlayan HTML spesifikasyonu multipart/form-datadoğrudan RFC2231'in kullanılması gerektiğini söylemez ve yine denerseniz sunucuları kırabilir.

Yani durumun gerçekliği, hangi formda olursa olsun, bir form sunumundaki isimler ve değerler için hangi kodlamanın kullanıldığını bilmenin bir yolu yoktur. Tarayıcıların ASCII olmayan karakterler içeren alan adları ve değerleriyle yapacakları, GET ve her iki tür POST formu için de aynıdır: kullanılan formu içeren sayfayı kodlayarak bunları kodlar. ASCII olmayan GET form adları her şeyden daha fazla bozuk değildir.

DLH:

Yani ismin diğer elemanlar için olduğundan farklı bir veri türü var mı?

Aslında kimin tek unsur nameniteliktir değil CDATAise <meta>. Tüm farklı kullanımları için HTML4 spesifikasyonunun öznitelik listesine bakın name; farklı öğeler üzerinde birçok farklı anlama sahip aşırı yüklenmiş bir öznitelik adıdır. Bu genellikle kötü bir şey olarak kabul edilir.

Bununla birlikte, genellikle bu günlerde name, form alanları (bir kontrol adı olduğu) ve param(eklentiye özgü bir parametre tanımlayıcısı olduğu) dışında kaçınmanız gerekir . Bu, uğraşılması gereken sadece iki anlamdır. Sayfadaki veya namegibi unsurları tanımlamak için eski usul kullanımından kaçınılmalıdır ( bunun yerine kullanın).<form><a>id


9

Allain'in yorumu, OP'nin doğrudan sorusuna yanıt verirken ve bobince bazı mükemmel derinlemesine bilgiler sağlasa da, birçok kişinin buraya daha spesifik bir soruya cevap aramak için geldiğine inanıyorum: "Formun giriş adı özniteliğinde bir nokta karakteri kullanabilir miyim?"

Bu konu ilk sonuç olarak ortaya çıktığı için bu bilgiyi araştırdığımda tahmin ettim ki bulduklarımı da paylaşabilirim.

İlk olarak, Matthias şunları iddia etti:

karakter. _ ile değiştirilir

Bu doğru değil. Tarayıcının aslında bu tür bir işlemi 2013'te yaptığını bilmiyorum - yine de bundan şüpheliyim. Tarayıcılar nokta karakterleri oldukları gibi gönderir (POST verilerinden bahsederken)! Herhangi bir düzgün tarayıcının geliştirici araçlarında kontrol edebilirsiniz.

Lütfen, abluejelly'nin muhtemelen birçokları tarafından gözden kaçırılan küçük yorumuna dikkat edin:

Bunun sunucuya özgü bir şey olduğunu, tarayıcıyla ilgili bir şey olmadığını belirtmek isterim. Win7 FF3 / 3.5 / 31, IE5 / 7/8/9/10 / Edge, Chrome39 ve Safari Windows 5 üzerinde test edilmiş ve tümü POST’taki ad olarak "test this.stuff" (dört boşluk) göndermiştir. VS2012 ile paketlenmiş ASP.NET dev sunucusu.

Apache HTTP sunucusu (v2.4.25) ile kontrol ettim ve gerçekten de "foo.bar" gibi giriş adı "foo_bar" olarak değiştirildi. Ancak "foo [foo.bar]" gibi bir adda bu nokta _ ile değiştirilmez!

Sonucum: Noktaları kullanabilirsiniz, ancak kullanılan HTTP sunucusuna bağlı olarak bazı beklenmedik davranışlara yol açabileceği için kullanmam .


ne oluyor? Name = "foo bar" kullanırsam.
squal

0

HTML giriş etiketinin id ve name niteliklerini mi kastediyorsunuz?

Öyleyse, izin verilen "giriş" ad karakterlerini yalnızca az (AZ), 0-9 ve sınırlı bir noktalama aralığı (".", ",", Vb.) Olarak sınırlamak (veya dönüştürmek) çok cazip olur yalnızca XSS açıklarından yararlanma potansiyelini sınırlamak için, vb.

Ek olarak, neden kullanıcının giriş etiketinin herhangi bir yönünü kontrol etmesine izin verelim? (Doğrulama perspektifinden, giriş etiketi adlarının "custom_1", ​​"custom_2" vb. Olmasını sağlamak ve sonra bunları gerektiği gibi eşlemek sonuçta daha kolay olmayabilir.)


İsimlerimin bu şekilde oluşturulmasına son vermeyebilirim. Ofisimdeki daha az teknoloji meraklısı üyelerin form alanlarını belirlemelerine izin vermenin yollarını düşünme sürecindeyim.
DLH

@DLH Yukarıdaki gibi sadece ara bir yaklaşıma (isim çatışmaları vb. Riskini ortadan kaldırmak için) cazip gelirim. :-)
John Parker
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.