【问题标题】:SHA1 password encryption returns an undefined indexSHA1 密码加密返回未定义的索引
【发布时间】:2014-11-27 04:00:45
【问题描述】:

我对 php 和 mysqli 很陌生,希望有人能帮助我。 以下代码成功插入名字、姓氏、电子邮件和注册日期,但我收到一个带有密码的未识别索引警告,并且没有在 mysql 中插入任何内容。 我知道 SHA1 不是最好的加密方法,而且我知道这段代码很容易受到攻击,我还有很多工作要做。我只需要有人建议我哪里出错了,我需要做什么来纠正这个问题。提前谢谢了。

$page_title = 'Register';
$q = 'query';


if (isset($_POST['submitted'])){

$errors = array();//initialise error array

//check for first name
if (empty($_POST['first_name'])) {
    $errors[] = 'you forgot to enter your first name';
} else {
    $fn=trim($_POST['first_name']);
}

//check for last name
if (empty($_POST['last_name'])) {
    $errors[] = 'you forgot to enter your last name';
} else {
    $fn=trim($_POST['last_name']);
}

//check for email
if (empty($_POST['email'])) {
    $errors[] = 'you forgot to enter your email';
} else {
    $fn=trim($_POST['email']);
}

//check passwords against each other
if (!empty($_POST['pass1'])){

    if(!empty($_POST['pass1'])) {
        if ($_POST['pass1'] != $_POST['pass2']) {
            $errors[] = 'Passwords dont match';
            } else {
                $p = trim($_POST['pass1']);
            }
        } else {
            $errors[] = 'You forgot to enter your password.';
        }

    if (empty($errors)) {

        require_once ('mysqli_connect.php');

        //make query
        $q = "INSERT INTO users (first_name,last_name,email,pass,registration_date) VALUES 
        ('".$_POST["first_name"]."','".$_POST["last_name"]."','".$_POST["email"]."','".$_POST["SHA1('pass')"]."', NOW())";

        $r = @mysqli_query ($dbc,$q); //run query

        if($r) {
            echo 'Registration complete';
        } else {
            echo 'System error, could not register you';

            //debug msg
            echo '<p>'.mysqli_error($dbc).
            '<br/><br/>Query: '.$q.
            '</p>';
        }

        mysqli_close($dbc);

    }else { //report errors
    echo 'The following errors occurred: <br/>';
    foreach ($errors as $msg) {
    echo "- $msg<br/>/n";
    }
    }
}
}
?>
<html>
<head></head>
<h1>Register</h1>
<body>
<form action="register.php" method="post">
<p>First Name: <input type="text" name="first_name" size="15" maxlength="20"           value="<?php if(isset($_POST['first_name'])) echo $_POST['first_name']; ?>"/></p>
<p>Last Name: <input type="text" name="last_name" size="15" maxlength="20"  value="<?php if(isset($_POST['last_name'])) echo $_POST['last_name']; ?>"/></p>
<p>Email Address: <input type="text" name="email" size="15" maxlength="20"   value="<?php if(isset($_POST['email'])) echo $_POST['email']; ?>"/></p>
<p>Password: <input type="password" name="pass1" size="10" maxlength="20"/></p>
<p>Confirm Password: <input type="password" name="pass2" size="10" maxlength="20"/></p>
<p><input type="submit" name="submit" value="register"/></p>
<input type="hidden" name="submitted" value="TRUE"/>
</form>
</body>
</html>

【问题讨论】:

  • ($_POST['pass1'] != $_POST['pass2']) 检查是否也设置了pass2
  • 请注意:SHA1 是散列,不是加密。
  • $_POST["SHA1('pass')"] 这是错误的,不仅仅是一个原因。您还面临着大规模的 SQL 注入。
  • 您使用的是an unsuitable hashing algorithm,需要take better care的用户密码。
  • 危险:你容易受到SQL injection attacks的影响,你需要defend你自己。

标签: php mysqli sha


【解决方案1】:

在您的查询变量 $q 中,此值是错误的:$_POST["SHA1('pass')"] 更改为您的密码变量,如下所示:

//make query
$q = "INSERT INTO users (first_name,last_name,email,pass,registration_date) VALUES 
('".$_POST["first_name"]."','".$_POST["last_name"]."','".$_POST["email"]."','". sha1($p) ."', NOW())";

考虑一下自己在存储密码时采用了更好的方法,请查看函数password_hash() 以获得更好的安全性。

【讨论】:

  • 欢迎您!正如您所说,您是 PHP 新手,这暂时可以使用,而将哈希密码存储在 sha 或 md5 中可以正常工作,当您深入研究 PHP 时,花一点时间了解如何使用内置函数 password_hash() 存储密码作为PHP5 或其他密码加密方法。
猜你喜欢
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多