Я'м пишу простой API-интерфейс REST, и я хочу, чтобы ограничить доступ только на мой мобильный-клиент. Другими словами, Я'м пытаясь помешать злоумышленнику, например с помощью curl, чтобы сделать несанкционированный запрос POST.
Конечно, это невозможно. Однако, есть определенные контрмеры, которые делают его трудным для хакеров, чтобы добиться успеха. Сейчас я кодирую все запросы с закрытым ключом, хранящиеся на стороне клиента (очевидно, что это не идеал, но трудность в реверс-инжиниринг приложений для iOS будет надеяться удержать всех, кроме самых решительных хакеров).
Одна простая мысль у меня была-вернуть неверный код ответа HTTP для несанкционированный запрос. А не вернуть а "401 несанкционированный" Почему не вернуться например на "305 Использовать прокси, то" т. е. намеренно путая существо. Кто-нибудь думал об этом?
кто-нибудь когда-нибудь думал об этом?
Да, там было на самом деле говорить о конкретно этом на DEFCON 21 ([видео](
slides).Их вывод был, что работать с коды ответов как оскорбительные безопасности может иногда привести к существенному замедлению автоматических сканеров, неработающие сканеры, и огромное количество ложных срабатываний или ложных негативов (это, очевидно, никак не для ручных разверток).
В то время как безопасность через маскировку не должна быть ваша единственная защита, это может быть полезно в качестве защиты в глубину (другой пример: рекомендуется, чтобы не передавать номера версий всех используемых компонентов).
С другой стороны, остальные API должно быть максимально чистой, и отвечая с намеренно неверной коды http может быть запутанным для разработчиков и законные клиентов (это немного меньше проблем для браузеров, где пользователи не'т действительно см. коды). Из-за этого я не'т рекомендовать его в вашем случае, но все равно интересная идея.
Он выиграл'т действительно замедляют злоумышленник сколь-нибудь заметном количестве, но вызовет каких-либо будущих застройщиков, кто работает на вашей платформе, чтобы быть действительно раздражает в вас. Это может также вызвать определенные хорошие черты вашего запроса HTTP библиотеки, чтобы не быть так хорошо, как они'вновь работает с неверной информацией.
Это очень слабая форма безопасность через незаметность. При проектировании такой системы, вы должны думать о замедлении злоумышленник сотни лет, а не десятков минут - в противном случае вы'Снова все проиграет.
а не возвращаться и "401 несанкционированный" Почему не вернуться например на "305 Использовать прокси, то" т. е. намеренно путая существо.
Да это смутит злоумышленника. Но для тренированного одна, она не может быть более двух секунд. И коды статуса носят далеко не все, что полезно, в основном, просто для перебора имен файлов.
Скажем, у меня есть действующий ключ, и я могу наблюдать за тобой, вернувшихся 200-диапазон кодов для моей идентификации. Если я изменю немного свой ключ, и для каждого запроса вы либо вернуть 305-й, я сразу думаю, что "Хм. Похоже, Дэв может'вэ перепутались и". Если вы вернетесь случайных кодов, я'll знаю, это было специально и я просто игнорирую их.
трудность в реверс-инжиниринг приложения iOS будет надеяться удержать всех, кроме самых решительных хакеров
Да, это будет, но так как это займет всего один, чтобы опубликовать его, это's снова просто замедляя его..
Это безопасность через неясность, то это не дает много безопасности. Решение, которое вы предлагаете, будет только тормозить злоумышленник, не помешают им использовать их собственный клиент. На самом деле, ваш метод шифрования запросов, в зависимости от реализации, может на самом деле сделать приложение менее безопасным путем открытия атак на другие части системы шифрования. Ваши усилия лучше бы потратили на то, чтобы обеспечить API-функций сами по себе (т. е. Pen-тест им и защитить их от атак, как SQL-инъекции), а не пытаться предотвратить несанкционированный доступ клиентов их.
Но пользователь уже использует свой протокол.
Ваша проблема в том, что интерфейс вашего сервера, что пользователь может сделать, это не безопасно! Вы сами решаете, какие данные ваш сервер посылает для кого! (Здравствуй, уважаемый интернет-газет. Да, я смотрю на тебя!)
Конструкция ее, при условии, что пользователь является клиентом. Не ваш код. Потому что он есть. Это не должно волновать, что использовал клиент. Ваше приложение работает на процессоре, который находится под контролем оборудования пользователя. Ваш код-это просто список команды/данные, а пользователь и его процессор может обрабатывать его, как им заблагорассудится. В том числе не обработки. Он решает, что его процессор делает. Не путайте его милости принимая вашего приложения код как есть, для слепого исполнения. Ты-тот, кто доверяет, и это доверие очень быстротечна. Особенно с подмоченной такая тактика.
В любом случае: у вас руки пользователя ключ шифрования и все, и ожидать, что он не использует ее сам, потому что вы положили его где-нибудь в вашей корзине кода. ... Как ДРМ, это змеиное масло и больше не может работать. Это займет всего один человек, чтобы найти, где вы положили ключи. (Это я, например.) Все остальные просто гуглит.
Но я удивлен, что ты думаешь только о шифровании протокола от пользователя, а не для его защиты от человека-в-середине атаки. Предполагая, что причиной этого обычно делается (да, я разговариваю с тобой “снова контентной индустрии”.): Если пользователь является вашим врагом, может быть, вы должны смотреть на бизнес-модель, которая базируется на справедливости и беспроигрышная, вместо того, чтобы надавать пользователя и имея дело с люфтом.
С. П.: обращайте внимание на “безопасность через неясность” ответы. Это заблуждение, что приводит к правильному поведению, но по-прежнему основана на несостоятельных предположений. Используя это в качестве аргумента, является, в лучшем случае, дилетантском и не очень грамотный. В действительности, все безопасность через незаметность. Некоторые просто более темным (= лучше маскируются). Реальная причина это плохо, потому что то, что мы называем реальной безопасности а bazillion раза больше непонятных, придав ему actual (статистической) trustworthily высокая незаметность, в отличие от очень простой неизвестности, что это просто waay слишком вероятно, для кого-то придумать из ничего.
Как и другие уже объяснили, безопасность через маскировку замедляет злоумышленник в лучшем случае.
В вашем конкретном случае, я бы сказал, это не будет иметь никакого заметного эффекта. Чтобы добраться до этой точки, злоумышленник уже пришлось перепроектировать ваши приложения и извлечь закрытый ключ. Это означает, что ваш злоумышленник не идиот и знает, что он'ы делаешь. Немного из неизвестности обойдется ему меньше времени, чем она принимает вас, чтобы реализовать его.
Как другие уже упомянули, Вы'вновь предложив использовать безопасность через маскировку. Хотя этот метод имеет свои цели, рассмотрите следующий прежде, чем выбрать, чтобы принять этот подход:
<Н2>лучший подход</Н2>
Сосредоточить свое время на белых списков всех известных запросов. Это намного проще, чем пытаться выявить все возможные плохих запросов. Ничего не появляется на белый список, должны немедленно получить соответствующий код ответа, такие как HTTP или HTTP 400 405 если вы'вновь фильтрация HTTP-запросов (в качестве примеров). Предпочтительно это происходит до того, как запрос попадает в коде приложения.
Вместе с белый список разрешенных запросов, убедитесь, что ваш приложения обеспечивается на основе список руководств. Вы'll получить лучшие результаты тратить время в список, то вы будете пытаться определить, что злоумышленника и возвращение неясный код ответа HTTP.
Принципиально, вы не можете предотвратить несанкционированный клиентам отправлять запросы. Ближайший вещь, которую можно было бы иметь какие-то криптографические проверить сделано в клиенте, но как сказал Шерлок Холмс: "что можно придумать, еще можете обнаружить, что". (Я знаю это наверняка, потому что у меня треснул люди'ы клиентские безопасности в ряде случаев.)
Вместо этого, построить свой API, такие, что кто это разрешено использовать его с помощью собственных клиентов. Сделать его удобным. Что ты потеряешь от этого? Злоумышленники будут атаковать неважно, что вы делаете, и если вы сделаете свой API прост в использовании, кто-то придумает что-то вы никогда не думали, и сделать ваш сервер еще больше, чем вы могли себе вообразить, что может быть. Что может сделать клиент, который говорит как ваш API и некоторые другие? Какое множество возможностей там, и это будет очень больно вам, чтобы разрешить их?
Я бы'т сделать это. Это обычно означает, что вы создаете свой собственный стандарт, который вызывает:
ваш API, чтобы прогнозировать после создания карты ваших ответов HTTP для их действительного значения. Изменение HTTP-ответов может работать на какой-то "хакеры", который будет сдаваться после нескольких попыток, но он выиграл'т на другие, более решительные из них. Вы хотите защитить свой API от прежнего типа, т. е. 11-летних? Я не'т так думаю.
вполне определенную путаницу для разработчиков и, вероятно, тестеры, особенно те, кто привык работать по мировым стандартам.
Выбрать какой-то другой способ. Там наверняка несколько. Я'вэ боролся с такой же headscratcher себя на несколько недель, в последнее время, и придумал по крайней мере 2 более или менее надежных способов для достижения желаемых ограничений [не постить их здесь.
Там наверняка лучше и гораздо более эффективные способы, чтобы получить то, что вы хотите. Попробуйте взглянуть на ваш API с другого ракурса... если ты хакер и ваша жизнь зависела от взлома, что API-что бы вы сделали, чтобы добиться успеха? Что должно произойти, для вас, чтобы быть разочарованы в ваших попытках сломать его?
Хорошая причина не делать этого, особенно для мобильных приложений, является то, что она's очень вероятно, что ваше приложение обращается к серверу через несколько прокси, например в телефонной компании уже. Большинство крупных предприятий используют прокси в своей сети, чтобы попытаться защитить свои системы от вредоносного контента, и многие телефонные компании снизить качество видео или изображения в пути. Это'll тоже делают с использованием различных системных библиотек для HTTP на вашей платформе бесполезным для вас. Один подход, который'С широко используется для получения некоторых ключ или жетон от информации, пользователь вряд ли захочет делиться, таких как хэширование свое имя, адрес и данные кредитной карты. Таким образом, даже если ваше приложение взломали, люди будут опасаться давать необходимую информацию для произвольной программы они скачали ограничивая возможность поделиться любой проверенный атаки.
Как правило, это's не хорошая идея.
Я очень targetted использовать этот раз получить хороший эффект, когда клиент'сайт s была использована украденная кредитная карта с отмыванием кольцо. Были некоторые отличительные признаки разделяют только мошеннические операции поэтому вместо того, чтобы вежливо отказаться от них я бы на сайте отложить ответ на пару минут (никто не любит сайт, который занимает минут, чтобы сделать что-то), а потом вернуть 500 с сайта's стандартный "и к сожалению, это's не вы, это'ы мне" сообщение для ошибок сервера (это также регистрируются данные для передачи в правоохранительные органы). У нас было три попытки операции, которые получили это ответ опоссума, и тогда никогда не слышал от них.
Хотя, это было:
Пользователи имеющие проблемы должны быть помогли, а не издевались. "Я могу'т сделать это, потому что вы'т правильно авторизованных" и отказывается делать что-нибудь полезным способом. "Я могу'т сделать это, потому что вам нужно использовать прокси-сервера" когда кто-то не'т нужно использовать прокси, матерный. Намеренно бесполезно, имеет смысл только если вы знаете, что вы'вновь подвергается нападению, а затем он должен'т выглядеть заведомо фальшивое сообщение или вы не'т ничего не скрыто (потенциально вы'вэ показали, что если один и тот же фальшивый статус это'т использовать для каждого клиента ошибка).
Что сказал, это это нужно принимать меры, чтобы статусы не утечка информации. Е. Г. это'приемлемые (в описанные как таковые в стандартах) для /администратор/ на 404, хотя бы 200 в другом случае (авторизованный пользователь, разрешенных клиентских IP-адресов и т. д.) Кроме того, если
/участники/мой профиль будет 200 для авторизованного пользователя и 403 или 401 в противном случае, если/членов/fdsasafdasfwefaxc бы 404 для авторизованного пользователя это'хорошая идея для того, чтобы 403 или 401 для несанкционированного пользователя. Это'т так много безопасность через маскировку, а учитывая, URI которых относятся к ресурсам, чтобы быть одним из битов информации, что защищен.