我已使用
连接到数据库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)
答案 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 Bobby说your 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';
}