Вы действительно должны использовать PHP PDO или MySQLi вместо устаревших функций mysql_ *.
Примечание: используя PHP PDO, ваши параметры автоматически исчезают.
см: this notice on PHP doc
Если вы абсолютно не нужны SHA1, вы хотите, чтобы сначала искать пользователя, а затем оспаривалась сохраненный хэш пароля. Это гораздо более портативно, поскольку некоторые алгоритмы хэширования, такие как Bcrypt, не будут работать с простым сопоставлением строк.
Это приводит меня к следующему пункту: не используйте алгоритмы хэширования FAST (SHA, MD5 и т. Д.) Для хэширования паролей. Эти алгоритмы хеширования предназначены для быстрого хэширования больших объемов данных, что означает, что злоумышленник может быстро генерировать таблицу обратного поиска для небольших данных, таких как пароли. Алгоритмы, такие как Bcrypt, Scrypt, pbkdf2 и т. Д., Являются хорошими примерами специализированных алгоритмов хеширования, предназначенных для медленного или сложного создания таблиц поиска.
<?php
session_start()
$myusername = 'foo';
$mypassword = '123';
try {
$pdo = new PDO('mysql:host=' . DB_HOSTNAME . ';dbname=' . DB_DATABASE, DB_USERNAME, DB_PASSWORD);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die ('ERROR: ' . $e->getMessage());
}
$query = 'SELECT id, password FROM users WHERE username = :username';
$params = array('username' => $myusername);
$stmt = $pdo->prepare($query);
$stmt->execute($params);
// user not found?
if (! $stmt->rowCount()) {
die ('unknown user');
}
$row = $stmt->fetch(PDO::FETCH_OBJ);
// challenge password hash
if ($row->password == sha1($mypassword)) {
// success!
header("location:home.php");
} else {
die ('wrong password');
}
EDIT:
Также убедитесь, что вы начинаете сеанс с session_start(). Это позволит вам хранить переменные сеанса на PHP-сервере с суперглобальным значением $ _SESSION.
// run login script
$_SESSION['user_id'] = $row->id;
// redirect to an authenticated page
затем на всех прошедших проверку подлинности страниц, которые можно запрашивать/кэшировать пользователя по ID и получить пользовательский объект, содержащий все текущие пользовательские данные
session_start()
// make sure logged in
if (! $_SESSION['user_id']) {
// not logged in
// redirect to login
die ('not logged in');
}
$query = 'SELECT * FROM users WHERE id = :id';
$stmt = $pdo->prepare($query);
$stmt->execute(array('id' => $_SESSION['user_id']));
$user = $stmt->fetch(PDO::FETCH_OBJ);
print 'Hello, ' . $user->username;
Если у вас есть [волшебные кавычки] (HTTP: //php.net/manual/en/security.magicquotes.php), который вы не должны использовать, 'stripslashes' должен ** не использоваться **.Если вы новичок в PHP, пожалуйста ** НЕ используйте ** скрипучий, устаревший интерфейс 'mysql_query', когда современные замены, такие как [PDO, не сложно изучить] (http://net.tutsplus.com/tutorials/php/почему вы-должны-быть-с использованием-ПГПС-PDO-для-доступа к базам данных /). Вам было бы еще лучше потратить немного времени на ознакомление с [популярной инфраструктурой PHP] (http://codegeekz.com/best-php-frameworks-for-developers/), поэтому вам не придется переписываться, изобрести колесо. – tadman
В качестве дополнительной заметки вы неправильно используете шифрование паролей. Если вы используете SHA1, важно использовать криптографическую соль. Я также настоятельно рекомендую вам использовать решение на основе Bcrypt, а не SHA1. Ваши предпочтения не имеют значения, когда кто-то захватывает копию вашей базы данных. Ссылка, подобная [PHP The Right Way] (http://www.phptherightway.com/), поможет вам избежать этих ошибок. – tadman