Список вопросов
Как зайти в Даркнет?!
25th January, 01:11
4
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
893
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4380
0
Помогите пожалуйста решить задачи
24th November, 23:53
6084
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4395
0
Метода Крамера С++
23rd October, 11:55
4308
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Безопасный кроссдоменный обмен данными между AJAX и PHP
Просмотров: 423
 
Ответов: 6
На одном сервере лежит PHP скрипт, на другом есть сайт, использующий AJAX. Как передавать между ними данные, чтобы гарантировать конфеденциальность и невозможность подделывания (вместо AJAX может быть и Flash, и обычные GET/POST запросы — на сокетах то просто, а нужно вот так вот)?
Единственное, что приходит в голову, это дополнительный скрипт ПХП и сокеты + SSL. Но это не очень удобно (т.к. может использоваться флеш без ПХП). Использование секретных ключей не кажется мне безопасным — флеш или яваскрипт легко стянуть и подстмотреть всю информацию. RSA — в одну сторону отправлю, но в обратную опять же — можно подсмотреть секретный ключ.
Какие есть варианты?
Очевидно что вы плохо понимаете как работает openApi раз пытаетесь все время сравнивать то, что вам нужно, с этой технологией.
Там структура такая: есть браузер клиента, с яваскриптом.
Есть сервер сайта.
Есть сервер вконтакте.
Когда человек хочет авторизоваться на сайте он жмет кнопку «авторизоваться через в контакте». Открывается всплывающее окно со страницей с домена вконтакте, там пользоватлеь вводит email/пароль, данные его (логин и пароль) отправляются серверу контакта. Сервер контакта их проверяет и если все ОК отправляет данные серверу сайта, на котором человек авторизуется. Сервер сайта, приняв эти данные, проверяет их и если все ок авторизует человека.
Т.е. проверка подлинности данных происходит на стороне сервера, а не на стороне яваскрипт.
Хранить ключи в яваскрипте/флеше не вариант и так никто не делает. В любом случае нужен дополнительный скрипт на стороне сервера-клиента, который будет проверять подлинность пришедших от сервера-поставщика услуги данных и уже потом передавать их в браузер (аяксом или еще как то)
Ответ на вопрос выше: как определить что посетитель уже залогинен на сайте-поставщике услуги?
Очень просто, сайт-поставщик услуги ставит клиенту свою куку. сайт-клиент ставит на своей странице iframe в котором грузится спецстраница сайта-поставщика со спец параметром типа from=site-client. Сайт-поставщик услуги получив запрос этой страницы смотрит есть ли у человека его кука и если есть то шлет серверу сайта-клиента необходимые данные, а сайт-клиент уже аяксом шлет данные в браузер пользователя.
Весь обмен данными с точки зрения JS происходит в пределах одного домена: через iframe с сайтом-поставщиком и аяксом с сайтом-клиентом.
Весь кроссдоменный обмен данными (между сайтом-поставщиком и сайтом-клиентом) происходит уже на стороне серверов без участия браузеров клиентов и эти данные невозможно перехватить.
Все зависит от того, можно ли что-либо сделать не client-side, а server-side с сайтом человека, которому представляется услуга. ВКонтакт именно так и работает, если мне не изменяет память.
(Ну если быть полностью точным, то там два набора ключей, один для усложнения жизни тем, кто будет ломать, второй действительно секретный, который знает только серверные части).
Т.е. ситуация меняется, AJAX спрашивает не у вашего сайта, а у сайта, который потом спрашивает ваш (причем делает это либо много раз, либо после первого успеха ставит правильную сессионную куку и т.д.).
Т.е. если человек изменит что-либо на клиентской части, да что угодно, то серверная часть все равно откажется обрабатывать его запросы.
Взаимодействие между сайтом клиента и вашим сайтом может быть по любому протоколу, ведь его пользователь не может подделать.
На примере авторизации:
A — AJAX, S — сайт клиента, U — ваш сайт.
A -> S: авторизируй меня, вот мои данные (хоть сколько раз подделанные)
S -> U: тут кто-то хочет авторизоваться, вот его данные
U -> S: окей, данные нормальные
S -> A: вот тебе сессионная кука, работай дальше
Поскольку в такой схеме у злоумышленника нет контроля над данными между S и U он ничего критичного сделать не сможет.
Заинтересовался вашим вопросом и решил разобраться.
Как оказалось, авторизация вконтакте организована с помощью своего Open API и напоминает openID. Здесь написано о нём.
Собственно, на данный момент могу только помочь советом (почитайте про openID и Open API). В ближайшее время постараюсь сам в этом разобраться и отпишусь сюда, если вопрос будет актуален.
Так похоже все гораздо проще, чем я думал.
Что мешает просто авторизоваться по логину и паролю, стандартными методами?
Ну делается скрипт, который открывает окошко с нашего сайта, дает там авторизоваться, после чего выставляет сесию/куку? А дальше все скрипты уже работают с нашим сайтом имея там нормальную авторизацию…
Или надо обезопасится от кривых запросов на наш сайт? Ну так если запросы посылает клиент, то злоумышленник в итоге сможет послать что угодно, как ты не защищайся, т.е. в этом случае без сервера не обойстись.
Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться