Блокировка API для определенного URL - PullRequest
2 голосов
/ 07 июня 2011

Это может быть глупый вопрос и / или простой ответ, или ни того, ни другого.

Я занимаюсь разработкой API, и мне было интересно, можно ли привязать его к определенному URL / хосту?

например, Мой API находится на одном URL, и он отвечает только на httpwebrequest с определенного URL.www.apione.com отвечает только на www.apitwo.com

Возможно ли это?Я просматривал заголовки хоста, но не думаю, что можно получить эту информацию.

Спасибо

Ответы [ 2 ]

2 голосов
/ 07 июня 2011

Если ваш «API» является веб-службой, вы можете использовать «Request.UrlReferrer», чтобы получить объект URI, который сообщает вам URL-адрес, с которого поступил запрос. Затем вы можете просто проверить, что оно соответствует одному или нескольким ожидаемым значениям, прежде чем делать что-либо. Это не остановит запрос от других URL-адресов, попадающих на службу, но ваш веб-сервис не будет ничего делать в ответ на эти запросы. Вы также можете заблокировать по IP аналогичным образом, используя Request.UserHostAddress. Обратите внимание, что они делают разные вещи. Если пользователь щелкает ссылку на www.apione.com, для реферера будет выбрано значение www.apione.com, но IP будет IP-адресом пользователя. Какой метод вы используете, будет зависеть от того, как используется API. например Если есть какой-нибудь серверный процесс, который запускается с www.apione.com, то реферер не сильно поможет. Также реферер может быть легко подделан.

0 голосов
/ 20 ноября 2012

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

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

На страницу

token = get random string, 8 to N characters long,
    hashing if you desire greater security
store token in session

write some html
embed the code in a script tag:
    var api_token = '<? echo code; ?>';

append api_token to all SOAP/JSONP requests
when the request returns, replace api_token with the new token

В службе

read api_token
look for api_token in session
if token does not exist, exit
else, continue ...
generate new token
store token in session
append token to response

Эта базовая стратегия хороша для защиты запросов на обслуживание и проверки щелчков по ссылкам. То есть, вы можете с высокой степенью уверенности убедиться, что delete.aspx? Id = 123 произошел от manage.aspx или чего-то другого, а не от чьей-то ленты FB, Twitter, службы коротких URL-адресов и т. Д. ..

...