Это поведение ajax нормально, с точки зрения безопасности - PullRequest
4 голосов
/ 08 февраля 2011

Кажется, я совершенно не понимаю безопасность ajax, и это не помогает мне получать противоречивые ответы на свои вопросы. Итак, я сделал этот эксперимент.

У меня есть этот код js на site1.com, расположенный по адресу http://site1.com/script.js. На стороне сервера он делает запись в базу данных, но не возвращает никакого вывода. Когда я вызываю эту функцию с site1.com, я вижу, что запись была зарегистрирована в базе данных, как и ожидалось.

function enterdb(){
  $.ajax({
    async: false,
    url: 'http://site1.com/test?format=json',
    type: 'POST',
    data: { input: '1' },
    success: function(resp) {
       alert(resp);
    }
  });
}

Я скопировал тот же js в js-файл othersite.com, который теперь расположен в http://othersite.com/script.js, чтобы самому проверить, войдет ли он в базу данных. Это не очень хорошо, потому что я не хочу, чтобы люди играли мои Ajax-URL из других внешних скриптов. Но это противоречит некоторым ответам, которые я прочитал в моих предыдущих цитатах

этот ответ соответствует результату, который я получил

Кросс-домен всегда запрещен, потому что той же политики происхождения.

но тот же ответ также сказал

ваш JavaScript делает XHR, а кто-то подделывает его, они то же самое и невозможно дифференцировать (хотя вы можете определенно усложнит).

Так каков приговор? Моя цель - защитить URL-адреса ajax, чтобы они не использовались внешними сайтами, такими как API, для передачи данных в мою базу данных.

Ответы [ 2 ]

3 голосов
/ 08 февраля 2011

Краткий ответ: Вы не безопасный против упомянутой вами проблемы.

Длинный ответ:

Дано:

  • A - сайт, которым вы управляете
  • B - сайт, который кто-то еще контролирует
  • Чарли - посетитель вашего сайта, имеющий учетные данные

ваш JavaScript делает XHR, а кто-то подделывает его, они одинаковы и их невозможно различить (хотя вы определенно можете сделать это сложнее).

Это означает, что вы не можете отличить Чарли от посещения Aи Чарли вручную создает HTTP-запрос для доступа к URL-адресам, которые вы предоставляете для доступа к JavaScript.

Так какой же вердикт?Моя цель - защитить URL-адреса ajax, чтобы они не использовались внешними сайтами, такими как API, для выгрузки данных в мою базу данных.

Если Чарли заходит на сайт B, то сайт B не может чтение данных с сайта A через браузер Чарли (с учетными данными Чарли).

Сайт B может вызвать запрос на сайт A через браузер Чарли (например, отправив невидимую форму вневидимый iframe с JS), поэтому сайт B может привести к вставке данных.Это Подделка межсайтовых запросов , но есть способы защитить от этого .

1 голос
/ 08 февраля 2011

@ zmol: приятно знать, что вы экспериментировали с моим запросом :) ( Как проверить, отключены ли междоменные запросы )

междоменная политика говорит что-то вроде этого:

ваш домен A обслуживает страницу A, которая может выполнять вызовы ajax.
ajax этого "pageA" может запрашивать ресурсы только у domainA и, возможно, никогда из domainB.

в твоих словах,

если site1.com обслуживает script.js, script.js может общаться и загружать контент только через site1.com, но не через othersite.com.

с другой стороны, если script.js был получен с othersite.com, он не сможет ничего вызывать на site1.com, поскольку сервер отклоняет запрос из-за этой политики.

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

Какие-то путаницы теперь остались? :)

edit - я забыл ответить на ваш вопрос:

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

Невозможно "защитить" URL-адреса ajax, как уже говорили другие, вызовы ajax - это обычные запросы к серверу, но к ним применяется заголовок Origin.
заголовок Origin указывает серверу, доверять ли вызывающей стороне или нет:)

edit - я вижу, что есть способы защиты, такие как предотвращение CSRF ... [я думаю, что это только 1 возможность] Спасибо @David Dorward за то, что указал на это. мой + 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...