CONTACT PRIVACY POLICY
NINES BASKETBALL / DESIGN / TOOLS
  • BLOG 開発記録
  • WORKS 作品集
  • TOOLS 自作ツール
  • ANALYZE Bリーグ分析
  • ABOUT NINESについて
HOME / BLOG
BLOG

PHPでパスワードを安全に保存する方法【password_hash・password_verify】

2026.08.30 BLOG
DatabaseLoginPasswordPHPSecurity
デフォルト画像
目次TABLE OF CONTENTS
01登録時の保存02ログイン時の照合03実装のポイント04やってはいけないこと05あわせて読みたい06参考資料

PHPでログイン機能を作るとき、パスワードをそのままDBへ保存してはいけません。漏えい時の被害を抑えるため、password_hash() でハッシュ化し、ログイン時は password_verify() で照合します。

この記事では、登録時の保存、ログイン時の照合、将来の再ハッシュまでを最小構成で整理します。

登録時の保存

<?php
$password = $_POST['password'] ?? '';

if (strlen($password) < 12) {
    throw new RuntimeException('パスワードは12文字以上にしてください。');
}

$hash = password_hash($password, PASSWORD_DEFAULT);

// 例: DBには平文ではなく $hash を保存する
$stmt = $pdo->prepare(
    'INSERT INTO users (email, password_hash) VALUES (:email, :password_hash)'
);

$stmt->execute([
    ':email' => $_POST['email'],
    ':password_hash' => $hash,
]);

ログイン時の照合

<?php
$stmt = $pdo->prepare(
    'SELECT id, email, password_hash FROM users WHERE email = :email LIMIT 1'
);

$stmt->execute([
    ':email' => $_POST['email'] ?? '',
]);

$user = $stmt->fetch();

if (!$user || !password_verify($_POST['password'] ?? '', $user['password_hash'])) {
    throw new RuntimeException('メールアドレスまたはパスワードが正しくありません。');
}

if (password_needs_rehash($user['password_hash'], PASSWORD_DEFAULT)) {
    $newHash = password_hash($_POST['password'], PASSWORD_DEFAULT);

    $update = $pdo->prepare(
        'UPDATE users SET password_hash = :password_hash WHERE id = :id'
    );
    $update->execute([
        ':password_hash' => $newHash,
        ':id' => $user['id'],
    ]);
}

実装のポイント

関数役割
password_hash()パスワードを安全な形式のハッシュに変換する
password_verify()入力されたパスワードと保存済みハッシュを照合する
password_needs_rehash()推奨アルゴリズムやコスト変更時に再ハッシュが必要か判断する
PASSWORD_DEFAULTPHPが推奨する既定アルゴリズムを使う

やってはいけないこと

  • パスワードを平文で保存する
  • md5() や sha1() だけで保存する
  • ログイン失敗理由を細かく出しすぎる
  • DBエラーや例外にパスワードを含める

あわせて読みたい

  • PHPでPDOのプリペアドステートメントを使う方法
  • WordPress REST APIをnonceで安全に使う方法
  • LaravelでAPIレスポンスを整える方法

参考資料

  • PHP Manual password_hash
  • PHP Manual password_verify
  • PHP Manual password_needs_rehash

このシリーズの記事

BLOG

PHPでPDOのプリペアドステートメントを使う方法【SQLインジェクション対策】

公開日 2026.08.28

BLOG

WordPress REST APIをnonceで安全に使う方法【wp_create_nonce・permission_callback】

公開日 2026.08.23

BLOG

WordPressオリジナルテーマ開発まとめ【最初に読むロードマップ】

公開日 2026.07.21

次に読む記事

BLOG

JavaScriptのlocalStorageで入力途中の下書きを自動保存する方法

公開日 2026.08.30

BLOG

JavaScriptのdebounceとは?検索フォームで使う実装例

公開日 2026.08.28

BLOG

JavaScriptのイベント委譲とは?一覧UIで使う実装例

公開日 2026.08.28

Article Info

  • Published: 2026.08.30
  • Category: BLOG
  • Blog Index

Analyze

  • Bリーグのランキング、チーム、選手データを見る
  • Analyzeを開く

PREV

STEP BACK

NINES BASKETBALL / DESIGN / TOOLS

