我在这里做错了什么:
<?php
if (isset($_POST['submitted'])) {
$errors = array();
require_once ('mysql_connect.php');
session_start();
$username = $_POST["username"]; // This is the inputted username from the form in Login.html
$password = $_POST["password"]; // This is the inputted password from the form in Login.html
if (empty($errors)) {
$query="SELECT username FROM users WHERE username='$username' AND password='SHA($password)'";
$result = mysql_query($query);
// Mysql_num_row is counting table row
if (mysql_num_rows($result) == 1) {
$_SESSION["username"] = $username; // Creates a cookie saving the username
$_SESSION["loggedIn"] = true; // Creates a cookie saying the user is logged in
// Show thank you message
echo '<h3 style="color:green;">Thank You!</h3>
<span style="color:green;">You have been logged in.</span>';
} else {
echo '<font color="red">You could not be logged in, please make sure your username and password is correct.</font>';
foreach ($errors as $msg) {
echo " - <font color=\"red\">$msg</font><br />\n";
}
}
} else {
echo '<font color="red"><h3>Error!</h3>
The following error(s) occured:<br /></font>';
foreach ($errors as $msg) {
echo " - <font color=\"red\">$msg</font><br />\n";
}
}
}
?>
我得到了:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /login.php on line 19
我的密码是否正确?
答案 0 :(得分:3)
问题是您的MySQL查询导致错误,这意味着您的$result
实际上并不包含结果资源。
您需要从查询中的''
左右移除SHA($password)
,而是将它们放在密码值周围,如下所示:
$query="SELECT username FROM users WHERE username='$username' AND password=SHA('$password')";
我的密码是否正确?
这取决于密码在插入数据库时如何进行哈希处理。 MySQL的SHA()
与其SHA-1()
相同:
计算字符串的SHA-1 160位校验和,如RFC 3174
中所述
这与PHP的sha1()
也是一样的;所以,例如,如果数据库中的密码是使用PHP sha1()
创建的SHA-1哈希值,那么应该没问题。
附注
您应该使用PHP的crypt()
或hash()
来获取散列密码rather than SHA-1。例如,使用refer to the PHP documentation。
在数据库查询中使用任何数据之前,您应该清除/转义 所有 用户提供的数据。这是为了阻止SQL injection attacks。 更好的是,使用预准备语句和参数化查询。有关详细信息,请参阅this answer。
答案 1 :(得分:1)
不要使用''通过SHA功能
$query="SELECT username FROM users WHERE username='$username' AND password='SHA($password)'";
并且当场不记得逃避你的数据。
答案 2 :(得分:1)
为什么在@mysql_query($ query)中放置一个@; ?如果你有一个MYSQL错误,你应该正确处理它而不是忽略它(我假设你有错误)。它可以帮助您了解您的bug来自何处。
此外,您可以在PHP中执行SHA(这取决于您的架构可能对您的项目更好或更差)。