svfolder
Постоялец
- Регистрация
- 31 Июл 2013
- Сообщения
- 159
- Реакции
- 156
- Автор темы
- #1
Доброго времени суток всем гуру темы, и интересующимся.
Занимаюсь разработкой сайтов, админок вчастности, и применяю следующую технику защиты от подмены данных.
Например у нас есть список каких то записей, например объявлений.
Пользователь авторизован и находится в админке этих записей.
Для того чтобы обеспечить высокую переносимость кода между разными админками, хотелось бы избавиться
от одной навязчивой проблемы, а именно от запросов подобных этому
В нем 2 защиты, первая это укзание в предикате юзера владельца, вторая LIMIT 1,
на тот страшный случай чтобы если уж и выполниться неверный запрос, то попортит только 1 запись.
Так как далеко не всегда можно сразу легко указать AND `USER_ID` = '833' (иногда попросту нету такого поля в таблице)
Приходится сперва извращаться на предмет, а принадлежит ли запись `ID` = '555' юзеру 833
И только убедившись в этом, обновить ее.
Что делаю я.
Беру ID смешиваю его с солью, упаковываю в md5 и в параметрах отправляемых на сервер передаю 2 значения,
собственно 555 и зашифрованный хеш этого значения.
На сервере провожу с оригинальным значением теже действия, и сравниваю два хеша, если они совпали, значит юзер
ничего не поменял, и значению 555 можно верить, в противном случае "юзер плохой"
Пример банален:
И на сервер отправляются оба параметра param и param_ck
Собственно вопрос, насколько это непробиваемо.
Понятно что если соль скомпрометируют, то будет дыра... на некоторое время,
так как соль можно менять автоматом, раз в неделю скажем.
Чтобы уж так все просто не казалось с вопросом, так же надо рассмотреть такие варианты,
(ну чтобы не казалось кулхацкерам что ту все легко ломается)
вариант 2
вариант 3
Занимаюсь разработкой сайтов, админок вчастности, и применяю следующую технику защиты от подмены данных.
Например у нас есть список каких то записей, например объявлений.
Пользователь авторизован и находится в админке этих записей.
Для того чтобы обеспечить высокую переносимость кода между разными админками, хотелось бы избавиться
от одной навязчивой проблемы, а именно от запросов подобных этому
Код:
MESSAGE
SET `PUBLISHED` = '0'
WHERE
`ID` = '555'
AND `USER_ID` = '833'
LIMIT 1
В нем 2 защиты, первая это укзание в предикате юзера владельца, вторая LIMIT 1,
на тот страшный случай чтобы если уж и выполниться неверный запрос, то попортит только 1 запись.
Так как далеко не всегда можно сразу легко указать AND `USER_ID` = '833' (иногда попросту нету такого поля в таблице)
Приходится сперва извращаться на предмет, а принадлежит ли запись `ID` = '555' юзеру 833
И только убедившись в этом, обновить ее.
Что делаю я.
Беру ID смешиваю его с солью, упаковываю в md5 и в параметрах отправляемых на сервер передаю 2 значения,
собственно 555 и зашифрованный хеш этого значения.
На сервере провожу с оригинальным значением теже действия, и сравниваю два хеша, если они совпали, значит юзер
ничего не поменял, и значению 555 можно верить, в противном случае "юзер плохой"
Пример банален:
PHP:
$salt = '?$DBw%4L$U';
$param = 555;
$param_ck = md5($salt . $param);
И на сервер отправляются оба параметра param и param_ck
Собственно вопрос, насколько это непробиваемо.
Понятно что если соль скомпрометируют, то будет дыра... на некоторое время,
так как соль можно менять автоматом, раз в неделю скажем.
Чтобы уж так все просто не казалось с вопросом, так же надо рассмотреть такие варианты,
(ну чтобы не казалось кулхацкерам что ту все легко ломается)
вариант 2
PHP:
$salt1 = '?$DBw%4L$U';
$salt2 = 'u3~rE@hv6{';
$param = 555;
$param_ck = md5($salt1 . $param . $salt2);
вариант 3
PHP:
$salt1 = '?$DBw%4L$U';
$salt2 = 'u3~rE@hv6{';
$param = 555;
$param = $param + $param; (для чисел, ибо id как правило числа)
$param_ck = md5($salt1 . $param . $salt2);