更改密码

时间:2010-03-18 12:09:46

标签: php

我已经创建了一个更改密码的代码。现在它似乎包含一个错误。 当我填写表单来更改密码,然后单击保存错误消息:

  

您忘了输入您的用户ID!

     

请再试一次。

我真的不知道错误信息的含义。拜托,拜托。帮我解决一下。

这是代码:

<?php # change password.php

//set the page title and include the html header.
$page_title = 'Change Your Password';
//include('templates/header.inc');

if(isset($_POST['submit'])){//handle the form
 require_once('connectioncomplaint.php');//connect to the db.
 //include "connectioncomplaint.php";

 //create a function for escaping the data.
 function escape_data($data){
  global $dbc;//need the connection.
  if(ini_get('magic_quotes_gpc')){
   $data=stripslashes($data);
  }
  return mysql_real_escape_string($data);
 }//end function

 $message=NULL;//create the empty new variable.

 //check for a username
 if(empty($_POST['userid'])){
  $u=FALSE;
  $message .='<p> You forgot enter your userid!</p>';
 }else{
  $u=escape_data($_POST['userid']);
 }

 //check for existing password
 if(empty($_POST['password'])){
  $p=FALSE;
  $message .='<p>You forgot to enter your existing password!</p>';
 }else{
  $p=escape_data($_POST['password']);
 }

 //check for a password and match againts the comfirmed password.
 if(empty($_POST['password1'])) {
  $np=FALSE;
  $message .='<p> you forgot to enter your new password!</p>';
 }else{
  if($_POST['password1'] == $_POST['password2']){
  $np=escape_data($_POST['password1']);
 }else{
  $np=FALSE;
  $message .='<p> your new password did not match the confirmed new password!</p>';
 }
}

if($u && $p && $np){//if everything's ok.

 $query="SELECT userid FROM access WHERE (userid='$u' AND password=PASSWORD('$p'))";
 $result=@mysql_query($query);
 $num=mysql_num_rows($result);
 if($num == 1){
  $row=mysql_fetch_array($result, MYSQL_NUM);

  //make the query
  $query="UPDATE access SET password=PASSWORD('$np') WHERE userid=$row[0]";
  $result=@mysql_query($query);//run the query.
  if(mysql_affected_rows() == 1) {//if it run ok.

   //send an email,if desired.
   echo '<p><b>your password has been changed.</b></p>';
   //include('templates/footer.inc');//include the HTML footer.
   exit();//quit the script.

  }else{//if it did not run OK.
   $message= '<p>Your password could not be change due to a system error.We apolpgize for any inconvenience.</p><p>' .mysql_error() .'</p>';
   }
  }else{
   $message= '<p> Your username and password do not match our records.</p>';
  }
  mysql_close();//close the database connection.

 }else{
  $message .='<p>Please try again.</p>';
 }
}//end of the submit conditional.

//print the error message if there is one.
if(isset($message)){
 echo'<font color="red">' , $message, '</font>';
}
?>

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">

4 个答案:

答案 0 :(得分:3)

请不要将实际密码存储在数据库中。创建密码的哈希值并存储它。当用户登录时,哈希传入的密码并检查它是否与用户的哈希密码匹配。有关详细信息,请参阅http://phpsec.org/articles/2005/password-hashing.html

此外,将userid存储在会话中并从那里检索它而不是从表单中获取它会更安全。即使输入隐藏在页面上,也可以通过多种方式替换它。它会在应用程序中留下一个小洞,如果一个用户知道另一个用户的id和密码,他们可以以不可检测的方式更改它。也就是说,尽管您没有登录该用户的记录,但密码可能会被更改。即使从表单(或网址)获取用户ID,也要检查他们正在操作的数据是否属于他们自己的,除非他们是具有足够特权的用户,否则不是别人的。

答案 1 :(得分:0)

这表示您未使用userid参数发送POST。据推测,您的表单不包含名为userid的元素。错误来自这一行:

if(empty($_POST['userid'])){

答案 2 :(得分:0)

由于此测试显示错误:

 if(empty($_POST['userid'])){
  $u=FALSE;
  $message .='<p> You forgot enter your userid!</p>';
 }

这表示服务器未从表单中收到userid字段。


我猜你应该确保你的表单中有这样一个字段 - 并且它必须包含你想要更改密码的用户的userid

考虑到您可能不希望显示该字段,您将使用hidden输入:

<input type="hidden" name="userid" 
    value="<?php echo htmlspecialchars(HERE THE USERID); ?>" />

答案 3 :(得分:0)

根据您的代码,这意味着userid POST变量为空。验证您使用的字段的名称。