Welche Zeichen sind im HTML-Namensattribut im Eingabe-Tag zulässig?

82

Ich habe ein PHP-Skript, das <input>s dynamisch generiert , daher habe ich mich gefragt, ob ich Zeichen im nameAttribut filtern muss .

Ich weiß, dass der Name mit einem Buchstaben beginnen muss, aber ich kenne keine anderen Regeln. Ich denke, eckige Klammern müssen erlaubt sein, da PHP diese verwendet, um Arrays aus Formulardaten zu erstellen. Wie wäre es mit Klammern? Räume?

DLH
quelle

Antworten:

28

Die einzige wirkliche Einschränkung, welche Zeichen in Formularsteuerungsnamen angezeigt werden können, besteht darin, dass ein Formular mit GET gesendet wird

"Die Methode" get "beschränkt Formulardatensatzwerte auf ASCII-Zeichen." Referenz

Es gibt einen guten Faden auf sie hier .

Allain Lalonde
quelle
Hat namealso ein anderer Datentyp für <input>als für andere Elemente? Interessant.
DLH
Es ist das gleiche wie <a>und die meisten Elemente, aber anders als<meta>
Alohci
4
Ja. Ich habe gerade versucht, <input>mit allen Arten von Mist im nameAttribut, und es in HTML 4.01 Strict validiert. Akzeptiert!
DLH
Twitter verwendet diese Art von Namen, ein besonderer Grund, um Adv ...... Benutzer [Benutzerpasswort], Benutzer [E-Mail]
Vishal Sharma
"Die einzige wirkliche Einschränkung, welche Zeichen in Formularsteuerungsnamen angezeigt werden können, besteht darin, dass ein Formular mit GET gesendet wird." - Nein. Dies schränkt nicht ein, was im Namen angezeigt werden kann. Es bedeutet lediglich, dass es bei der Konvertierung URL-codiert sein muss zu einer URL.
Quentin
53

Beachten Sie, dass nicht alle Zeichen für nameAttribute von Formularfeldern gesendet werden (auch bei Verwendung von POST)!

Leerzeichen werden abgeschnitten und innere Leerzeichen sowie das Zeichen .werden durch ersetzt _. (Getestet in Chrome 23, Firefox 13 und Internet Explorer 9, alle Win7.)

Matthias Samsel
quelle
11
Danke, dass du diesen Hinweis hinzugefügt hast, Kumpel. Ich wollte gerade mit dem Codieren beginnen. als Trennzeichen.
Davis Peixoto
1
Der innere Leerraum wird gemäß dieser Seite durch das Pluszeichen (+) ersetzt: w3schools.com/tags/tryit.asp?filename=tryhtml_form_submit
Uhr
1
Ich zweite @ Dave. Für diejenigen, die das Gleiche dachten, suchen Sie wahrscheinlich nach Eingaben im Array-Stil: first[second]statt first.second.
JD
5
Ich möchte darauf hinweisen, dass dies eine serverspezifische Sache ist, keine Browsersache. Getestet unter Win7 FF3 / 3.5 / 31, IE5 / 7/8/9/10 / Edge, Chrome39 und Safari Windows 5, und alle haben "test this.stuff" (vier führende Leerzeichen) als Namen in POST an gesendet Der mit VS2012 gebündelte ASP.NET-Entwicklungsserver.
Abluejelly
3
Siehe @ Aleksanders Kommentar unten. Einige Server konvertieren möglicherweise '.' auf '_', aber es passiert nicht im Browser.
Jeff Lowery
38

Jedes Zeichen, das Sie in eine [X] HTML-Datei aufnehmen können, kann problemlos in eine eingefügt werden <input name>. Wie Allains Kommentar sagt, <input name>wird er als enthaltend definiert. CDATADas einzige, was Sie dort nicht eingeben können, sind die Steuercodes und ungültigen Codepunkte, die der zugrunde liegende Standard (SGML oder XML) nicht zulässt.

Allain zitierte W3 aus der HTML4-Spezifikation:

Hinweis. Die Methode "get" beschränkt Formulardatensatzwerte auf ASCII-Zeichen. Nur die "post" -Methode (mit enctype = "multipart / form-data") wird angegeben, um den gesamten ISO10646-Zeichensatz abzudecken.

In der Praxis trifft dies jedoch nicht wirklich zu.

Die Theorie besagt, dass application/x-www-form-urlencodedDaten keinen Mechanismus zum Angeben einer Codierung für die Namen oder Werte des Formulars haben. Daher wird die Verwendung von Nicht-ASCII-Zeichen in beiden nicht als funktionierend angegeben, und Sie sollten multipart/form-datastattdessen POSTed verwenden.

Leider gibt in der realen Welt kein Browser eine Codierung für Felder an, selbst wenn dies theoretisch möglich wäre, und zwar in den Unterteil-Headern eines multipart/form-dataPOST-Anforderungshauptteils. (Ich glaube, Mozilla hat einmal versucht, es zu implementieren, hat sich jedoch zurückgezogen, da es Server kaputt gemacht hat.)

