PHP更新数据库时遇到问题
我已通过使用连接到数据库PHP更新数据库时遇到问题,php,mysql,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”
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)
如果已正确连接,则查询密码时会出现语法错误。这是您当前的代码:
$result = mysqli_query($conn, "insert into user values('".$username."', sha1('".$password."'), '".$email."')");
如果您坚持让自己面对潜在的SQL注入攻击,您会将连接更改为如下:
$result = mysqli_query($conn, "insert into user values('".$username."','". sha1($password)."', '".$email."')");
这将允许PHP的sha1()
函数正确执行。如果您希望使用MySQL的内置sha1()
函数,那么这里的连接将不会像我所做的那样使用
如前所述,请学习以下语句:。即使是这样也不安全
此外,您可能需要考虑使用PHP来处理密码安全性。如果您使用的PHP版本低于5.5,则可以使用
密码\u hash()
。在散列之前,请确保您在它们上安装或使用任何其他清理机制。这样做会更改密码并导致不必要的额外编码。如果您已正确连接密码,则查询中会出现语法错误。这是您当前的代码:
$result = mysqli_query($conn, "insert into user values('".$username."', sha1('".$password."'), '".$email."')");
如果您坚持让自己面对潜在的SQL注入攻击,您会将连接更改为如下:
$result = mysqli_query($conn, "insert into user values('".$username."','". sha1($password)."', '".$email."')");
这将允许PHP的sha1()
函数正确执行。如果您希望使用MySQL的内置sha1()
函数,那么这里的连接将不会像我所做的那样使用
如前所述,请学习以下语句:。即使是这样也不安全
此外,您可能需要考虑使用PHP来处理密码安全性。如果您使用的PHP版本低于5.5,则可以使用
密码\u hash()
。在散列之前,请确保您在它们上安装或使用任何其他清理机制。这样做会更改密码并导致不必要的额外编码。如果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个字符
请记住使用密码*系列函数。当INSERT语句没有列时,不需要用SHA1散列密码。,而是希望列的顺序与表架构匹配 基于此,让我们重新检查您的代码片段:
$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个字符
请记住使用密码*系列函数。不要用SHA1散列密码。这一行肯定是你的问题之一
$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)
最好像这样使用密码\u 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';
}
这条线肯定是你的问题之一
$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)
最好像这样使用密码\u 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';
}
在您的第二个代码片段中,似乎有
$conn=db_connect()代码>在此代码段之前。这是正确的吗?您从未设置过$conn
请使用PHP来处理密码安全性。如果您使用的PHP版本低于5.5,则可以使用密码\u hash()
。在散列之前,请确保您在它们上安装或使用任何其他清理机制。这样做会更改密码并导致不必要的额外编码。表示了解的语句。即使是这样也不安全!在第二个代码段中的代码段中显示,它看起来像是$conn=db_connect()代码>在此代码段之前。这是正确的吗?您从未设置过$conn
请使用PHP来处理密码安全性。如果您使用的PHP版本低于5.5,则可以使用密码\u hash()
。在散列之前,请确保您在它们上安装或使用任何其他清理机制。这样做会更改密码并导致不必要的额外编码。表示了解的语句。即使是这样也不安全!一方面,在您的代码片段中显示MySQL()中确实有一个SHA1函数,这会很有用。也就是说,以这种方式使用该方法