アプリ版:「スタンプのみでお礼する」機能のリリースについて

渡ってきた値(名前又パスワード)がDBに登録されていたら、登録済みという処理をしたいのですが、重複していても登録されてしまいます。
どこを直せば良いか教えて下さい。宜しくお願いします。
<?php
session_start();

$name = $_SESSION['name'];
$pass = $_SESSION['pass'];

?>
省略
<body>
<?php

try {
$pdo =new PDO('省略');

$sql = 'SELECT * FROM テーブル名 WHERE name = ? OR password = ?';
$stmt = $pdo->prepare($sql);
$stmt->bindValue(1, $name, PDO::PARAM_STR);
$stmt->bindValue(2, $pass, PDO::PARAM_STR);
$stmt->execute();

$rec = $stmt->fetch(PDO::FETCH_ASSOC);

if ($rec['name']== $name) {
echo '既に登録されています。';
echo '<form>';
echo '<input type="button" onclick="history.back()" value="戻る">';
echo '</form>';
exit();
}

if(password_verify($pass,$rec['password']??"")) {
echo '既に登録されています。';
echo '<form>';
echo '<input type="button" onclick="history.back()" name="戻る">';
echo '</form>';
exit();
}

質問者からの補足コメント

  • 御解答ありがとうございます。
    >入力の pass を password_hash した結果を引数にselect * from テーブル名 where password = ?
      
    $pass = $_SESSION['pass'];
    $pass=password_hash($pass,PASSWORD_DEFAULT);の後、
    $sql='SELECT~'に入れ、
    $stmt->bindValue~をし
    $stmt->execute();で実行。
    $rec = $stmt->fetchAll(PDO::FETCH_ASSOC);をし
    if(password_verify($pass,$rec['password']??"")) {
    echo '既に登録されています。';
    としたのですが、やはり同じパスワードを入力しても登録されてしまいます。
    なにか足りない所があるのでしょうか?

    No.2の回答に寄せられた補足コメントです。 補足日時:2023/04/03 20:47

A 回答 (3件)

No.2の回答の補足について


「結果が1レコードでもあれば」を判断していません。

調べてみたら最近の password_hash はソルトを指定できないので、
そもそも検索キーにとして使えないようです。
間違った回答をしてしまい申し訳ないです。

というわけで、厳密にパスワード重複を防ぐ方法はありませんので、
パスワードに関する仕様見直しを強くお勧めします。
    • good
    • 0
この回答へのお礼

ありがとうございました。
助かりました<m(__)m>

お礼日時:2023/04/04 10:33

推測するに、パスワードはハッシュ化されて管理されているようなので、厳密に重複を防ぐ方法はありません。


というかパスワード重複を検知できるのは脆弱性につながるので、仕様見直しをお勧めします。

入力の name を引数に
select * from テーブル名 where name = ?
の結果が1レコードでもあれば、「既に名前が登録済み」

入力の pass を password_hash した結果を引数に
select * from テーブル名 where password = ?
の結果が1レコードでもあれば、「だれかのパスワードとして使われている可能性ありハッキングチャンスですよ」
この回答への補足あり
    • good
    • 1

重複させたくないデータを格納するテーブルの項目をキー付きとすればよいでしょう。


そうすればその項目に同じ値を持ったデータ(レコード)は1件しかないことが保証されますし、その項目の値を指定した検索が高速になります。
ということでPHPでのコーディングレベルのお話しではないと。。。

参考まで。
    • good
    • 0
この回答へのお礼

ありがとうございました。<m(__)m>

お礼日時:2023/04/04 10:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!