CATEGORY

  • ANALYZE
  • BASKETBALL
  • BLOG
  • MOVIE
  • TECH
  • TOOLS
  • WORKS

TAGS

  • :has()
  • @layer
  • @scope
  • 1対1
  • AbortController
  • AbortSignal
  • Accessibility
  • after
  • AI
  • Analytics
  • Anchor Positioning
  • Animation
  • API
  • aspect-ratio
  • Astro
  • Astro.js
  • Autosave
  • B-LEAGUE
  • basketball
  • before
  • Beginner
  • Blog
  • Button
  • Bリーグ
  • Cascade Layers
  • Category
  • Centering
  • Chart.js
  • ChatGPT
  • clamp()
  • Claude Code
  • CodePen
  • Codex
  • Container Query
  • Content Collections
  • Creative Coding
  • CSS
  • CSS Grid
  • CSS設計
  • Dark Mode
  • Dart
  • Dashboard
  • Database
  • Date
  • debounce
  • Debug
  • dialog
  • DOM
  • DRtg
  • Eloquent
  • Event
  • fetch
  • Flexbox
  • Flutter
  • focus-visible
  • Form
  • Frontend
  • functions.php
  • FutureBuilder
  • GA4
  • git
  • GitHub
  • Google Analytics
  • Grid
  • htaccess
  • HTML
  • Image
  • IntersectionObserver
  • iPhone
  • JavaScript
  • jQuery
  • JSON
  • Keyboard
  • Keyword
  • Laravel
  • Layout
  • localStorage
  • Login
  • logo
  • macOS
  • Markdown
  • Micro Interaction
  • minmax
  • Modal
  • Next.js
  • NINES
  • NINES ANALYZE
  • Node.js
  • Nonce
  • object-fit
  • OpenAI
  • ORtg
  • overflow
  • Pagination
  • Password
  • PDO
  • PHP
  • PhpStorm
  • Popover API
  • position
  • Prompt 3
  • Pseudo Elements
  • Ranking
  • React
  • React Admin
  • Repository
  • ResizeObserver
  • Resource
  • Responsive
  • REST API
  • Roadmap
  • RULE
  • Scroll-driven Animations
  • Search
  • Search Console
  • Security
  • Semantic HTML
  • SEO
  • Server
  • Server Islands
  • Shortcut
  • SQL
  • SSG
  • SSH
  • SSR
  • Stats
  • subgrid
  • SVG
  • Tag
  • TECH
  • Temporal
  • text-overflow
  • TextEditingController
  • Theme
  • Tips
  • TOOL
  • transform
  • UI
  • URLSearchParams
  • Validation
  • View Transition API
  • Vite
  • Vue.js
  • web制作
  • width
  • Windows
  • WordPress
  • WORKS
  • WP-Cron
  • Xserver
  • z-index
  • アニメーション
  • インターハイ
  • インターハイ2026
  • オフェンス
  • キャッチアンドシュート
  • シュート
  • シュートフォーム
  • シュート成功率
  • シュート練習
  • スコアボード
  • ゾーンディフェンス
  • チェストパス
  • ディフェンス
  • ドリブル
  • トリプルスレット
  • ドリブル練習
  • バスケ
  • バスケ初心者
  • バスケ戦術
  • バスケ用具
  • バスケ用語
  • バスケ練習
  • パス練習
  • ピックアンドロール
  • ピボット
  • フォーム
  • フットワーク
  • フリースロー
  • ブログ運営
  • フロントエンド
  • ヘルプディフェンス
  • ボールハンドリング
  • ボックスアウト
  • リバウンド
  • リライト
  • ルール
  • レイアップ
  • レスポンシブデザイン
  • ローテーション
  • 便利関数
  • 保護者向け
  • 個人開発
  • 内部リンク
  • 初心者
  • 北陸高校
  • 女子バスケ
  • 男子バスケ
  • 福岡大学附属大濠
  • 練習メニュー
  • 練習記録
  • 自主練
  • 観戦ポイント
  • 近畿総体2026
  • 速報記事
  • 高校バスケ
Instagram X
  • BLOG 開発記録
  • WORKS 作品集
  • TOOLS 自作ツール
  • ANALYZE Bリーグ分析
  • ABOUT NINESについて
  • CONTACT
  • PRIVACY POLICY

© KJ9.