2016-01-09 3 views
-3

ПРЕДПОСЫЛКА: Я реализую PHP-сервер без HTTPS/SSL. На этом я хочу подтвердить, что пользователь, выполняющий вызовы на сервер, имеет значение, предполагая, что связь между приложением и сервером просматривается угонщиком (хакером с сетевым снифером). Я также предполагаю, что угонщик является владельцем приложения, пытающимся выяснить, как приложение взаимодействует с сервером, чтобы взломать мою систему. Я не буду контролировать, кто является владельцем приложения.Защита сервера PHP от угонщика

До сих пор я реализовал то, что приложение должно начать сеанс, прежде чем они смогут работать с сервером. Для этого приложение сначала отправляет запрос серверу с произвольно сгенерированным кодом и номером авторизации, а сервер отвечает маркером безопасности. Номер авторизации основан на коде и другой секретной информации в приложении. При последующих вызовах приложение восстанавливает код и использует токен, а другая секретная информация пересчитывает номер авторизации (он никогда не ретранслирует токен на сервер). Таким образом, каждый вызов проверяется.

Он настроен так, что вызывающие параметры одного вызова не могут быть повторно использованы в следующий раз, так что, если угонщик может видеть сообщение, используемое в сеансе, они ничего не могут с ним поделать. Их использование просто указывает, что вызов «не разрешен». Я на 99% уверен, что подключил все связанные дыры к сеансовой связи, так что угонщик не может вторгнуться в мою среду.

ПРОБЛЕМА: Угонщик увидит исходный запрос сеанса, повторно использует эти параметры, чтобы получить новый сеанс и использовать их, чтобы в конечном итоге выяснить, как сеанс вызывает работу.

ВОПРОС: Какую стратегию вы бы использовали, чтобы подтвердить, что только мое приложение разговаривает с сервером во время первоначального запроса сессии, а не угонщик, олицетворяющий мое приложение, чтобы начать сеанс?

Примечание: Сохранение параметров запуска сеанса нереально. Одна из моих идей заключается в том, чтобы вставить «GMT time + N seconds» в случайно сгенерированный код, а затем проверить, установлено ли в GMT GMT + N значение сервера GMT <; таким образом, случайно сгенерированный код становится недействительным в течение N секунд.

+0

То, что вы хотите, невозможно. Если злоумышленник может видеть трафик в обоих направлениях, злоумышленник может олицетворять пользователя (ваше приложение), период. Это основная причина использования SSL. –

+1

Почему вы не используете SSL? Если это из-за стоимости: проверьте letencrypt. – Marged

+0

@Marged Это из-за стоимости, я не знал, что letencrypt существует. Благодарю. – Elenesski

ответ

2

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

Причина, по которой HTTPS так широко используется, потому что работает. Лично я бы предложил купить SSL-сертификат.

Атаки «Человек-в-середине» будут выполняться очень легко в этой системе. Подумайте, получает ли злоумышленник сообщение от вашего клиента, с недавно вычисленным кодом, о котором вы говорите. Что мешает им модифицировать остальную часть сообщения? Код по-прежнему зависит от того, что ожидает сервер, поэтому он просто будет обслуживать запрос, который делает клиент (который на самом деле является злоумышленником).

Будучи в состоянии Аутентифицировать, проверить и маскировка информации в пути являются ключевыми элементами в системе, как это. Ваша система действительно не делает ничего из этого.

+0

Что я должен был услышать. Благодарю. – Elenesski

+0

Не проблема. Каждый может создать систему, которую они не могут сломать. Очень немногие могут создать систему, которую никто другой не сможет сломать. –

+0

При исследовании SSL я вижу, как шифрование может помешать человеку-в-середине понять, что такое сообщение, но если злоумышленник является владельцем приложения, я предполагаю, что он может декомпилировать приложение. Есть ли что-нибудь, что я могу сделать, чтобы предотвратить или помешать олицетворению? – Elenesski

1

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

  • Использование SSL с фиксацией сертификата в приложении. Это гарантирует, что ваши запросы не читаются, даже если человек не находится в средней атаке. Таким образом, ваш API не отображается.
  • Если вы настаиваете на том, чтобы не использовать SSL, вы можете поместить секретный ключ в приложение, чтобы подписать запрос, а с открытым ключом сервера зашифровать его.
+0

SSL, похоже, путь. Кроме того, я действительно использую секретный ключ в приложении, который является «другой информацией». Но, как вы говорите, ничто не защищает меня от пользователя, декомпилирующего приложение, чтобы выяснить, что это за «ключ». – Elenesski

+0

Обязательно изучите сертификат **, закрепляющий **, это необходимо, чтобы избежать атак типа «человек в середине», которые все еще можно выполнить с помощью обычного SSL! –