-1

PHPの初心者で、パスワードを忘れた関数を作成しようとしています。次のコードがあります

<?php

    $con = mysql_connect("localhost","root","");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("inventory", $con);

$a=$_POST['password'];
$b=$_POST['newpassword'];
$c=$_POST['retypepassword'];

$result = mysql_query("SELECT * from admins " );

while($row = mysql_fetch_array($result))
  { 

  $password = $row['password'] ;

  }
              if($_POST['retypepassword'] != $b){     
                echo "<script type='text/javascript'>alert('Password Not match');
                window.location.href='forgotpass.php?id=0';
            </script>";
            exit();
                }
             if($_POST['password'] != $password){
                    echo "<script type='text/javascript'>alert('You Provide wrong Password');
                    window.location.href='forgotpass.php?id=0';
            </script>";
            exit();
                }       
            else {
            mysql_query("UPDATE admins SET password = '$b'
                    WHERE password = '$a' ");
                    header("location: index.php?id=0");
};

?>

今、問題は、データベースに挿入された最後のアカウントしか更新できないことです。たとえば、データベースからこの次のアカウントがあり、「greeg」を変更したいとします。これには問題はありません。しかし、「gejel」(「データベースの最初の値」) を変更すると、「間違ったパスワードを提供しました」と表示されます。なぜいつもここに来るのかわかりません。「WHERE」に何か問題があると思いますか?plsは私を助けて助けてください:D

id |password |
1  |  gejel  |
2  |  greeg  |
4

2 に答える 2

0

問題はあなたのwhileループにあると思います。mysql_query はテーブル内のすべてのエントリを選択してから、それらすべてを反復処理するため、常にテーブル内の最後のエントリになります。クエリは次のようにする必要があります。

$result = mysql_query("SELECT * from admins WHERE id = $id"); <-- added WHERE clause

パスワードを変更するアカウントを知る必要があります。提供されている現在のパスワードによっては、これを行う必要はありません。2 人の管理者が同じパスワードを使用している場合はどうなりますか?

第二に、パスワードをソルトしてハッシュする必要があるため、これは不可能です。 http://php.net/manual/en/faq.passwords.php

第 3 に、mysql_* 拡張機能は廃止されたため、すぐに使用を中止する必要があります。代わりに MySQLi または PDO_MySQL を使用してください。ここの大きな赤いボックスを読んでください: http://php.net/manual/en/function.mysql-query.php

最後に、アプリが脆弱である可能性が最も高いため、SQL インジェクションについて調査することをお勧めします。オフセットからこれらのものを正しく取得することは、後ですべてにパッチを適用しようとするよりも優れており、はるかに簡単になります: http://en.wikipedia.org/wiki/SQL_injection

于 2013-10-02T08:22:54.237 に答える
0

両方のクエリにアカウント ID を入力し、変数を正しくエスケープして、SQL インジェクションを回避します。

他のユーザーが言ったように、mysql_* 拡張機能は非推奨です。代わりにPDOを使用することをお勧めします。

<?php

    $con = mysql_connect("localhost","root","");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("inventory", $con);

$id=$_POST['id'];
$a=$_POST['password'];
$b=$_POST['newpassword'];
$c=$_POST['retypepassword'];

$result = mysql_query("SELECT * FROM admins WHERE id = '" .$id. "'");

while($row = mysql_fetch_array($result))
  { 

  $password = $row['password'] ;

  }
              if($_POST['retypepassword'] != $b){     
                echo "<script type='text/javascript'>alert('Password Not match');
                window.location.href='forgotpass.php?id=0';
            </script>";
            exit();
                }
             if($_POST['password'] != $password){
                    echo "<script type='text/javascript'>alert('You Provide wrong Password');
                    window.location.href='forgotpass.php?id=0';
            </script>";
            exit();
                }       
            else {
            mysql_query("UPDATE admins SET password = '" .$b. "'
                    WHERE id = '" .$id. "'");
                    header("location: index.php?id=0");
};

?>

そして、今日のように私は機嫌が良いので、PDO の例を示します。

定数.php

<?php
define("DB_SERVER", "localhost");
define("DB_USER", "root");
define("DB_PASS", "");
define("DB_NAME", "inventory");
?>

接続.php

<?php
require("constants.php");
try {
    $con = new PDO('mysql:host=' . DB_SERVER . ';dbname=' . DB_NAME, DB_USER, DB_PASS,
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",PDO::ATTR_PERSISTENT => true));
    $con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    }
catch(PDOException $e)
    {
    echo 'Could not connect: ';
    echo $e->getMessage();
    }
?>

your_file.php

<?php
include("connection.php");

$id=$_POST['id'];
$password=$_POST['password'];
$newpassword=$_POST['newpassword'];
$retypepassword=$_POST['retypepassword'];

$sql = "SELECT * FROM admins WHERE id = :id";

$sth = $dbh->prepare($sql);
$sth->bindValue(':id', $id, PDO::PARAM_INT);
$sth->execute();

while($row = $sth->fetch(PDO::FETCH_ASSOC)) {
    $db_password = $row['password'] ;
}

if($retypepassword != $newpassword){     
    echo "<script type='text/javascript'>alert('Password Not match');
window.location.href='forgotpass.php?id=0';
</script>";
exit();
}

if($password != $db_password){
    echo "<script type='text/javascript'>alert('You Provide wrong Password');
window.location.href='forgotpass.php?id=0';
</script>";
exit();

}else {

    $sql = "UPDATE admins SET password = :newpassword WHERE id = :id";

    $sth = $dbh->prepare($sql);
    $sth->bindValue(':newpassword', $newpassword, PDO::PARAM_STR);
    $sth->bindValue(':id', $id, PDO::PARAM_INT);
    $sth->execute();

    if($sth){
        header("location: index.php?id=0");
    }
};
?>

検索する必要があるもう 1 つのポイントは、PHP パスワードのセキュア ハッシュとソルトです。

于 2013-10-02T08:51:50.997 に答える