Как ограничить доступ к файлу PHP?

Я хотел бы ограничить доступ к файлу PHP на моем сервере. Этот PHP-файл принимает данные из HTTP-запроса GET и добавляет его в файл. Просто. Но я не хочу, чтобы этот файл PHP выполнялся, если HTTP-запрос не создан из приложения смартфона, которое я разработал.

Я не хочу аутентифицировать каждого пользователя отдельно. Я хочу, чтобы мое приложение и только мое приложение могли отправлять запрос в файл PHP. Я не хочу, чтобы люди вводили аналогично сформированный запрос (http://www.mydomain.com/check.php?string=blahblahblah) в браузер и оказывали такое же влияние.

Я подумал о проверке HTTP_USER_AGENT или какой-либо другой переменной, но я боюсь, что их тоже легко подделать. Я мог бы вставить ключ в свое приложение, которое я ищу, но этот ключ также может быть скомпрометирован.

Следующим шагом было бы, чтобы сервер отправил мне вызов, на который я отвечаю соответствующим образом. Или я мог даже заглянуть в PKI. Но что относительно простой способ сделать это, учитывая, что я не пытаюсь защитить что-либо реальную ценность, просто чтобы предотвратить мелкий вандализм.

Я пытаюсь изобрести колесо здесь? Есть ли простой, проверенный способ сделать это?

FWIW, вот самый безопасный метод, о котором я могу думать, без серьезного влияния на производительность – по существу, путь RESTful (ish), поскольку для его дальнейшего увеличения потребуется несколько запросов и информация о состоянии соединения, хранящаяся на сервере:

  • Приложение и сервер имеют идентичную солонскую строку, жестко закодированную, уникальную для каждой последующей версии мобильного приложения. Эта строка должна быть конфиденциальной.
  • Когда пользователь устанавливает приложение на своем устройстве, приложение связывается с вашим сервером и сообщает ему о версии приложения и IMEI устройства, с которыми API-интерфейсы для любой мобильной платформы, с которой вы работаете, должны позволять вам извлекать данные.
  • Сервер генерирует уникальный ключ для этого экземпляра приложения, который отправляется обратно в приложение и сохраняется на устройстве, и сохраняет его в серверной базе данных с IMEI и установленной версией.
  • Во время повседневной работы (т. Е. При выполнении запроса, изложенного в вопросе) приложение следует этой процедуре:
    • Получите следующую информацию:
      1. Устройство IMEI
      2. Ключ приложения
      3. Версия приложения
      4. Твердокодированная соляная струна
      5. Случайно сгенерированная строка для дополнительной соли (производная от текущей метки с микросекундами всегда хороша для разумного количества энтропии).
    • Объедините все эти части информации вместе, желательно с жестко закодированным дополнением между ними и создайте хэш результирующей строки.
    • Отправьте на сервер следующие фрагменты информации вместе с фактическими данными запроса (возможно, в файлах cookie для крошечного дополнительного бита безопасности):
      1. Сгенерированный хэш
      2. Ключ приложения
      3. Случайно сгенерированная строка, используемая в качестве дополнительной соли
  • Теперь сервер использует ключ App для извлечения IMEI устройства и версии приложения этого экземпляра из базы данных и использует эту информацию вместе с жестко запрограммированной солевой строкой для идентификатора версии и дополнительной солевой строки, отправленной устройством, для создания хэш. Если хэш, сгенерированный на сервере, соответствует хешу, сгенерированному мобильным устройством, запрос хорош, если не отклонять его.
  • Все коммуникации в этом процессе превышают HTTPS.

Чтобы прорвать эту систему и успешно обмануть запрос, злоумышленнику нужно будет знать следующее:

  1. Устройство IMEI
  2. Ключ приложения
  3. Версия приложения
  4. Твердосплавная соль
  5. Механизм, который вы используете для генерации хэша (точный формат входной строки и алгоритм хэширования).

Очевидно, что если вы работаете с мобильным устройством 1 – 3, его легко извлечь, но 4 и 5 не могут быть найдены без обратного проектирования приложения (которое буквально ничего не может сделать для предотвращения, для людей, обладающих знаниями и терпением сделай это).

Атака «человек в середине» в принципе невозможна – даже после пробития SSL (что, по меньшей мере, нетривиально) и обратного проектирования приложения, чтобы получить 4 и 5, 1-3 невозможно получить без нападение грубой силы на хэш, что является достаточно сложным, что для этого потребуется в среднем несколько сотен миллионов лет (см. эту страницу, чтобы увидеть, как я пришел к этой цифре), особенно если одна из трех имеет переменную длину, которая строка версии приложения может быть легко выполнена.

Определите соль как в вашем приложении, так и в файле php, затем добавьте хеш в сочетании с текущим временем. Это вряд ли когда-нибудь обманет.

$hash = sha1(time() . 'bladieblasalt'); if($_GET['hash'] == sha1(time() . 'samehash')) { echo 'valid'; } 

Во-первых, вам нужно будет внедрить ssl в ваше приложение, а кто-то с небольшим знанием может просто иметь там телефон, подключенный к Wi-Fi, и обнюхивать трафик между приложением и вашим сайтом с помощью wirehark или cain и abel ect. и получить URL-адрес и любые переданные параметры, не нужно разбирать что-либо.

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

Токен будет выглядеть так: UNIQUE_REQUEST_ID_ASSIGNED_BY_SERVER:APPsIP:APPsTIME Шифровать эту строку и отправить ее как $_GET['token']

Затем на вашем сервере расшифруйте строку и explode() строку в ее части и проверите против базы данных или сеанса, что идентификатор запроса, ip и время соответствия ect, если все хорошо, что бы это ни было.

Подобно системе безопасного входа в систему, для каждого пользователя присваивается уникальная соль и хранятся вместе с идентификатором пользователя.

Суть заключается в том, чтобы заставить злоумышленника злоупотреблять системой. 99% людей даже не подумают, что они будут играть, а остальные 1% будут закрыты.

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

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

То, что вы действительно хотите проверить, это аутентичность передаваемых данных. Поэтому просто возьмите ядро ​​этих данных (т. Е. Все поля, которые действительно имеют значение), объедините их с общим секретом, хэш-результат и передайте его как дайджест сообщений. Сервер выполняет тот же расчет и проверяет, соответствует ли вычисленный дайджест переданному. Если это так, отправитель этого сообщения должен знать общий секрет.

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

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

Нет гарантийного метода. Вы можете использовать аутентификацию oauth … В зависимости от того, какую платформу вы используете и как развертывание приложения на телефоне, возможно, вы можете скомпилировать свой ключ в самом приложении? Все, что угодно и всегда может быть взломано, нет 100% безопасности … Но не стыдно в попытке. 🙂

Лично, что я использую для своих мобильных приложений, это проверка подлинности RESTful с обычной паролей входа / прохода на основе токена, до истечения срока ее действия. 🙂

HTTP-запросы могут быть созданы персонажем по символу любым способом, который хочет отправитель. Spoofing всегда будет возможно.

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

Позвольте вам подключить приложение для входа в ваше приложение PHP через HTTPS, чтобы исключить перехват.