LINUX.ORG.RU

BEGIN TRANSACTION; password_needs_rehash(); /* СОСНУЛИ ВСЕ */; COMMIT

 


0

1

BEGIN TRANSACTION блокирует доступ к базе другим процессам, пока не выполнится COMMIT или как?

тут короче password_hash() завезли, функцию чтобы быдлокодеры перестали делать md5($_POST['password'])

алгоритмом хэширования, солью, уровнем сложности — всё это берёт на себя команда PHP и делает по-канонуЪ

просто быдлокодер должен использовать password_hash($_POST['password'], PASSWORD_DEFAULT)

так вот

суть в том, что в будущем могут изменяться алгоритмы хэширования и это всё учтено, что при каждом логине на сайт — надо проверять хэши и на всякий случай перегенерировать, если допустим команда PHP в следующем релизе изменит алгоритм для создания хэшей

if (password_needs_rehash($hash))

эта самая проверка занимает около секунды времени

секунды времени, Карл!

а перед этим в базу вносятся другие изменения, типа дата последней авторизации, куда же без неё, — и ради этого нужна транзакция, чтобы потом всё за раз.

и вооот

ты делаешь BEGIN TRANSACTION, база блокируются, все сосут и ждут пока пройдёт авторизация у одного пользователя

так что-ли получается?

if (password_verify($_POST['password'], $user_password_hash)) {

$dbh->query('BEGIN TRANSACTION');

/*
транзакция стоит, все сосут^Wждут одного пользователя,
пока не пройдёт проверка password_needs_rehash() при каждой авторизации!
*/
if (password_needs_rehash($user_password_hash, PASSWORD_DEFAULT, array('cost' => 13))) {
$try = $dbh->prepare('UPDATE user SET user_password_hash = :user_password_hash WHERE user_id = :user_id');
$try->bindValue(':user_id', $user_id);
$try->bindValue(':user_password_hash', password_hash($_POST['password'], PASSWORD_DEFAULT, array('cost' => 13)));
$try->execute();
}

// окей, едем дальше
$try = $dbh->prepare('UPDATE user SET user_date_authorized = CURRENT_TIMESTAMP WHERE user_id = :user_id');
$try->bindValue(':user_id', $user_id);
$try->execute();

// итог: транзакция продолжительностью в секунду-две
// это нормально?
$dbh->query('COMMIT');

скажите! транзакция блокирует базу для других процессов или нет?

и с новым годом!!

★★★★★
Ответ на: комментарий от Deleted

Готовлю на завтрак яичницу. Плотный белковый завтрак лучшее средство от похмелья!

Spoofing ★★★★★
() автор топика

транзакция блокирует базу для других процессов или нет

Нет конечно, ты сдурел? Там снапшоты используются.

no-such-file ★★★★★
()

Что за БД?

Вообще, я бы сделал через отдельный скрипт, который прогоняет проверку для каждого пользователя и потом коммитит все изменения.

P.S. Почему не перенести BEGIN после проверки на обновления хэша?

gh0stwizard ★★★★★
()
Последнее исправление: gh0stwizard (всего исправлений: 1)

тут короче password_hash() завезли, функцию чтобы быдлокодеры перестали делать md5($_POST['password'])

скажите! транзакция блокирует базу для других процессов или нет?

быдлокодеры

А ты не быдлокодер?

resurtm ★★★
()

$dbh->query('COMMIT');

Что, вот так просто закоммитишь транзакцию? А как же проверить на ошибки и отловить исключения?

resurtm ★★★
()

А нафига транзакция для одиночного запроса изменения хеша?

Нафига транзакция с никак не связанным с изменением пароля одиночным запросом изменения даты авторизации?

Это из поговорки про человека, впервые взявшего в руки молоток, что ли? :)

KRoN73 ★★★★★
()

BEGIN TRANSACTION блокирует доступ к базе другим процессам, пока не выполнится COMMIT или как?

нет, читай документацию. Речь идёт о MySQL, я правильно догадываюсь?

Harald ★★★★★
()