Und kein Browser implementiert den erstaunlich komplexen und hässlichen RFC2231- Standard, der erforderlich wäre, um codierte Nicht-ASCII-Feldnamen in die Subpart-Header des Multiparts einzufügen. In jedem Fall multipart/form-databesagt die definierte HTML-Spezifikation nicht direkt, dass RFC2231 verwendet werden sollte, und es würde wiederum Server beschädigen, wenn Sie es versuchen würden.

Die Realität sieht also so aus, dass es keine Möglichkeit gibt zu wissen, welche Codierung für die Namen und Werte in einer Formularübermittlung verwendet wird, unabhängig davon, um welche Art von Formular es sich handelt. Was Browser mit Feldnamen und Werten tun, die Nicht-ASCII-Zeichen enthalten, ist für GET und beide Arten von POST-Formularen gleich: Sie codieren sie mithilfe der Codierung der Seite, die das verwendete Formular enthält. Nicht-ASCII-GET-Formularnamen sind nicht fehlerhafter als alles andere.

DLH:

Der Name hat also einen anderen Datentyp als für andere Elemente?

Eigentlich ist das einzige Element, dessen nameAttribut nicht CDATAist <meta>,. In der Attributliste der HTML4-Spezifikation finden Sie alle Verwendungsmöglichkeiten von name; Es ist ein überladener Attributname, der viele verschiedene Bedeutungen für die verschiedenen Elemente hat. Dies wird allgemein als eine schlechte Sache angesehen.

Normalerweise vermeiden Sie dies heutzutage jedoch, nameaußer in Formularfeldern (wo es sich um einen Steuerelementnamen handelt) und param(wo es sich um eine Plugin-spezifische Parameter-ID handelt). Das sind nur zwei Bedeutungen, mit denen man sich auseinandersetzen muss. Die Verwendung von nameElementen wie <form>oder <a>auf der Seite in der alten Schule sollte vermieden werden ( idstattdessen verwenden).

Bobince
quelle
9

Während Allains Kommentar die direkte Frage von OP beantwortete und Bobince einige brillante, detaillierte Informationen lieferte, glaube ich, dass viele Leute hierher kommen, um eine Antwort auf eine spezifischere Frage zu suchen: "Kann ich ein Punktzeichen im Attribut für den Eingabenamen des Formulars verwenden?"

Als dieser Thread als erstes Ergebnis auftauchte, als ich nach diesem Wissen suchte, vermutete ich, dass ich genauso gut teilen kann, was ich gefunden habe.

Erstens behauptete Matthias ':

Charakter. werden durch _ ersetzt

Das ist falsch. Ich weiß nicht, ob Browser diese Art von Operation bereits 2013 durchgeführt haben - aber ich bezweifle das. Browser senden Punktzeichen so wie sie sind (über POST-Daten)! Sie können es in den Entwicklertools jedes anständigen Browsers überprüfen.

Bitte beachten Sie diesen winzigen kleinen Kommentar von abluejelly, der wahrscheinlich von vielen übersehen wird:

Ich möchte darauf hinweisen, dass dies eine serverspezifische Sache ist, keine Browsersache. Getestet unter Win7 FF3 / 3.5 / 31, IE5 / 7/8/9/10 / Edge, Chrome39 und Safari Windows 5, und alle haben "test this.stuff" (vier führende Leerzeichen) als Namen in POST an gesendet Der mit VS2012 gebündelte ASP.NET-Entwicklungsserver.

Ich habe es mit dem Apache HTTP Server (v2.4.25) überprüft und tatsächlich wurde der Eingabename wie "foo.bar" in "foo_bar" geändert. Aber in einem Namen wie "foo [foo.bar]" wird dieser Punkt nicht durch _ ersetzt!

Mein Fazit: Sie können Punkte verwenden, aber ich würde es nicht verwenden, da dies je nach verwendetem HTTP-Server zu unerwarteten Verhaltensweisen führen kann .

Aleksander Stelmaczonek
quelle
was geschieht? Wenn ich name = "foo bar" benutze.
Squal
0

Meinen Sie die ID- und Namensattribute des HTML-Eingabe-Tags?

Wenn ja, wäre ich sehr versucht, erlaubte "Eingabe" -Namenszeichen in nur az (AZ), 0-9 und einen begrenzten Satzzeichenbereich (".", "," Usw.) einzuschränken (oder umzuwandeln). wenn auch nur, um das Potenzial für XSS-Exploits usw. zu begrenzen.

Warum sollte der Benutzer außerdem einen Aspekt des Eingabe-Tags steuern lassen? (Könnte es aus Validierungssicht letztendlich nicht einfacher sein, die Namen der Eingabe-Tags "custom_1", ​​"custom_2" usw. beizubehalten und diese dann nach Bedarf zuzuordnen.)

John Parker
quelle
Möglicherweise werden meine Namen nicht so generiert. Ich bin gerade dabei, mir Gedanken darüber zu machen, wie die weniger technisch versierten Mitglieder in meinem Büro Formularfelder angeben können.
DLH
@DLH Ich wäre versucht (um das Risiko von Namenskonflikten usw. zu beseitigen), nur einen Zwischenansatz wie oben zu wählen. :-)
John Parker