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で遊んだり、趣味で開発したり。