【问题标题】:Password verification php form密码验证php表单
【发布时间】:2016-12-15 22:29:41
【问题描述】:

这里我有一些 php 代码,可以让我更新学生表中的用户信息。

我试图弄清楚如何在允许更新信息之前检查当前登录用户的密码是否与存储在数据库中的密码匹配。

【问题讨论】:

标签: php html sql


【解决方案1】:

正如其他人所说,您的脚本有很多漏洞。

我假设您只是为本地开发。

如果你在这个阶段托管它,你肯定会遇到安全问题。

好的,回到你的问题。

有几种方法可以在提交更新之前验证用户。

例如:

  1. 更新更改时放置sql条件

    if(isset($_POST['Update'])){
        $UpdateFName = $_POST['FirstName'];
        $UpdateLName = $_POST['LastName'];        
        $UpdateEmail = $_POST['Email'];
        $UpdateFPassword = $_POST['Password'];
    
        $SQL = $conn->query("UPDATE students 
        SET FName='{$UpdateFName}',LName='{$UpdateLName}',Email='{$UpdateEmail}',Password='{$UpdateFPassword}'
        WHERE UserID = $User and Password = '$_SESSION["PW"]' ");
    
    header('Location:updateinfo.php');
    

    }

如果你使用这种方法,如果当前密码和db中存储的密码不同,那些edit sql将不会运行,因为where条件无效

  1. 首先验证用户。

    if(isset($_POST['Update'])){
        $UpdateFName = $_POST['FirstName'];
        $UpdateLName = $_POST['LastName'];        
        $UpdateEmail = $_POST['Email'];
        $UpdateFPassword = $_POST['Password'];
    
        $sqlValidate = $conn->query("SELECT * FROM students WHERE UserID ='$User' and Password='$_SESSION["PW"]' ");
        $getUser = $sqlValidate -> fetch_array(MYSQLI_BOTH);
    
        if($getUser['UserID'] != ''){
            $SQL = $conn->query("UPDATE students SET FName='{$UpdateFName}', LName='{$UpdateLName}', Email='{$UpdateEmail}', Password ='{$UpdateFPassword}' WHERE UserID = $User  ");
        }// end if
    
    header('Location:updateinfo.php');
    

    }

您可以阅读http://php.net/manual/en/function.crypt.php 进行密码加密。

【讨论】:

  • 是的,这仅用于演示目的,不能实时托管。谢谢你的代码,但是,我收到这些错误:意外的'"',期望标识符(T_STRING)或变量(T_VARIABLE)或数字(T_NUM_STRING)修复此错误后,我收到此解析错误,语法错误,意外' $_SESSION' (T_VARIABLE) 我不确定我错过了什么。
  • 这意味着缺少季节变量,请确保您在上面为密码声明了会话变量
【解决方案2】:

您的表单基本上没有验证。此外,还有 SQL 注入的机会。 在发布之前验证您的电子邮件字段。试试:

if(!filter_var($email_variable,FILTER_VALIDATE_EMAIL){
//throw some kind of exceptions or kill the process
}

我还建议您使用 PDO,因为它支持使用准备好的语句。有一个神奇的函数可以 bindParam() 绑定你的参数。

试一试:

$DBH = new PDO("mysql:host=localhost;dbname=test", 'root', '');
        $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
        $STH = $DBH->prepare("SELECT * FROM student_table WHERE studentID= :id");
        $id = 1; // here you should keep it as variable and pass it to param
        $STH->bindParam(':id', $id, PDO::PARAM_STR);
        $STH->execute();

        $STH->setFetchMode(PDO::FETCH_ASSOC);

另外,请勿将原始密码直接发布到您的数据库中。要么使用内置的 php 散列算法,要么使用某种加密功能来保护它们。

【讨论】:

    猜你喜欢
    • 2020-12-08
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    相关资源
    最近更新 更多