XAMPPのPHPにコマンドプロンプトとPowerShellから`password_verify`を実行すると……

XAMPPのPHPに対して、コマンドプロンプトとPowerShellの双方から同じpassword_verifyを実行しました。

実行したのは以下の文。

php -r "var_dump(password_verify('shioi', '$2y$10$Zx0AJfcI/Q8Et8pdkekcB.WJ6Y6rvP3bTlLdqbAe7Q7cGbqNxYx.S'));"

$を含む文字列はダブルクォーテーションだと変数として展開されるので、関数の引数の文字列はシングルクォーテーションで括るようには気を付けました。

さて、結果はどうなるか。

# コマンドプロンプト

>php -r "var_dump(password_verify('shioi', '$2y$10$Zx0AJfcI/Q8Et8pdkekcB.WJ6Y6rvP3bTlLdqbAe7Q7cGbqNxYx.S'));"
Command line code:1:
bool(true)

# PowerShell

> php -r "var_dump(password_verify('shioi', '$2y$10$Zx0AJfcI/Q8Et8pdkekcB.WJ6Y6rvP3bTlLdqbAe7Q7cGbqNxYx.S'));"
Command line code:1:
bool(false)

……何……だと……?

コマンドプロンプトとPowerShellのpassword_verifyの実行結果のキャプチャ。php -vして確認したが、PHPのバージョンはまったく同じ。
コマンドプロンプトとPowerShellのpassword_verifyの実行結果のキャプチャ。php -vして確認したが、PHPのバージョンはまったく同じ。

ついでにphp -vでバージョンを確認しましたが、PHPのバージョンはまったく同じでした。

検索してみましたが、類似症例が見当たらないので環境固有な気もしますが、これで嵌まっていました。

原因は解明できていませんが、備忘録としてメモしておきます。

追記

PowerShellのエスケープシーケンスが\ではなく`だということを知ったので以下のコマンドを試してみました。

> php -r "var_dump(password_verify('shioi', '`$2y`$10`$Zx0AJfcI/Q8Et8pdkekcB.WJ6Y6rvP3bTlLdqbAe7Q7cGbqNxYx.S'));"

結果は……

PowerShellのエスケープシーケンスを$マークの前につけて実行
PowerShellのエスケープシーケンスを$マークの前につけて実行

trueになりました。これが原因だったのか……。

この記事を書いた人

アバター

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。