2016-09-23 10 views
1

Ситуация: Незарегистрированный пользователь посещает веб-сайт и выдает запрос на предмет. В соответствии с текущим потоком данных этот запрос сначала вставляется в db, а идентификатор запроса переносится в URL-адресе последующих страниц впредь (где пользователь получает дополнительную информацию).Запретить пользователю манипулировать параметром строки запроса

Задача: Пользователь может изменить идентификатор.

Что я сделал до сих пор: Как только я получить идентификатор после запроса вводится с помощью lastInsertId(), я хранить его в переменной сеанса и проверить в последующих страницах против ид от $ _GET. Я также реализовал CRSF-защиту, но когда совпадает токен, токен сеанса отключен. Следовательно, даже если пользователь обновляется на одном и том же URL-адресе, проверка не выполняется.

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

+1

Добавление сеанса - хороший метод. Наряду с этим вы можете вручную слить Id с некоторой солью, которая хранится в конфиге. Вы также можете использовать что-то вроде комбинации «день и год» в качестве соли, и в этом случае она останется постоянной в течение дня. Передайте соль вместе с идентификатором и повторите проверку соли и сеанса и продолжайте, если они совпадут, – AtulBhatS

+0

благодарит @AtulBhatS! Использование mcrypt_create_iv() может заботиться о соли? Просто попытался сделать то же самое с url stackoverflow, он перенаправил меня на другой вопрос. Полагаю, это зависит от чувствительности данных, о которых идет речь :) – Bonzo

ответ

3

На основе строки '(где пользователь получает дополнительную информацию)' Я предполагаю, что вы используете какую-то форму/POST для получения данных? Я бы использовал технику, изложенную в комментарии AtulBhatS, и использовал хэшированные данные. Вы можете либо установить хэшированные данные в GET, либо установить их в скрытом поле в поле указанной выше/POST.

В основном это что-то вроде этого:

$id = $thisRequestIdOfYours; 
$hash = hash('sha512', 'aRandomSaltStringOnlyKnownByYourScript'.$id); 

Просто используйте эти 2 значения в $ _GET (вместо только $ ид, как вы делаете сейчас). Или установите его в скрытом поле.

После повторной отправки поста вы можете сделать чек:

// Use $_POST if you use the hidden field way. 
if(hash(sha512, 'aRandomSaltStringOnlyKnownByYourScript'.$_GET['id']) !== $_GET['superSecretHash']) { 
    // h4x0r d3tect3d 
    die('you have no business here'); 
} 

Из-за «соль» (aRandomSaltStringOnlyKnownByYourScript), который известен только внутри вашего сценария это очень и очень трудно расшифровать и изменяют получить с хэш в соответствии с измененным вручную идентификатором.

Очевидно, что со всеми проходами, чем сильнее соль, тем сильнее трещина. Поэтому бросьте некоторые пробелы, числовые или даже другие персонажи, чтобы поймать плохих парней.

0

В идеале вам следует избегать хранения данных, которые должны быть скрыты в URL-адресах, поэтому я предлагаю вам применить решение Pim, но вместо этого сохранить хешированное значение в файлах cookie, которые гораздо менее доступны для классического пользователя, чем параметры URL.