1

このサイトのこのコードについていくつか質問しました。

基本的に、使用するとデータベースが更新されません- $id = $GET_['id']; (以下のコードの上部)。ID は前のページからこのページに渡されます。ページの URL は「http://www.21orange.com/CCC/changepassword.php?id=1」です。データベースに「id」フィールドがあります。

上記のコード行を $id = '1' に変更すると、コードは完全に実行され、データベースが更新されます。$GET_['id'] を使用した場合にのみ機能しなくなります。どうしてこれなの?

// First we execute our common code to connection to the database and start the session 
require("common.php"); 

  $id = $_GET['id'];

// This if statement checks to determine whether the registration form has been submitted 
// If it has, then the registration code is run, otherwise the form is displayed 
if(!empty($_POST)) 
{  
    // Ensure that the user has entered a non-empty password 
    if(empty($_POST['password'])) 
    { 
        die("Please enter a password."); 
    } 

    // Ensure that the user has entered a non-empty username 
    if(empty($_POST['confirmpassword'])) 
    { 
        // Note that die() is generally a terrible way of handling user errors 
        // like this.  It is much better to display the error with the form 
        // and allow the user to correct their mistake.  However, that is an 
        // exercise for you to implement yourself. 
        die("Please confirm your password."); 
    } 

     if ($_POST['password'] == $_POST['confirmpassword']) {

    // An INSERT query is used to add new rows to a database table. 
    // Again, we are using special tokens (technically called parameters) to 
    // protect against SQL injection attacks. 
    $query = "UPDATE Staff SET password=:password, salt=:salt WHERE id=:id"; 

    // A salt is randomly generated here to protect again brute force attacks 
    // and rainbow table attacks.  The following statement generates a hex 
    // representation of an 8 byte salt.  Representing this in hex provides 
    // no additional security, but makes it easier for humans to read. 
    $salt = dechex(mt_rand(0, 2147483647)) . dechex(mt_rand(0, 2147483647)); 

    // This hashes the password with the salt so that it can be stored securely 
    // in your database.  The output of this next statement is a 64 byte hex 
    // string representing the 32 byte sha256 hash of the password.  The original 
    // password cannot be recovered from the hash. 
    $password = hash('sha256', $_POST['password'] . $salt); 

    // Next we hash the hash value 65536 more times.  The purpose of this is to 
    // protect against brute force attacks.  Now an attacker must compute the hash 65537 
    // times for each guess they make against a password, whereas if the password 
    // were hashed only once the attacker would have been able to make 65537 different  
    // guesses in the same amount of time instead of only one. 
    for($round = 0; $round < 65536; $round++) 
    { 
        $password = hash('sha256', $password . $salt); 
    }  

    try 
    { 
        // Execute the query to create the user 
        $stmt = $db->prepare($query); 
        $stmt->execute(array(
        'password' => $password,
        'salt' => $salt,
        'id' => $id));
    } 
    catch(PDOException $ex) 
    { 
        // Note: On a production website, you should not output $ex->getMessage(). 
        // It may provide an attacker with helpful information about your code.  
        die("Failed to run query: " . $ex->getMessage()); 
    } 

    // This redirects the user back to the login page after they register 
    header("Location: stafflist.php");

     // Calling die or exit after performing a redirect using the header function 
    // is critical.  The rest of your PHP script will continue to execute and 
    // will be sent to the user if you do not die or exit. 
    die("Redirecting to stafflist.php"); 

}

die("Passwords do not match.");  
}

私はphpに慣れていないので、私の素朴さを許してください。Ps 私が使用している方法がかなり古い方法であることはわかっていますが、これは単なるテストです。

ありがとう、ジョー

4

4 に答える 4

1

1 つのHTTP RequestGETでとの両方を実行することはできません。POST

ただし、非表示の入力フィールドを使用して、この制限を回避できます。

HTML マークアップでは、次を追加できます。

<input type="hidden" name="id"
           value="<?php echo htmlspecialchars($_GET['id'], ENT_QUOTES); ?>" />

そして、あなた$_GET['id']はうまくいくはずです。

于 2013-09-24T14:43:21.590 に答える
0

「id」をアクション URL に渡しているようですが、何らかの理由で $_GET 変数にそれがありません。再確認してください:

  1. 本当に「id」を URL に渡していますか? 確認してください。

  2. common.php のコードをチェックして、$_GET 変数が変更されているかどうかを確認してください。

  3. そのスクリプトは書き換え設定 (.htaccess など) の背後にありますか? はいの場合、不適切な書き換え設定が原因で $_GET パラメータがなくなっている可能性があります。print_r($_GET); を入力して、さらにテストできます。最初にそのスクリプトに直接アクセスします( POST ではなく GET )

于 2013-09-24T13:52:32.613 に答える
0

$id = $_GET['id']; 最初に $id に値があることを確認して、echo を介して $id を出力します

于 2013-09-24T13:54:02.133 に答える
0

このエラーを回避するには

Undefined index: id in /home/content/47/11368447/html/CCC/changepassword.php on line 6

indexが存在するかどうかを最初にテストします。

if(isset($_GET['id'])) {
    $id = $_GET['id'];
} else {
    // here you can set a value for the id
}

$idそれ以外の場合は、 if テストに var を追加できます。

if(!empty($_POST) && $id) 
{
    //...
}
于 2013-09-24T13:46:18.490 に答える