2016-05-07 4 views
0

Im создание веб-страницы для игрового сервера, на котором была только страница регистрации. Все пользователи зарегистрировались и по какой-то причине dum, он сохранил пароль как имя пользователя: пароль, поэтому, если имя пользователя Meko и пароль 1234, на самом деле пароль «Meko: 1234» Im теперь пытается сделать логин, но im not конечно, как я должен проверить этот пароль. У меня есть этот запрос SQL и попытался добавить $ user_username: впереди, но оно не похоже на работу:SQL Query имя пользователя: пароль

$query = "SELECT * FROM account 
       WHERE username = '$user_username' 
       AND sha_pass_hash = '$user_password'"; 

Она должна быть $ user_username: $ user_password

Я надеюсь, что вы можете мне помочь :)

+2

Ответ на ваш вопрос 'CONCAT()'. Фактический ответ - исправить ваши данные с помощью сценария миграции. – CodeCaster

+0

Вы действительно храните пароли как обычный текст? Это очень опасно. – symcbean

+0

Нет, я не хранил пароли как обычный текст. Пароли находятся в sha1 – Kh4zy

ответ

1

Я думаю, вы на php?

$username = 'Meko'; 
$user_password = '1234'; 
$altered_pass = $user_username.':'.$user_password; 

if($stmt = mysqli_prepare($con,"select * from account where username = ? and sha_pass_hash = ?")){ 

    mysqli_stmt_bind_param($stmt,'ss',$user_username,sha1($altered_pass)); 
    mysqli_stmt_execute($stmt); 
    mysqli_stmt_store_result($stmt); 
    if(mysqli_stmt_num_rows($stmt)){ 
     //"yup"; 
    } 
    else{ 
     //"nope"; 
    } 

    mysqli_stmt_close($stmt); 
} 
mysqli_close($con); 
+0

Prone to SQL Injection. Пользователь должен использовать SQL-параметры или, по крайней мере, дезинфицировать ввод. – NineBerry

+0

Im на PHP, но его не работает. Я уже пробовал это. Это дает мне синтаксическую ошибку, но, как писал Codecaster, мне, возможно, придется использовать CONCAT(). Я не знаю, как это сделать. Я никогда не слышал об этом до – Kh4zy

+0

Я обновил свой ответ, посмотри! – Infiltrator

0

Вы не явно указать, но при условии, что ваш sha_pass_hash содержит значение хэш в следующем формате: хэш (имя пользователя: пароль), то хэш «$ user_username» + «:» + «$ user_password» первый, а затем сравните его с вашим паролем.

+1

Это действительно не ответ. – tadman

-3
$search = $username.":".$password; 
$query = "SELECT * FROM account WHERE password = ".$search; 

ВАЖНО:

Я очень надеюсь, что вы готовите ваши заявления и привязки ваших параметров для предотвращения атак с внедрением SQL. Если вы этого не сделаете, сообщите мне, и я могу помочь вам более подробно, чтобы ваша база данных была безопасной.

Кроме того, я рекомендую вам создать другую таблицу и заполнить ее значениями внутри этой таблицы account. Предыдущий ответ - это быстрое исправление, так что ваши пользователи могут войти в систему между тем, но ни в коем случае нельзя, чтобы предыдущая таблица оставалась такой, какая есть.

Позвольте мне знать, если вам нужна дополнительная помощь :)

+0

Im только новичок с php. Приведенный выше пример не работает. Я пробовал несколько раз, и это была не ошибка записи. Подготавливая мои заявления. Вы имеете в виду, что мне нужно использовать sql escape? :) – Kh4zy

+0

Это не проблема, если вы новичок. Могу ли я увидеть, как вы реализовали мой предыдущий код? – Webeng

1

Если то, что вы сохранили в базе данных является SHA1 контрольная сумма, то это то, что вам нужно будет сравнить.

Данные довольно отрывочные.

Предполагая, что строка была сохранена в базе данных

INSERT INTO `account` (`username`, `sha_pass_hash`, ... 
VALUES ('Meko', SHA1('Meko:1234'), ... 

Затем, чтобы проверить наличие этой строки, учитывая:

$user_username = 'Meko' ; 
$user_password = '1234' ; 

если те ценности, которые вы хотите передать в база данных запроса, а затем

$sql = 'SELECT ... 
      FROM account a 
      WHERE a.username  = ? 
      AND a.sha_pass_hash = SHA1(CONCAT(? ,':', ?)'; 

$sth = $dbh->prepare($sql); 
$sth->bindValue(1,$user_username, PDO::PARAM_STR); 
$sth->bindValue(2,$user_username, PDO::PARAM_STR); 
$sth->bindValue(3,$user_password, PDO::PARAM_STR); 
$sth->execute(); 
if($row = $sth->fetch(PDO::FETCH_ASSOC)) { 
    // matching row found 
} else { 
    // no matching row found 
} 
$sth->closeCursor(); 

Если вы не использовали функцию MySQL SHA1 и использовали некоторую другую функцию для вычисления хэша, используйте эту же функцию, когда вы выполняете проверку.

То есть, если строка была вставлена ​​в заявлении формы больше как

INSERT INTO account (username, sha_pass_hash, ...) 
VALUES ('Meko','7c4d046a92c441c426ce86f15fa9ecd1fc1fd5f1', ...) 

Затем, чтобы проверить наличие этой строки, учитывая:

$user_username = 'Meko' ; 
$user_password = '1234' ; 

Тогда ваш запрос к проверка наличия строки будет примерно такой:

$sql = 'SELECT ... 
      FROM account a 
      WHERE a.username  = ? 
      AND a.sha_pass_hash = ?'; 

вычислить хэш пароля, то же самое способ, как когда он был первоначально сделан

$user_sha_hash = sha1($user_username . ':' . $user_password) ; 

И подготовить и выполнить запрос, передавая в ША контрольной строке

$sth = $dbh->prepare($sql); 
$sth->bindValue(1, $user_username, PDO::PARAM_STR); 
$sth->bindValue(2, $user_sha_hash, PDO::PARAM_STR); 
$sth->execute(); 
if($row = $sth->fetch(PDO::FETCH_ASSOC)) { 
     // 
} else { 
     // 
) 
$sth->closeCursor(); 
+2

Хотя мне нравится, как с помощью вашего ответа, действительно стоит упомянуть, что сейчас самое время исправить проблему с паролем, используя правильное [хеширование пароля] (http://www.phptherightway.com/#password_hashing), например ['password_hash '] (http://php.net/manual/en/function.password-hash.php). SHA1 полностью неадекватен. – tadman

+0

Я не сделал регистрацию входа в первую очередь.Я пытаюсь закодировать небольшой веб-сайт для игрового сервера World of Warcraft, у которого была страница регистрации по умолчанию, и я получил назначение сделать сайт, который мы могли бы использовать. Даже у вас всего 50 человек на службе – Kh4zy

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