PHP更新数据库时遇到问题

时间:2016-06-07 16:36:57

标签: php mysql

我已使用

连接到数据库
function db_connect() {
   $result = new mysqli('localhost','root', '******', 'DB');
   if (!$result) {
     throw new Exception('Could not connect to database server');
   } else {
     return $result;
   }
}

但是当我去注册一个新客户时,我得到'无法注册到DB'而且那段代码是

$result = mysqli_query($conn, "insert into user values('".$username."', sha1('".$password."'), '".$email."')");
  if (!$result) {
    throw new Exception('Could not register to DB.');
  }

我的数据库中有一个用户表。表user中的值为:

username varchar(100),
email varchar(150),
passwd varchar(17)

3 个答案:

答案 0 :(得分:4)

如果您已正确连接,则查询中的语法错误会带有密码。这是您当前的代码:

temp

如果您坚持让自己开放潜在的SQL注入攻击,您可以将连接更改为:

$result = mysqli_query($conn, "insert into user values('".$username."', sha1('".$password."'), '".$email."')");

这将允许PHP的$result = mysqli_query($conn, "insert into user values('".$username."','". sha1($password)."', '".$email."')"); 函数正确执行。如果您希望使用MySQL的内置sha1()函数,那么此处的连接将不会像我一样使用。

如前所述Little Bobbyyour script is at risk for SQL Injection Attacks.了解prepared MySQLi语句。即使escaping the string也不安全!

此外,您可能需要考虑使用PHP built-in functions来处理密码安全性。如果您使用的PHP版本低于5.5,则可以使用sha1() compatibility pack。在散列之前,请确保don't escape passwords或使用任何其他清理机制。这样做更改密码并导致不必要的额外编码。

答案 1 :(得分:4)

当你有一个没有列的INSERT语句时,列的顺序应该与表模式匹配。

在此基础上,让我们重新检查您的代码段:

$result = mysqli_query($conn, "insert into user values('".$username."', sha1('".$password."'), '".$email."')");
if (!$result) {
    throw new Exception('Could not register to DB.');
}

根据此,您需要输入用户名,密码和电子邮件。但是,您的表架构首先定义用户名,然后定义电子邮件,然后定义密码。

基于此,我们使用下面的代码段。请注意,这会利用预准备语句来防止SQL注入攻击。

$query = "INSERT INTO user (username, passwd, email) VALUES (?,?,?)";

if ($stmt = mysqli_prepare($conn, $query)) {

    /* bind parameters for markers */
    mysqli_stmt_bind_param($stmt, "sss", $username, sha1($password), $email);

    /* execute query */
    mysqli_stmt_execute($stmt);

    /* close statement */
    mysqli_stmt_close($stmt);
}

另一个问题:数据库中的密码字段太短(17个字符)。 SHA-128哈希密码正好是40个字符,要使用password_ *方法,您至少需要60个字符。我建议只设置密码字段为255个字符。

请记住Jay Blanchard's comment以使用password_ *系列函数。而不是使用SHA1哈希密码。

答案 2 :(得分:4)

这一行肯定是你的问题之一

$result = mysqli_query($conn, 
           "insert into user values('".$username."', sha1('".$password."'), '".$email."')");

将其更改为

$result = mysqli_query($conn, 
          "insert into user values('$username', '$email',  '" . sha1($password) "')");

注意更改顺序以匹配您的架构以及使字符串连接变得清晰。

注意2:您的密码字段太短,无法容纳完整的哈希密码。为了将来打样,我建议使用完整varchar(255)

最好像这样使用password_hash()

$hashed = password_hash($password);

$result = mysqli_query($conn, 
          "insert into user values('$username', '$hashed', '$email')");

然后检查用户何时再次登录

if ( password_verify($_POST['password'], $db_hashed_password) ) {
    echo 'Password OK';
} else {
    echo 'Password failed';
}