【发布时间】:2012-11-26 16:39:57
【问题描述】:
我正在创建一个用户表单和表单操作,用户(已经使用会话变量登录)可以更改他们的 md5(我知道 MD5 已过时且不安全,这是出于测试目的)存储在 sql 数据库中的加密帐户密码“用户”表。
我有一个请求输入“currentpassword”、“newpassword”和“confirmnewpassword”的表单。表单使用 $_POST 将输入的数据传递给 passwordaction.php。
用户名是从 $_SESSION 'autheticatedUser' 中获取的,密码是从之前的 $_POST 表单变量中获取的。然后我使用 sql 语句从数据库中获取密码以与“currentpassword”变量进行比较,这算作不安全的客户端验证吗? ?
然后我有一个 SQL UPDATE 语句来更新数据库中指定用户的密码行,用户被重定向并使用 $_SESSION 标头通知成功或失败。
我一直在阅读和重新阅读我的代码,试图找出我出错的地方,因为当我尝试更改用户帐户密码时,我不断返回我的登录页面(使用 $SESSION 标头)告诉我它已更新正确但是当我检查数据库时密码尚未更新。
我希望其他人的观点或观点能够帮助我了解我错过了什么,有人可以建议为什么我的 sql UPDATE 语句不起作用吗?
欢迎任何建设性的批评
下面是我的“action”php页面代码
<?php
session_start();
$username = $_SESSION["authenticatedUser"];
$currentpassword = md5($_POST['currentpassword']);
$newpassword = md5($_POST['newpassword']);
$confirmnewpassword = md5($POST['confirmnewpassword']);
/* make a connection with database */
$con = mysql_connect("localhost", "root", "") or die(mysql_error());
/* select the database */
mysql_select_db("groupproject") or die(mysql_error());
$queryget = mysql_query("SELECT password FROM users WHERE username='$username'") or
die(mysql_error());
$row = mysql_fetch_assoc($queryget);
$currentpasswordDB = $row['password'];
//check passwords
if ($currentpassword==$currentpasswordDB)
{
if ($newpassword==$confirmnewpassword)
{
//success, change password in DB
$querychange = mysql_query("UPDATE users SET password='$newpassword' WHERE
username='$username'") or die(mysql_error());
}
else header("Location: passwordmismatch.php");
if ($querychange == true){
$_SESSION["passchange"] = "Your password has been changed, Please Log in";
header("Location:login.php");
}
else $_SESSION["nopasschange"] = "Your password could not be changed, Please try
again";
header("Location:userchangepassword.php");
}
else header("Location: passwordmismatch.php");
mysql_close($con);
?>
【问题讨论】:
-
您使用的是an obsolete database API,应该使用modern replacement。您还容易受到SQL injection attacks的影响,现代 API 可以让您更轻松地从 defend 中获得。
-
两个 cmets 都很有帮助,谢谢,但是这个项目永远不会成为一个实时网站。我会记住,MD5 不是最佳的哈希工具
标签: php sql session-variables change-password