Проверка токена из письма подтверждения регистрации

Forever

Новичок
Помогите определиться. есть два варианта:
а) Создать поле token и token_date в самой таблице юзеров, потом в скрипте проверки токена
делать лишь запрос:

'UPDATE users SET confirm = 1 WHERE id = ' . $_GET["user_id"] . ' AND token = ' . $_GET["token"] . ' AND
token_date = не старше недели AND confirm = 0'

и если mysqli_stmt_affected_rows вернула 0, то посылать.

б) Создать отдельную таблицу с полями user_id, token, date.
В скрипте проверки сделать запрос
'SELECT user_id, token, date FROM reg_tokens WHERE user_id= '.$_GET["user_id"]

Проверить токен и дату, если все нормально, то делать
'UPDATE users SET confirm = 1 WHERE id = ' . $_GET["user_id"]



Так вот, объясните пожалуйста, какой лучше в плане производительности для БД и вообще.
 

Вурдалак

Продвинутый новичок
в плане производительности для БД и вообще.
В плане производительности — без разницы.
В плане безопасности — запрос формируется некорректно и допускает SQL injection.
Касаемо «вообще»: как правило, так бизнес-логику не оформляют. Её обычно пишут на PHP, а базу используют как инструмент для хранения данных.
 

sanmai

Новичок
Кроме SQL инъекций можно вспомнить про важность не сравнения токенов как строк. И вот почему:

PHP:
var_dump(md5('240610708') == md5('QNKCDZO')); // true
Используйте функцию hash_equals
 

Breeze

goshogun
Команда форума
Партнер клуба
Кроме SQL инъекций можно вспомнить про важность не сравнения токенов как строк. И вот почему:

PHP:
var_dump(md5('240610708') == md5('QNKCDZO')); // true
Здесь нет сравнения строк. Чтобы сравнить как строки, нужно использовать ===
 

fixxxer

К.О.
Партнер клуба
Не поэтому. Строки достаточно сравнивать оператором ===, сравнение строк через == всегда некорректно, потому что это не сравнение строк.

Функция hash_equals нужна параноикам, чтобы сравнение всегда занимало одинаковое количество времени, чтобы избежать потенциальной атаки, когда хэш подбирают по одному символу, учитывая время ответа (если первые символы уже не совпали, то строки дальше сравниваться не будут и ответ с ошибкой будет отдан чуть быстрее).
 

sanmai

Новичок
Функция hash_equals нужна параноикам, чтобы сравнение всегда занимало одинаковое количество времени, чтобы избежать потенциальной атаки, когда хэш подбирают по одному символу, учитывая время ответа (если первые символы уже не совпали, то строки дальше сравниваться не будут и ответ с ошибкой будет отдан чуть быстрее).
Если оставить эту явную и известную дыру, которую вы так замечательно описываете, для всех желающих, то так будет хорошо и правильно, да?
 

WMix

герр M:)ller
Партнер клуба
Если оставить эту явную и известную дыру, которую вы так замечательно описываете, для всех желающих, то так будет хорошо и правильно, да?
разговор не только про hash
там неявный cast к числу.
PHP:
var_dump(md5('240610708') == md5('QNKCDZO')); // true
ты же 2 strings не сравниваешь через hash_equals
PHP:
var_dump('0e45' == '0e57');
 
Сверху