2013-09-26 4 views
2

Моя сессия MySQL начнется, если $count равно 1, но не равно 1 , и я не знаю, как это исправить, я довольно новичок в php, и я предпочитаю использовать sha1 вместо BcryptМоя сессия MySQL не запустится

<?php 
    //login form 
    mysql_connect("xxxxx","xxxxxx","xxxxxx") or die(mysql_error()); 
    mysql_select_db("u940004575_chat"); 

    $myusername = stripslashes($myusername); 
    $mypassword = stripslashes($mypassword); 
    $sha1mypassword = sha1($mypassword); 
    $myusername = mysql_real_escape_string($myusername); 
    $mypassword = mysql_real_escape_string($mypassword); 
    $sha1mypassword = mysql_real_escape_string($sha1mypassword); 
    $sql = mysql_query("SELECT id FROM users WHERE username='$myusername' and   password='$sha1mypassword'")or die(mysql_error()); 
    $result = mysql_query($sql); 

    if ($sql) { 
     $count = mysql_num_rows($sql); 
    } 

    if ($count == 1) { 
     session_register("myusername"); 
     session_register("mypassword"); 
     header("location:home.php"); 
    } else { 
     echo "Wrong Username or Password"; 
    } 
?> 

Если кто-то может помочь мне, что было бы здорово, любое исправление будет весьма признателен.

+3

Если у вас есть [волшебные кавычки] (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

+1

В качестве дополнительной заметки вы неправильно используете шифрование паролей. Если вы используете SHA1, важно использовать криптографическую соль. Я также настоятельно рекомендую вам использовать решение на основе Bcrypt, а не SHA1. Ваши предпочтения не имеют значения, когда кто-то захватывает копию вашей базы данных. Ссылка, подобная [PHP The Right Way] (http://www.phptherightway.com/), поможет вам избежать этих ошибок. – tadman

ответ

0

Посмотрите, это должно быть так:

$sql = "SELECT id FROM users WHERE username = '$myusername' and password = '$sha1mypassword'"; 
// you defined the sql query 

$result = mysql_query($sql); 
// now you executed it and have the result 

// and you can go on with this result 
if ($result) { 
    $count = mysql_num_rows($result); 
} 

и, кстати, перейти к mysqli_query(), потому что mysql_query() будет скоро будет устаревшим. См. Официальные документы.

+0

Вы оставили '$ count = mysql_num_rows ($ sql);' что неверно –

+0

Правый Себастьян, спасибо, но посмотрите, это просто показать направление в Лохлан. Весь код настолько сырой, что нет смысла в исправлениях, его нужно пересмотреть, переосмыслить и переделать правильно :) –

+0

Тогда вам действительно не следует использовать mysql_ *, но либо mysqli_ * или PDO;) –

0

Try:

if ($result) { 
    $count = mysql_num_rows($result); 
} 

вместо:

if ($sql) { 
    $count = mysql_num_rows($sql); 
} 
+0

спасибо, что попробовали –

0

Дайте этому выстрел

if (!$result) { 
    die(mysqli_error()); 
} else { 
    // check if $result row == 1 
    if (mysqli_num_rows($result) == 1) { 
     // do stuff here 
    } 
} 

Как упоминалось ранее, использовать mysqli_ потому что развитие для mysql_ остановился. Read More

1

Вы действительно должны использовать 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; 
+0

это сработало, но теперь все это deos появилось с неизвестным пользователем, который является еще одним из числа строк. http://chatspace401.bugs3.com/, то есть домен –

+0

Он работает для меня. Убедитесь, что пользователь примера существует, или что вы удаляете мои переменные примера. Пример строки пользователя: INSERT INTO 'users' (' username', 'password') VALUES ('foo', '40bd001563085fc35165329ea1ff5c5ecbdbbeef'); – Leetbulb

+0

обновлен для некоторых сеансов – Leetbulb

Смежные вопросы