パスワード用途以外にinput要素のtype="password"を使うのは間違っていない

パスワード用途以外にinput要素のtype="password"を使うのはどうやら間違っている - F.Ko-Jiの「一秒後は未来」(blog.fkoji.com) に対する返信記事です。

当該記事では Chrome の挙動をもとに

セキュリティコードの入力欄に type="password" を使うというのが意味的にも間違っていると Chrome は言いたいのだなと解釈しました。

と締めていますが、 Chrome 問題を抜きにして意味的に間違っているか否かを確認するために、HTMLの仕様書を読み返してみました。

  1. HTML 2.0(RFC 1866)
  2. HTML 3.2
  3. HTML 4.01
  4. HTML5
  5. まとめ

HTML 2.0(RFC 1866)

§

An <INPUT> element with `TYPE=PASSWORD' is a text field as above, except that the value is obscured as it is entered. (see also: 10, "Security Considerations").

8.1.2.2. Password Field: INPUT TYPE=PASSWORD(tools.ietf.org)

入力した値を不明瞭(obscure)にするとしか書かれておらず、このすぐ後にログインパスワードで使うコード例が掲載されているものの、パスワード以外での使用については明言されていません。

HTML 3.2

§

This is like type=text, but echoes characters using a character like * to hide the text from prying eyes when entering passwords. You can use size and maxlength attributes to control the visible and maximum length exactly as per regular text fields.

INPUT text fields, radio buttons, check boxes, ...(W3C)

要約すると、重要なのは以下の2点です。

  • 機能としては type=text に似ている
  • アスタリスクなどの文字で表示され、パスワードを入力するときに覗き見から隠される

when entering passwordsとあるように、パスワード入力のためと書かれていますね。

HTML 4.01

§

Like "text", but the input text is rendered in such a way as to hide the characters (e.g., a series of asterisks). This control type is often used for sensitive input such as passwords. Note that the current value is the text entered by the user, not the text rendered by the user agent.

17.4.1 Control types created with INPUT(W3C)

HTML 3.2 と異なりfor sensitive input such as passwordsと、パスワードに限らずセンシティブな情報に対して使えると明記されました。

HTML5

§

type属性のキーワードと状態を示した表(W3C) では、type="password"Text with no line breaks (sensitive information)と説明されており、 HTML 4.01 と同じく(パスワードに限らず)センシティブな情報に対して使えると理解できます。

また Password state の本文には、以下のように「ユーザーエージェントは値を不明瞭(obscure)にすべき」以外の指示や制約は書かれていません。

The input element represents a one line plain text edit control for the element's value. The user agent should obscure the value so that people other than the user cannot see it.

4.10.5.1.6 Password state (type=password)(W3C)

ただし obscure 化には新しい条件が加えられ、値を見ることができないのはユーザー以外(other than the user)とされました。たとえば Internet Explorer 10 以降はパスワード表示ボタン[1]を押すことにより、入力値を確認することができますが、そういうブラウザの挙動も仕様的に問題ないと言えます。

まとめ

§

HTML仕様的には、type="password" はパスワードに限らずセンシティブな情報全般に使えると理解できます。

  • HTML 3.2 の仕様書ではパスワードのみに使うような書き方がされていますが、あくまで表現の問題でそれ以外の用途を禁止しているものではないこと、またそもそもそんな古い時代の仕様を参照する必要はないでしょう。

とはいえ、パスワードにしろセキュリティコードにしろ、センシティブな情報を取り扱うからにはブラウザの挙動を知ることも重要であり、元記事で指摘されているような Chrome の挙動も考えると、センシティブだからと何でも type="password" にしてしまうのではなく慎重な判断をする必要がありそうです。難しいですね。

脚注

  • 1.

    正式名称は調べていません。パスワードを入力すると入力欄の右隅に現れる目のアイコンのやつです。 ↩ 戻る