結論(64文字以上のパスワードをHTMLで妨げない)
64文字以上のパスワードをHTMLで妨げないとは、パスワード欄に maxlength="16" のような64未満の上限を指定せず、少なくとも64文字までのパスワードを入力できるようにすることです。OWASP ASVS 5.0.0 V6.2.9とNIST SP 800-63B-4は少なくとも64文字の受け入れを求めています。短い上限はパスワードマネージャーの長い生成値やパスフレーズを使えなくし、気付かない切り捨てでログイン不能も招きます。
この記事のポイント
- HTMLのmaxlengthは入力できる最大文字数をブラウザに制限させる属性で、短い上限はパスワードの強度を頭打ちにします。
- ASVS 5.0.0 V6.2.9(L2)は少なくとも64文字の許可を、V6.2.8(L1)とNIST SP 800-63B-4は切り詰めない検証を求めています。
- 上限を設けるなら64文字を大きく上回る値(例:128〜256文字程度)とし、超過時は切り詰めずにエラーとします。
- bcryptは実装の多くで72バイトまでしか扱わないため、長いパスワードを想定するならArgon2idなどを検討します。
- セキュリティAIチェッカーは、maxlengthが1〜63のパスワード欄が1件でもあれば×、なければ○、パスワード欄がなければ対象外と判定します。
| 診断項目名 | 64文字以上のパスワードをHTMLで妨げない |
|---|---|
| 項目ID | forms.password-client-length |
| 分類 | フォーム・パスワード入力 |
| 重大度・配点の重み | 中(medium) 重み 2 |
| 関連する標準・ガイドライン | OWASP ASVS 5.0.0 V6.2.9(少なくとも64文字のパスワードを許可する/L2)・V6.2.8(切り詰め・大文字小文字変換をせず受け取ったとおりに検証する/L1)、NIST SP 800-63B-4 3.1.1.2(最大長は少なくとも64文字を許可すべき=SHOULD、切り詰めてはならない=SHALL)、OWASP WSTG-ATHN-07、CWE-521(Weak Password Requirements) |
64文字以上のパスワードをHTMLで妨げないとは
64文字以上のパスワードをHTMLで妨げないとは、ログイン画面や登録画面のパスワード欄に、maxlength="16" や maxlength="20" のような64文字未満の上限を設けず、少なくとも64文字までのパスワードを入力できるようにすることです。
パスワード欄に短い上限があると、利用者はそれ以上長いパスワードを入力できません。パスワードマネージャーが生成する長いランダム値や、複数の単語をつなげたパスフレーズが使えなくなり、パスワードの強度が頭打ちになります。
ASVSとNISTは、少なくとも64文字までのパスワードを受け付けるよう求めています。セキュリティAIチェッカーのこの項目は、取得したHTMLのパスワード欄に64未満の maxlength が指定されていないかを確認します。
maxlength属性の挙動
HTMLの maxlength は、利用者が入力できる最大文字数(UTF-16のコード単位数)をブラウザに制限させる属性です。上限に達するとそれ以上のキー入力は受け付けられず、maxlength がない、または無効な値の場合は上限なしとして扱われます(MDN)。貼り付けや自動入力で上限を超える文字列を入れた場合も、ブラウザの実装によっては超過分が通知なく入力されないことがあります。
「気付かない切り捨て」が起こす不具合
この「気付かない切り捨て」が厄介です。たとえば登録画面で maxlength="20" があり、パスワードマネージャーが32文字の値を生成すると、ブラウザは先頭20文字だけを送信し、マネージャーには32文字の値が保存されます。次回ログイン時に、ログイン画面の上限が異なると一致せず、利用者はログインできなくなります。
パスワードの最大長はなぜ64文字以上が求められるのか
標準の要求
| 出典 | 要求 |
|---|---|
| OWASP ASVS 5.0.0 V6.2.9(L2) | 少なくとも64文字のパスワードを許可すること |
| OWASP ASVS 5.0.0 V6.2.8(L1) | 受け取ったパスワードを切り詰めや大文字小文字変換をせず、そのまま検証すること |
| NIST SP 800-63B-4 3.1.1.2 | 最大長として少なくとも64文字を許可すべき(SHOULD)。パスワード全体を要求し全体を検証しなければならない(SHALL、切り詰め禁止)。単一要素認証として使うパスワードの最小長は15文字(SHALL) |
| OWASP ASVS 5.0.0 V6.2.1(L1) | 最小8文字、15文字以上を強く推奨 |
上限を設ける場合の考え方
長すぎる入力によるサービス妨害(巨大文字列をハッシュ関数に渡させる)を避けるため、サーバー側で上限を設けること自体は認められます。目安としては64文字を大きく上回る値(例:128〜256文字程度)とし、上限を超えた場合は切り詰めずにエラーとして返します。
ハッシュ方式の制約(bcryptの72バイト)
注意したいのは、ハッシュ方式の制約です。bcryptは実装の多くで入力が72バイトまでで、それを超える部分を無視します。日本語などのマルチバイト文字はUTF-8で1文字3バイト程度になるため、文字数では72文字より短い段階で上限に達します。OWASP Password Storage Cheat SheetはArgon2idを第一候補とし、bcryptは既存システム向けに72バイトの上限と合わせて使う位置付けにしています。
パスワードの文字数上限についてよくある誤解
- 「上限が短いほど安全」:上限は強度を制限するだけで、安全性は高まりません。
- 「HTMLの上限を外せば十分」:HTMLの制限はクライアント側の表示上の制約にすぎず、サーバー側で切り詰めていれば同じ問題が残ります。逆に、HTMLに上限がなくてもサーバーが短い上限で拒否する場合があります。
- 「確認欄だけ上限があっても問題ない」:確認欄が短いと、登録時に一致しないなどの不具合を生みます。
パスワード欄への貼り付けの可否は「パスワード欄への貼り付けを許可」、autocompleteの指定は「パスワードマネージャーに適したautocomplete」、伏せ字入力は「パスワード欄のtype属性」で確認します。このページは「HTMLの文字数上限」に絞って解説します。
64文字以上のパスワードをHTMLで妨げないの診断基準(セキュリティAIチェッカー)
取得対象
外部診断強化モジュールが、トップページと、Ver2巡回で見つかった同一オリジンの追加ページ(ログイン・管理・アカウント系URLを優先)から最大2ページ、合計最大3ページのHTMLを使います。JavaScriptは実行しないため、スクリプトで後から設定した属性は対象外です。
検出の手順
- 各ページの
<input ...>タグからtype="password"のものを抽出します(属性値は大文字小文字を区別しません)。 - 各パスワード欄の
maxlength属性値を数値化し、0より大きく64未満のものを「短い上限」と数えます。maxlengthがない、数値でない、64以上の場合は問題なしとします。
判定条件
| 判定 | 条件 | 得点への影響 |
|---|---|---|
| ○ 問題なし(pass) | パスワード欄があり、すべて maxlength 未指定または64以上 | 重み2を満点で加算 |
| △ 要確認(warn) | 使用しない | — |
| × 要改善(fail) | 1件でも maxlength が1〜63のパスワード欄がある | 重み2に対して0点 |
| 対象外(na) | 取得ページにパスワード欄がない | 分母・分子から除外 |
- 根拠には「n/m件でmaxlengthが64未満」と件数を表示します。
- ○の場合も「サーバー側上限は別途確認が必要」と明記します。
- HTML属性は数値として明確に読み取れるため、検出時は断定的に×としています。
判定の範囲と限界
pattern=".{8,16}"のような正規表現による上限、JavaScriptによる文字数チェック、サーバー側での切り詰め・拒否は、本項目では判定しません。実際に64文字以上のパスワードで登録・ログインを試す手動確認が必要です。- 4桁の暗証番号を
type="password"で入力させる画面(図書館の利用者番号+暗証番号など)も、maxlength="4"であれば×になります。暗証番号を単独の認証要素として使う設計は、パスワード強度の観点から見直す対象です。
自治体サイトでの判定例
| 状況 | 判定 |
|---|---|
| 公式サイトにログイン欄がない | 対象外 |
同一オリジン内の施設予約システムで <input type="password" maxlength="16"> | × |
電子申請のログイン欄で maxlength 未指定 | ○(サーバー側の上限は別途確認) |
パスワードの文字数上限が短いとどんなリスクがあるか
- 強度の上限:上限が8〜16文字程度だと、パスフレーズや長いランダム値が使えず、総当たり・辞書攻撃に対する余裕が小さくなります。
- 切り捨てによる不整合:パスワードマネージャーの保存値と実際に登録された値が食い違い、ログインできない、問い合わせが増える、利用者が短い値に変えるなど、運用面の悪循環が起こります。
- 内部実装の推測材料:極端に短い上限は、固定長カラムへの平文保存や古いハッシュ方式を連想させ、攻撃者の関心を引く要因になり得ます(上限から実装を断定することはできません)。
64文字以上のパスワードを受け入れる設定方法(HTML・PHP・Next.js)
1. HTMLの上限を削除または64以上へ
<!-- 修正前 -->
<input type="password" name="pw" maxlength="16">
<!-- 修正後:上限を外す、または十分大きくする -->
<input type="password" name="password" autocomplete="current-password">
<input type="password" name="new_password" autocomplete="new-password"
minlength="8" maxlength="128">
登録・変更・ログインの全画面で上限をそろえてください。一部の画面だけ変えると、登録できてもログインできない状態になります。
2. サーバー側の検証を合わせる(PHPの例)
<?php
$pw = $_POST['password'] ?? '';
if (!is_string($pw) || $pw === '') { http_response_code(400); exit; }
// 切り詰めずに長さだけを検査(UTF-8の文字数)
$len = mb_strlen($pw, 'UTF-8');
if ($len > 256) { http_response_code(400); exit('パスワードが長すぎます'); }
// 保存はArgon2id(PHP 7.3以降、ビルド依存)またはbcrypt
$hash = defined('PASSWORD_ARGON2ID')
? password_hash($pw, PASSWORD_ARGON2ID)
: password_hash($pw, PASSWORD_DEFAULT);
bcrypt(PHPの PASSWORD_DEFAULT)は72バイトを超える部分を無視するため、長いパスワードを想定する場合はArgon2idの採用か、OWASP Password Storage Cheat Sheetが示す事前ハッシュ方式の注意点を確認してください。
3. Next.js(React)の場合
<input
type="password"
name="password"
autoComplete="new-password"
minLength={8}
maxLength={128}
/>
APIルート側でも zod などで z.string().min(8).max(256) のように検証し、slice() で切り詰めないことを確認します。
4. パッケージ製品・CMSの場合
上限が製品仕様で固定されている場合は、ベンダーに「64文字以上の受け入れ(ASVS V6.2.9)」と「切り詰めない検証(V6.2.8)」の対応可否を確認し、次回更改の調達要件に含めます。
修正後の確認方法
# HTML上の上限を確認
curl -s https://www.example.lg.jp/login/ | grep -oiE '<input[^>]*type=["'"'"']?password[^>]*>'
# 64文字のテスト用文字列を作る(テスト環境でのみ使用)
node -e "console.log('a'.repeat(64))"
テスト環境で、64文字以上のパスワードを登録→ログアウト→ログインの順に試し、1文字だけ変えた値ではログインできないこと(切り詰めていないこと)も確認します。修正後はセキュリティAIチェッカーで再診断し、この項目が○になることを確認します。
サイトを壊さないための注意点
- 既存利用者のパスワードは、当時の上限で切り詰められて保存されている可能性があります。上限を変更すると、マネージャーに保存された長い値でログインできるようになる一方、以前「先頭だけ一致」でログインできていた利用者が入れなくなることがあります。変更告知とパスワード再設定の導線を用意してください。
- DBのカラムにハッシュではなく平文や可逆暗号で保存している場合は、上限変更より先に保存方式の見直しが必要です。
- 本番環境での長文入力試験は、テスト用アカウントで行ってください。
よくある質問(FAQ)
パスワードの最大文字数は何文字にすればよいですか?
少なくとも64文字を受け入れます(ASVS 5.0.0 V6.2.9、NIST SP 800-63B-4)。サーバー側で上限を設ける場合は、64文字を大きく上回る値(例:128〜256文字程度)にし、超えたときは切り詰めずにエラーを返します。
maxlengthを短くするとどんな不具合が起きますか?
上限を超える値が通知なく切り捨てられることがあります。たとえば登録画面がmaxlength="20"でパスワードマネージャーが32文字を生成すると、先頭20文字だけが登録され、マネージャーには32文字の値が保存されます。ログイン画面の上限が登録画面と異なる場合などに、次回ログインで一致せずログインできなくなることがあります。
HTMLのmaxlengthを外せば対策は完了ですか?
完了ではありません。HTMLの制限はクライアント側の制約にすぎず、サーバー側で切り詰めていれば同じ問題が残ります。HTMLに上限がなくてもサーバーが短い上限で拒否する場合があるため、64文字以上で登録とログインを実際に試して確認します。
bcryptで長いパスワードを扱うときの注意点は?
bcryptは実装の多くで入力が72バイトまでで、それを超える部分を無視します。日本語などはUTF-8で1文字3バイト程度になるため、文字数ではもっと早く上限に達します。OWASP Password Storage Cheat SheetはArgon2idを第一候補としています。
64文字以上のパスワードをHTMLで妨げていないかは、セキュリティAIチェッカーでどう判定されますか?
取得したHTMLのパスワード欄に、maxlengthが1〜63のものが1件でもあれば「× 要改善」です。すべて未指定または64以上なら「○ 問題なし」、パスワード欄がなければ「対象外」です。○の場合もサーバー側の上限は別途確認が必要です。
4桁の暗証番号の入力欄も×になりますか?
type="password"でmaxlength="4"なら×になります。図書館の利用者番号+暗証番号のように、暗証番号を単独の認証要素として使う設計は、パスワード強度の観点から見直す対象です。
この項目を含む127項目を、URLを入れるだけで無料診断します。