Все нормально, продолжай в том же духе. Методом тыка что нибудь да получится.

redixin ★★★★
()
Ответ на: комментарий от Harald

Я думаю, что речь идет про sqlite, оно раньше грешило этим вроде. Но судя по тому мусору, который постит это чудо, матчасть оно не знает и даже не пытается узнать.

Какой алгоритм хеширования используется и как замеры проводились? Зачем ты делаешь эти проверки внутри транзакции? В твоем случае транзакция вообще не нужна (тем более у тебя итак роллбэка нет), денормализуй бд и обновляй все одним запросом

boombick ★★★★★
()

скажите! транзакция блокирует базу для других процессов или нет?
и с новым годом!!

И вас с наступившими, и спасибо за хорошее настроение=) А вообще по теме - если вы пишите такие портянки кода, неужели вы их не запускаете?=)

// итог: транзакция продолжительностью в секунду-две
// это нормально?

Мне кажется, или здесь слышится утверждение, но не вопрос. То есть у вас транзакция на изменение записи реально блокирует таблицу, или вы все же не уверены?=)

ты делаешь BEGIN TRANSACTION, база блокируются, все сосут и ждут пока пройдёт авторизация у одного пользователя
так что-ли получается?

Нет, не так конечно, может вам следует прочитать сначала о транзакциях? Транзакция может быть выполнена либо целиком и успешно, соблюдая целостность данных и независимо от параллельно идущих других транзакций Ну и если вы потратите 15-20 минут личного времени и почитаете о моделях транзакций, вы поймете что для изменения одной записи, совсем не обязательно блокировать их целыми пачками=)

znenyegvkby
()

а не чудило ли ты, товарищ, если эту тормозную функцию специально загнал в транзакцию, хотя мог не загонять и посчитать заранее?

stevejobs ★★★★☆
()
Ответ на: комментарий от znenyegvkby

Ну и если вы потратите 15-20 минут личного времени и почитаете о моделях транзакций, вы поймете что для изменения одной записи, совсем не обязательно блокировать их целыми пачками=)

вроде у mysql сторадж myisam блочит всю таблицу уже просто чтобы сделать инсерт, не? xD Много позже добавили опцию concurrent_inserts=N, но вопреки названию она все равно не умеет в собственно concurrent inserts, а только перестает мешать паралелльным селектам (инсерты продолжают стоять в синхронизованной очереди). С другой стороны, это не совсем честно, тк myisam не умеет в транзакции. Такшта боюсь для проверки утверждения под всеми популярными БД 15 минутами тут не ограничится :(

stevejobs ★★★★☆
()
Последнее исправление: stevejobs (всего исправлений: 1)

и на всякий случай перегенерировать

Вау, это оффициальная рекомендация? 2015 год на дворе, но разработчики php так и не научились программировать. Password schema? Не, не слышал.

true_admin ★★★★★
()

Зачем password_needs_rehash запускать при каждом логине?

elagagarina
()
Ответ на: комментарий от stevejobs

С другой стороны, это не совсем честно, тк myisam не умеет в транзакции.

Если вы это знаете, тогда для чего ставите myISAM в пример? Это не транзакционный движок, я конечно извиняюсь, но мы вроде бы говорим именно о транзакциях здесь=) и ваше замечание

вроде у mysql сторадж myisam блочит всю таблицу уже просто чтобы сделать инсерт, не? xD

в контексте моего комментария и обсуждаемой темы совсем не уместно.

znenyegvkby
()
Ответ на: комментарий от stevejobs

Ну и конечно мое замечание

Ну и если вы потратите 15-20 минут личного времени и почитаете о моделях транзакций, вы поймете что для изменения одной записи, совсем не обязательно блокировать их целыми пачками=)

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

znenyegvkby
()
Ответ на: комментарий от anonymous

Почему ты не используешь отступы?

Чтобы у людей глаза вытекли. Только что был у офтальмолога, диагноз: -2 на обоих глазах, пересыхание роговицы. Спуф своим кодом хочет сделать мне -6.

drull ★☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.