2016-08-05 2 views
0

Должен ли я проверять имя пользователя и передавать слово, ища оба в таблице SQL. Или Должен ли я найти имя пользователя, а затем совместить это слово с инструкцией PHP if?Какой метод лучше проверять учетные данные пользователя?

  1. SELECT * FROM table WHERE username = $username AND password =$password

  2. SELECT * FROM table WHERE username = $username ...

    if ($row[password] == $password) { do stuff }

Какой метод является более безопасным и эффективным?

+2

Ни то, ни другое. Обычно используйте функцию, например if (valid_password ($ username, $ password)) {...} Затем вы можете много сделать, как проверить учетные данные пользователя в этой функции. – SIDU

+4

Искать только для входа в систему, подтвердите пароль в php. И используйте подготовленные заявления. Вы не должны передавать даже зашифрованный пароль в сети (ваши методы шифрования могут быть проверены, если видится сетевой трафик), и если ваш запрос возвращает результат, ваш поиск не проверяет пароль. Если запрос будет скомпрометирован, он войдет в систему. например, это '$ username ="; выберите 1 в качестве строки от имени пользователя; - 'вернет строку => 1' и потому что вы, скорее всего, проверяете результат (num_rows == 1 или такой) и не проверяете пароль, он пройдет условие if. – ArtisticPhoenix

+0

http://stackoverflow.com/questions/401656/secure-hash-and-salt-for-php-passwords?rq=1 – SIDU

ответ

-1

Из второго перечисленного выше второй является более безопасным, поскольку первый из них более наклонён к SQL-инъекции.

SELECT * FROM table WHERE username = $username AND password =$password 

В этом коде, если значение имени пользователя и пароля вводится что-то вроде «а или („а“=„а“)» код будет изменен, чтобы

SELECT * FROM table WHERE username = a or ('a' = 'a') AND password = a or ('a' = 'a') 

Что означает четкий код для перечисления всех ваших данных.

Принимая во внимание, что во втором случае условие IF будет рассматривать значение только как одну строку. Так второй является лучшим среди 2 у упомянутого ..

Надеется, что это помогает

+0

Спасибо. И кроме 2. Есть ли лучший способ? Кто-то упомянул о функциях ... –

+0

Здесь вы можете найти лучший ответ. Http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php –

+1

Если вы разрешаете SQL-инъекцию, у вас есть большие проблемы в любом случае! – deceze

2

Дела в том, ... Вы должны store salted, hashed passwords в базе данных. Так как это индивидуально соленый за пользователя/пароль, вы не можете найти , потому что вы не знаете соль и, следовательно, не можете рассчитать соответствующий хэш заранее. Если вы делаете это правильно, вы должны сначала ввести пользовательскую запись по имени пользователя, а затем проверить хэш пароля, используя извлеченную соль/хэш. Псевдокод:

$user = fetch_from_database($_POST['username']); 

if (!$user) { 
    throw new Exception("User doesn't exist"); 
} 

if (!password_verify($_POST['password'], $user['password_hash'])) { 
    throw new Exception('Invalid password'); 
} 

echo 'Welcome ', $user['name']; 

См http://php.net/password_hash, http://php.net/password_verify.

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