[1] [[HTML]] の [CODE(HTMLa)[[[type]]]] が [DFN[[CODE(HTML)[password]]]] の
[CODE(HTMLe)[[[input]]]] 要素は、単一行文章入力[[制御子]]を定義します。
この制御子では、入力された文章は隠されます。
[2]
仕様書:
- [[SI 4281]]:1998
-- [CSECTION[6.1.4 Elements with no directionality]]
-- [CSECTION[8.2 The Keyboard]]
- [[HTML 4]] ([[Web Forms 1.0]])
-- text input
-- 17.4 The [CODE(HTMLe)[INPUT]] element
[3] [[属性]]:
,属性名 ,属性値 ,既定値 ,説明 ,出典
,[CODE(HTMLa)[[[accesskey]]]] ,[CODE(SGML)[%[[Character]]]] , , ,[HTML 4]
,[CODE(HTMLa)[[[align]]]] , , ,配置 ,[HTML 4] 非推奨
,[CODE(HTMLa)[[[autocomplete]]]] ,[CODE(SGML)[[CODE(HTML)[[[on]]]] | [CODE(HTML)[[[off]]]]]] , ,自動補完 ,"[[WinIE 5]]+, [[Web Forms 2.0]]"
,[CODE(HTMLa)[[[class]]]] , , ,[[級]] ,[HTML 4] %[[coreattrs]]
,[CODE(HTMLa)[[[datafld]]]] , , ,データ欄 ,[HTML 4] 予約
,[CODE(HTMLa)[[[dataformatas]]]] , , ,データ書式 ,[HTML 4] 予約
,[CODE(HTMLa)[[[datasrc]]]] ,[CODE(SGML)[%[[URI]]]] ,(なし) ,データ源 ,[HTML 4] 予約
,[CODE(HTMLa)[[[dir]]]] , , ,[[書字方向]] ,[HTML 4] %[[i18n]]
,[CODE(HTMLa)[[[disabled]]]] ,(真偽値属性) ,(偽) ,無効 ,[HTML 4]
,[CODE(HTMLa)[[[id]]]] , , ,一意識別子 ,[HTML 4] %coreattrs
,[CODE(HTMLa)[[[inputmode]]]] , , ,入力モード ,OMA 規格 ,[[XHTMLMP]]
,[CODE(HTMLa)[[[istyle]]]] , , ,入力モード ,[[iモード]] 2.0
,[CODE(HTMLa)[[[lang]]]] , , ,[[自然言語]] ,[HTML 4] %i18n
,[CODE(HTMLa)[[[xml]]:lang]] , , ,自然言語 ,[XHTML 1]
,[CODE(HTMLa)[[[language]]]] , , ,スクリプト言語 ,[[WinIE 4]]+
,[CODE(HTMLa)[[[maxlength]]]] ,[CODE(SGML)[[[NUMBER]]]] , ,最大長 ,[HTML 4]
,[CODE(HTMLa)[[[name]]]] , , ,制御子名 ,[HTML 4]
,[CODE(HTMLa)[[[onblur]]]] ,[CODE(SGML)[%[[Script]]]] , ,焦点を失した時 ,[HTML 4]
,[CODE(HTMLa)[[[onchange]]]] ,[CODE(SGML)[%[[Script]]]] , ,現在値変更時 ,[HTML 4]
,[CODE(HTMLa)[[[onclick]]]] , , , ,[HTML 4] %[[events]]
,[CODE(HTMLa)[[[ondblclick]]]] , , , ,[HTML 4] %events
,[CODE(HTMLa)[[[onfocus]]]] ,[CODE(SGML)[%[[Script]]]] , ,焦点を得た時 ,[HTML 4]
,[CODE(HTMLa)[[[onkeydown]]]] , , , ,[HTML 4] %events
,[CODE(HTMLa)[[[onkeypress]]]] , , , ,[HTML 4] %events
,[CODE(HTMLa)[[[onkeyup]]]] , , , ,[HTML 4] %events
,[CODE(HTMLa)[[[onmousedown]]]] , , , ,[HTML 4] %events
,[CODE(HTMLa)[[[onmousemove]]]] , , , ,[HTML 4] %events
,[CODE(HTMLa)[[[onmouseout]]]] , , , ,[HTML 4] %events
,[CODE(HTMLa)[[[onmouseover]]]] , , , ,[HTML 4] %events
,[CODE(HTMLa)[[[onmouseup]]]] , , , ,[HTML 4] %events
,[CODE(HTMLa)[[[onselect]]]] ,[CODE(SGML)[%[[Script]]]] , ,文選択時 ,[HTML 4]
,[CODE(HTMLa)[[[readonly]]]] ,(真偽値属性) ,(偽) ,読取専用 ,[HTML 4]
,[CODE(HTMLa)[[[size]]]] , , ,寸法 ,[HTML 4]
,[CODE(HTMLa)[[[style]]]] , , ,スタイル情報 ,[HTML 4] %coreattrs
,[CODE(HTMLa)[[[tabindex]]]] ,[CODE(SGML)[[[NUMBER]]]] , ,タブ順 ,[HTML 4]
,[CODE(HTMLa)[[[title]]]] , , ,注釈的題 ,[HTML 4] %coreattrs
,[CODE(HTMLa)[[[type]]]] ,'''[CODE(HTML)[text]]''' ,[CODE(HTML)[[[text]]]] ,制御子の種類 ,[HTML 4]
,[CODE(HTMLa)[[[value]]]] , , ,初期値 ,[HTML 4]
,[CODE(HTMLa)[[[vcard_name]]]] , , ,自動補完 ,[[WinIE 5]]+
[[#comment]]
* 名前
[7] 制御子名は [CODE(HTMLa)[name]] 属性で指定します。
[[#comment]]
* 初期値と現在値
[6] [[初期値]]は [CODE(HTMLa)[value]] 属性で指定します。
[[現在値]]は、はじめ初期値です。その後は、[[利用者]]が編集した結果が現在値です。
[17] '''Bidi と提出値''': [[利用者]]が入力欄の[[基底方向性]]を上書きした時は、
それを
[WEAK[([[提出]]する[[文字符号化方式]]で可能なら)]]
[CODE(char)[[[LRM]]]] や [CODE(char)[[[RLM]]]]
で囲んで示すべきです [SRC[SI 4281:1998 8.2]]。
[[#comment]]
* レンダリング
[18] '''制御子と bidi''':
[[制御子]]自体は、 [WEAK[(中身である[[現在値]]と関わりなく)]]
方向性に関して[[中立]]な1[[文字]]であるかのように [[bidi]]
的には扱います [SRC[SI 4281:1998 6.1.4]]。
[19] '''方向と入力モード''':
[[ヘブライ語]]に対応した[[利用者エージェント]]の場合、
[[右]]から[[左]]の入力欄では、[[カーソル]]の初期位置は右側とし、
入力モード ([[鍵盤言語]]) は[[ヘブライ語]]とし、
[[左]]から[[右]]の入力欄では、[[カーソル]]の初期位置は左側とし、
入力モード ([[鍵盤言語]]) は異言語とするべきです。
[SRC[SI 4281:1998 8.2]]
[20] '''Bidi と合言葉''':
そもそも合言葉で[[書字方向]]が混在した場合、どうなるのでしょうか?
代替文字表示を行っている場合は本来の表示順と代替表示の表示順が必ずしも一致しないかもしれません
[WEAK[(し、本来の表示順に合わせているかもしれません)]]
が、これは何を意味するのでしょうか?
- 表示順が変わる (変わり得る) ことによる安全性への影響は?
利用者への影響は?
- 代替文字を方向によって変えるとしたら、安全性への影響は?
利用者への影響は?
[21] '''入力システムと合言葉''':
一部のシステムでは、[[仮名漢字変換]]を合言葉入力で使うことができません。
別のシステムでは使うことができますが、変換中の文字も代替文字になります。
仮名漢字変換を使うことができ、変換中の文字は代替文字にならないでそのまま表示されるシステムも考えられます。代替文字になっていても、
変換候補選択画面では通常通りの表示になっていることもあります。
システムによっては仮名漢字変換で[[再変換]]の機能があります。
これが合言葉入力でもはたらき、変換候補選択画面では通常通り隠さず表示されるとすると、
一旦正当な利用者が合言葉を入力した状態で席を離れ、
不正な利用者がその間に再変換して合言葉を盗む可能性があります。
[[#comment]]
** 入力の隠蔽
[8] UA は、入力された文字列 (初期値・現在値) を隠してレンダリングします。
[SRC[HTML 4 17.4.1]]
*** 代替文字による表現
[24] 例えば文字を星印 ([CODE(char)[*]]) にかえてレンダリングします。
[SRC[HTML 4 17.4.1]]
[9] 実際の UA では、 [CODE(char)[*]] の他、 [CODE(char)[●]]
なども代替文字として使われています。 [[Windows Vista]] など新しい [[Windows]]
では「[[●]]」が標準的な代替文字に採用しているようで、
[[Firefox]] など [[Windows]] 上で動作する [[Webブラウザー]]もそれに沿って[[レンダリング]]しているようです。
[25] しかし、旧来の「[[*]]」を想定して[[デザイン]]されていた [[Web頁]]は[[文字幅]]の異なる「[[●]]」
(一般的な日本語環境ではそれぞれ[[半角]]、[[全角]]の幅) が表示されると十分な数の[[文字]]を同時に提示できなくなってしまうことがあります。
特に[[暗証番号]]の類は4桁など狭い幅で表示され、「[[●]]」だと半分程度しか表示されないことがあります。
[30] この[[レンダリング]]方法では、表示画面を覗き込まれると[[合言葉]]の[[文字数]]が知られてしまうおそれがあります。
[31]
[CITE[Bug 97811 - use bullets instead of asterisks to block out password characters]]
([[名無しさん]] [WEAK[2006-10-25 23:41:19 +00:00]])
*** 空文字列による表現
[10]
オペレーティング・システムのログイン画面や [[Unix]] 系 [[CUI]]
[[ソフトウェア]]などで合言葉を入力する際には入力があっても空文字列としてレンダリングする
[WEAK[(何もレンダリングしない)]] ことがあります。
覗かれても文字数すら分からないという点ではより安全かもしれませんが、
入力されているかどうかが分からないので、特に
[WEAK[(相手が信用できるかすらわからない分散システムである)]]
ウェブのブラウザではそういうのは望ましくないかもしれません。
但し、入力欄の枠線の色を変えるなどして入力されているかどうかを容易に判別できるなら、
別に問題とはならないでしょう。
** 隠さず表示
[12]
システム環境によっては、
合言葉であっても隠さないで入力されたとおりレンダリングするような設定ができることがあります。
ウェブ・ブラウザによってはシステムのそのような設定を反映するかもしれませんし、
独自の設定でそれが可能かもしれません。
[29]
[[携帯電話]]上の [[Webブラウザー]]では入力中は文字入力の画面に切り替わり、
そこでは[[平文]]のまま[[レンダリング]]されることがあります。
* 保安性
[11] [CODE(HTML)[password]] 制御子は、[[合言葉]]などを要求するために使われます。
しかし、 UA は入力を隠してレンダリングしますが、
その他の点では他の制御子と扱いは変わりません。
[SRC[HTML 4 17.4.1]]
** ネットワークを通じた提出
[27] フォームの[[提出]]の方法に依存しますが、普通に [[HTTP]]
で送ればおそらく平文のままとなるでしょう。重要な情報であれば [[TLS]]
を使うなどして暗号化した方が安全です。
[23]
[CITE[passwordsInTheClear-52]] ([TIME[2008-02-14 10:16:19 +09:00]] 版)
** ソースの表示
[13]
また、 [CODE(HTMLa)[value]] 属性に指定される初期値は当然平文で記述します。
たとえ UA にレンダリングしなくても、ソースを見ればわかります。
ですから、一連の作業 ([[セッション]]) の中で、
前に入力された合言葉を後から [CODE(HTML)[password]] の [CODE(HTMLa)[value]]
属性で送りなおすと危険な場合もあります (例えば、
作業者が途中で席を外した隙に他の人がソースを覗いたらどうでしょう)。
[28]
ソースに直接記述されていない入力中の値であっても、 [[Firefox]]
の [[DOM Inspector]] のように [[DOM]] の値を閲覧できる方法が用意されていると読み取られてしまうことがあり、
注意が必要です。
** 利用者界面の機能を通じた複写
[22]
多くの [[GUI]] システムなどでは[[クリップ板]]を使った[[複写]]や[[貼り付け]]の仕組みが用意されており、
合言葉入力欄でもこれが有効なことがあります。
しかし、合言葉を複写して他の場所に貼り付けることで合言葉が盗まれる危険性があります。
クリップ板以外でも、例えば[[マウス]]による[[ドラッグ]]及び[[ドロップ]]で[[文字列]]を移動する機能が実装されていると、
合言葉入力欄から他の欄に移動できてしまうかもしれません。
** スクリプトによる取得
[14]
スクリプトなどの手段を使うと、初期値や現在値が取得できるかもしれません。
また、環境によっては、その環境で用意されている [[widget]] ([[GUI]] 部品)
を使うと (たとえレンダリングされていなくても)
現在値を別のプログラムから取得できるかもしれません。
特に UA の設計者は、スクリプトからの access 可能範囲の限定を徹底するなど、
十分な配慮を行うべきです。
** 補完機能
[15]
現在では、多くの UA で[[自動補完]]機能が用意されていて、
利用者は以前に入力した合言葉を毎回入力する必要はありません。
しかし、この機能が危険と隣り合わせであることは自明です。
特に共用の環境では、この機能は常に切っておくべきです。
また、以前に保存した合言葉を利用者が自由に管理できるように
(何を保存したか把握できるように、いつでも削除できるように) するべきです。
但し、何を保存したか把握できるような機能は、同時に、
悪意を持った人がその環境を利用した時に何を悪用できるのか把握できる機能でもあります。
実装においては (ファイル・システムのどこにどう保存するかを含めて)
十分に留意するべきです。
[26] [[Firefox]] は[[合言葉]]を記憶し、[[自動補完]]できる機能を備えていますが、
記憶された[[合言葉]]は、「[[マスターパスワード]]」を設定しない限り[[平文]]で保存され、
設定画面でも表示することが可能なため、注意が必要です。
* 関連
[4] [CODE(HTMLa)[[[type]]]] 属性の既定値は [CODE(HTML)[text]]
です。また、多くの UA は [CODE(HTMLa)[type]] 値を認識できない
(未対応の値が指定された) 時には [CODE(HTML)[text]]
と見なして処理するようです。
[5] 同じ文章入力[[制御子]]として、 [CODE(HTMLa)[type]] が
[CODE(HTML)[[[text]]]] の入力内容を隠さない単一行入力制御子があります。
入力内容を隠さない複数行入力可能な [CODE(HTMLe)[[[textarea]]]]
要素による制御子はありますが、複数行入力可能で入力を隠す制御子はありません。
[[#comment]]
* メモ
[16]
利用者が要素を[[活性化]]すると ([[焦点]]をあてると)、入力欄は編集可能な状態になります [SRC[HTML 4 17.11.2]]。
[32] [[Windows XP]] の[[ログオン]]画面の[[合言葉]]入力欄は [[CapsLock]]
が有効だと[[バルーン]]が出て教えてくれます。こういう配慮があるといいですね。
[33] [CITE[IRC logs: freenode / #whatwg / 20100319]]
([TIME[2010-03-28 00:32:28 +09:00]] 版)
[34] [CITE[WebサイトにXSS脆弱性があった場合にブラウザのパスワード保存機能で保存したパスワードを読み取り可能かどうか - 金利0無利息キャッシング – キャッシングできます - subtech]]
( ([TIME[2011-04-29 05:48:25 +09:00]] 版))
[35] [CITE[''''''[''''''whatwg'''''']'''''' password-related feedback on forms]]
( ([TIME[2012-05-05 09:16:19 +09:00]] 版))